#jwt #actix-web-middleware #actix-web #middleware #web #authentication #web-framework

actix-jwt-auth-middleware

此crate实现了为actix-web框架提供的JSON Webtoken (JWT)中间件

6个版本 (3个破坏性更新)

0.5.0 2024年3月27日
0.3.0 2023年3月14日
0.2.0 2022年12月11日
0.1.2 2022年7月16日
0.1.1 2022年6月1日

#163 in HTTP服务器

Download history 31/week @ 2024-04-08 49/week @ 2024-04-15 43/week @ 2024-04-22 22/week @ 2024-04-29 17/week @ 2024-05-06 10/week @ 2024-05-13 80/week @ 2024-05-20 21/week @ 2024-05-27 56/week @ 2024-06-03 54/week @ 2024-06-10 28/week @ 2024-06-17 21/week @ 2024-06-24 22/week @ 2024-07-08 66/week @ 2024-07-15 70/week @ 2024-07-22

每月下载量 159
actix-error-mapper-middle… 中使用

MIT 许可证

55KB
864

actix-jwt-auth-middleware

此crate基于 jwt-compact crate构建,为actix-web 框架提供jwt身份验证中间件。

jwt实现支持通过accessrefresh令牌撤销令牌。

它提供了多种加密签名和验证算法,如HS256HS384HS512EdDSAES256。关于这方面的更多信息,请参阅Supported algorithms部分jwt-compact crate。

功能

  • 自定义jwt声明的简单使用
  • 自动提取自定义声明
  • query参数、HTTP头部、Authorization头部和cookies中提取令牌
  • 仅验证模式(仅公开密钥)
  • 自动续订access令牌(非常可定制)
  • 设置accessrefresh令牌过期时间的简单方法
  • 简单的UseJWT trait用于保护AppScopeResource目前处于实验性阶段 #91611
  • 具有访问应用程序状态的刷新授权函数

自动提取声明

此软件包与actix-web生态系统紧密结合,这使得从有效的令牌中自动提取jwt声明变得容易。

#[derive(Serialize, Deserialize, Clone, FromRequest)]
struct UserClaims {
    id: u32,
    role: Role,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
enum Role {
    Admin,
    RegularUser,
}
#[get("/hello")]
async fn hello(user_claims: UserClaims) -> impl Responder {
    format!(
        "Hello user with id: {}, i see you are a {:?}!",
            user_claims.id, user_claims.role
    )
}

为此,您自定义的声明类型必须实现FromRequest特质,或者它必须使用实现此特质的宏进行注解#[derive(actix-jwt-auth-middleware::FromRequest)]

简单示例

#[derive(Serialize, Deserialize, Clone, Debug, FromRequest)]
struct User {
    id: u32,
}

#[actix_web::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let key_pair = KeyPair::random();

    HttpServer::new(move || {
        let authority = Authority::<User, Ed25519, _, _>::new()
            .refresh_authorizer(|| async move { Ok(()) })
            .token_signer(Some(
                TokenSigner::new()
                    .signing_key(key_pair.secret_key().clone())
                    .algorithm(Ed25519)
                    .build()
                    .expect(""),
            ))
            .verifying_key(key_pair.public_key())
            .build()
            .expect("");

        App::new()
            .service(login)
            .use_jwt(authority, web::scope("").service(hello))
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await?;

    Ok(())
}

#[get("/login")]
async fn login(token_signer: web::Data<TokenSigner<User, Ed25519>>) -> AuthResult<HttpResponse> {
    let user = User { id: 1 };
    Ok(HttpResponse::Ok()
        .cookie(token_signer.create_access_cookie(&user)?)
        .cookie(token_signer.create_refresh_cookie(&user)?)
        .body("You are now logged in"))
}

#[get("/hello")]
async fn hello(user: User) -> impl Responder {
    format!("Hello there, i see your user id is {}.", user.id)
}

更多示例请参考examples目录。

许可证:MIT

依赖项

~17-27MB
~492K SLoC