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服务器
每月下载量 159
在 actix-error-mapper-middle… 中使用
55KB
864 行
actix-jwt-auth-middleware
此crate基于 jwt-compact
crate构建,为actix-web
框架提供jwt身份验证中间件。
jwt实现支持通过access
和refresh
令牌撤销令牌。
它提供了多种加密签名和验证算法,如HS256
、HS384
、HS512
、EdDSA
和ES256
。关于这方面的更多信息,请参阅Supported algorithms
部分jwt-compact
crate。
功能
- 自定义jwt声明的简单使用
- 自动提取自定义声明
- 从
query
参数、HTTP
头部、Authorization
头部和cookies
中提取令牌 - 仅验证模式(仅公开密钥)
- 自动续订
access
令牌(非常可定制) - 设置
access
和refresh
令牌过期时间的简单方法 - 简单的
UseJWT
trait用于保护App
或Scope
(Resource
目前处于实验性阶段 #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