3 个不稳定版本
0.2.0 | 2023年8月31日 |
---|---|
0.1.1 | 2023年6月14日 |
0.1.0 | 2023年6月14日 |
#3 在 #biscuit
110 每月下载量
24KB
285 行
Biscuit actix middleware
此中间件允许在服务范围内提取和解析 biscuit 令牌。
授权本身仍需要在端点处理程序内部处理。
中间件期望通过 载体令牌 HTTP 授权方案(一个 Authorization: Bearer <token>
HTTP 标头)获取 base64 编码的令牌。使用提供的公钥反序列化此令牌并验证其加密签名。
- 没有载体令牌的请求将返回 HTTP
401 未授权
错误; - 解析失败或加密验证失败的令牌请求将返回 HTTP
403 禁止
错误。
令牌提取逻辑和错误处理是可配置的(参见 配置示例)。
工作示例
以下是一个暴露 GET /hello
的网页服务器,只对包含 role("admin")
事实的令牌。用于验证令牌的公钥通过 BISCUIT_PUBLIC_KEY
环境变量提供。
一个完整、可运行的示例可以在 examples/readme.rs
中找到,并且可以通过 BISCUIT_PUBLIC_KEY=<public key> cargo run --example readme
运行。
可选地,您可以通过运行以下命令来启用跟踪:BISCUIT_PUBLIC_KEY=<public key> cargo run --example readme --features tracing
以在控制台中观察中间件跟踪日志。
use actix_web::{get, web, App, HttpResponse, HttpServer};
use biscuit_actix_middleware::BiscuitMiddleware;
use biscuit_auth::{macros::*, Biscuit, PublicKey};
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let public_key = PublicKey::from_bytes_hex(
&std::env::var("BISCUIT_PUBLIC_KEY")
.expect("Missing BISCUIT_PUBLIC_KEY environment variable"),
)
.expect("Couldn't parse public key");
HttpServer::new(move || {
App::new()
.wrap(BiscuitMiddleware::new(public_key))
.service(hello)
})
.bind(("127.0.0.1", 8080))?
.run()
.await
}
#[get("/hello")]
async fn hello(biscuit: web::ReqData<Biscuit>) -> HttpResponse {
let mut authorizer = authorizer!(
r#"
allow if role("admin");
"#
);
authorizer.add_token(&biscuit).unwrap();
if authorizer.authorize().is_err() {
return HttpResponse::Forbidden().finish();
}
HttpResponse::Ok().body("Hello admin!")
}
依赖项
~21–36MB
~614K SLoC