0Pricing
Learn Rust Coding · 课时

身份验证与授权

实现安全的用户身份验证(例如 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 服务中,授权通常由中间件处理。中间件是在主路由处理程序之前运行的代码。

中间件会执行以下操作:

  1. 提取已通过身份验证的用户身份(例如从 JWT 中提取)。
  2. 将用户的角色或权限与请求端点所需的访问权限进行检查。
  3. 如果用户获得授权,则允许请求继续;否则返回“未授权”或“禁止访问”错误。

这样可以让路由处理程序保持简洁,并专注于业务逻辑。

检验您的知识

下面快速检查您对身份验证和授权的理解。

回顾:保护 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 Actix-web/Rocket 构建 REST API
  2. 数据库集成(SQLx/Diesel)
  3. 身份验证与授权
← 返回 Learn Rust Coding