3 个不稳定版本

0.2.0 2023年8月31日
0.1.1 2023年6月14日
0.1.0 2023年6月14日

#3#biscuit

Download history 13/week @ 2024-03-08 13/week @ 2024-03-15 12/week @ 2024-03-22 33/week @ 2024-03-29 22/week @ 2024-04-05 8/week @ 2024-04-12 20/week @ 2024-04-19 21/week @ 2024-04-26 7/week @ 2024-05-03 2/week @ 2024-05-10

110 每月下载量

Apache-2.0

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