身份验证与授权
实现安全的用户身份验证(例如 JWT)和授权机制,以保护 Web 服务端点。
身份验证与授权 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 3 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 3 节课。
保护您的 Web 服务
欢迎!本课将深入学习 身份验证和授权,这是使用 Rust 构建安全 Web 服务的关键概念。
您将学习如何保护 API 端点,确保只有合法用户才能访问,并且只能执行其拥有相应权限的操作。
身份验证与授权
这两个术语听起来相似,但含义不同:
- 身份验证:验证您是谁。这就像进入建筑物时出示您的 ID。
- 授权:确定您可以执行哪些操作。进入建筑物后,它决定您可以进入哪些房间。
我们将同时实现这两者,以保护 Rust Web 服务的安全。
为什么要保护 API?
保护 API 端点非常重要,原因包括:
- 数据隐私:保护敏感的用户数据,防止未经授权的访问。
- 系统完整性:防止恶意行为者修改或破坏您的数据。
- 合规性:满足法律和监管要求(例如 GDPR、HIPAA)。
可靠的安全层能够建立信任,并保护您的应用程序。
JSON Web 令牌(JWT)
现代 Web 服务中一种常用的身份验证方法是使用 JSON Web 令牌(JWT),其读音类似于英文单词 "jot"。
JWT 是一种紧凑且适合在 URL 中安全传输的方式,用于表示在双方之间传递的 Claims。它们通常用于无状态身份验证。
这意味着服务器不需要为每位用户存储会话信息。
JWT 的组成:标头、载荷和签名
JWT 由三个部分组成,各部分之间用点号分隔:
- 标头:包含有关 token 的元数据,例如 token 类型(JWT)和签名算法(例如 HS256)。
- 载荷:包含“Claims”,也就是关于某个实体(通常是用户)的声明及其他数据。
- 签名:用于验证 token 未被篡改。它通过使用密钥对标头和载荷进行编码来创建。
在 Rust 中生成和验证 JWT
下面介绍如何在 Rust 中使用 jsonwebtoken crate 生成并验证 JWT。请记住,您需要将 jsonwebtoken、serde(启用 "derive" 功能)和 chrono(启用 "serde" 功能)添加到 Cargo.toml 中。
此示例会生成一个 token,然后立即对其进行验证。
use jsonwebtoken::{encode, decode, Header, EncodingKey, DecodingKey, Validation};
use serde::{Deserialize, Serialize};
use chrono::{Utc, Duration};
#[derive(Debug, Serialize, Deserialize)]
struct Claims {
sub: String, // Subject (user ID)
company: String,
exp: usize, // Expiration time
}
fn main() {
// --- Setup (requires crates: jsonwebtoken, serde, chrono) ---
let secret_key = "my_super_secret_key";
// --- 1. Generate a JWT ---
let my_claims = Claims {
sub: "user123".to_string(),
company: "CoddyKit".to_string(),
exp: (Utc::now() + Duration::minutes(10)).timestamp() as usize,
};
let token = encode(
&Header::default(),
&my_claims,
&EncodingKey::from_secret(secret_key.as_ref()),
).expect("Failed to encode token");
println!("Generated JWT:\n{}", token);
println!("\n--- Verifying the Token ---");
// --- 2. Verify the JWT ---
let validation = Validation::default();
let decoded_result = decode::<Claims>(
&token,
&DecodingKey::from_secret(secret_key.as_ref()),
&validation,
);
match decoded_result {
Ok(token_data) => {
println!("Token valid!");
println!("Subject: {}", token_data.claims.sub);
println!("Company: {}", token_data.claims.company);
},
Err(err) => println!("Token invalid: {:?}", err),
}
}授权:定义访问权限
用户完成身份验证后(我们知道了用户是谁),授权会决定用户可以访问哪些资源或执行哪些操作。
常见的授权模型包括:
- 基于角色的访问控制(RBAC):为用户分配角色(例如“管理员”“编辑者”“查看者”),每个角色拥有特定权限。
- 基于属性的访问控制(ABAC):根据用户、资源或环境的属性授予访问权限。
授权中间件概念
在 Web 服务中,授权通常由中间件处理。中间件是在主路由处理程序之前运行的代码。
中间件会执行以下操作:
- 提取已通过身份验证的用户身份(例如从 JWT 中提取)。
- 将用户的角色或权限与请求端点所需的访问权限进行检查。
- 如果用户获得授权,则允许请求继续;否则返回“未授权”或“禁止访问”错误。
这样可以让路由处理程序保持简洁,并专注于业务逻辑。
检验您的知识
下面快速检查您对身份验证和授权的理解。
回顾:保护 Web 服务
做得很好!本课介绍了保护 Rust Web 服务所需的基础知识:
- 身份验证(您是谁)与授权(您可以做什么)的区别。
- 保护 API 端点的重要性。
- JSON Web 令牌(JWT)如何用于无状态身份验证,包括其结构。
- 在 Rust 中生成和验证 JWT 的实际示例。
- 基于角色的访问控制的概念,以及中间件如何实现授权检查。
现在,您已经可以构建更加安全可靠的 Rust 应用程序了!
常见问题解答
「身份验证与授权」课时是免费的吗?
是的 — 「身份验证与授权」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 3 节课。
「身份验证与授权」这节课中我会学到什么?
实现安全的用户身份验证(例如 JWT)和授权机制,以保护 Web 服务端点。 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn Rust Coding 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 3 节。
「身份验证与授权」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn Rust Coding 课中编写并运行代码吗?
能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。