JWT Bearer 认证

一行启用

Host::builder().add_authentication().build().run().await?;

自动: 1. 从 `appsettings.json` 读取 `Jwt.Secret` 2. 注册 `jwt_middleware` 3. 注册 `resource_auth_middleware`

配置

{
  "Jwt": {
    "Secret": "your-256-bit-secret-change-in-production"
  }
}

认证流程

sequenceDiagram
    participant Client
    participant JWT as jwt_middleware
    participant Handler

    Client->>JWT: Authorization: Bearer <token>
    JWT->>JWT: 验证签名 + 过期时间
    alt 有效
        JWT->>JWT: ctx.set_claims(JwtClaims)
        JWT->>Handler: 继续处理
    else 无效/缺失
        JWT->>Client: 401 Unauthorized
    end

在 Handler 中访问 Claims

// JwtClaims 实现 IClaims
let claims = ctx.claims().unwrap();
println!("User: {}", claims.subject());
println!("Roles: {:?}", claims.roles());

签发 Token

框架提供 `jwt_secret()` 获取当前密钥(进程级 shim,由 `add_authentication()` 在 build 时初始化;与已弃用的 `global_provider()` 无关):

use jsonwebtoken::{encode, EncodingKey, Header};

let token = encode(
    &Header::default(),
    &claims,
    &EncodingKey::from_secret(jwt_secret().as_bytes()),
)?;

Docbit 的 `LoginHandler` 是完整示例。

小结

`add_authentication()` + `Jwt.Secret` 配置即可启用 JWT 认证,Claims 通过 `IHttpContext` 存取。

下一节:[基于资源的授权](resource-authorization.md)