#authorization #b2b #tenant

propelauth

一个用于管理身份验证和授权的Rustcrate,支持多租户/B2B产品,由PropelAuth提供支持

16个重大版本发布

0.16.0 2024年8月9日
0.14.0 2024年6月17日
0.10.0 2024年2月18日
0.9.0 2023年12月18日
0.1.0 2022年12月6日

#67 in 身份验证

Download history 232/week @ 2024-04-28 133/week @ 2024-05-05 261/week @ 2024-05-12 363/week @ 2024-05-19 372/week @ 2024-05-26 364/week @ 2024-06-02 472/week @ 2024-06-09 455/week @ 2024-06-16 214/week @ 2024-06-23 279/week @ 2024-06-30 318/week @ 2024-07-07 161/week @ 2024-07-14 60/week @ 2024-07-21 365/week @ 2024-07-28 300/week @ 2024-08-04 411/week @ 2024-08-11

1,136 每月下载量

MIT 许可证

300KB
6.5K SLoC

PropelAuth

将身份验证和授权添加到您的应用程序中。

此库旨在与PropelAuth账户一起使用。您可以免费注册并开始使用。

初始化

首先,您需要初始化库。您可以通过调用PropelAuth::initPropelAuth::fetch_and_init(这将获取任何未指定的元数据)来初始化。

let auth = PropelAuth::fetch_and_init(AuthOptions {
    auth_url: "REPLACE_ME".to_string(),
    api_key: "REPLACE_ME".to_string(),
}).await.expect("Unable to initialize authentication");

用法/保护API

希望我们添加对另一个框架的支持?请通过[email protected]联系。

Axum

要使用Axum,请确保在Cargo.toml中启用axum功能。

然后,将PropelAuthLayer添加到您的路由器

let auth_layer = PropelAuthLayer::new(auth);

let app = Router::new()
    .route("/whoami", get(whoami))
    .route("/org/:org_name/whoami", get(org_whoami))
    .layer(auth_layer); // <-- here

然后,您可以接受User作为参数,这将查找授权头中的访问令牌

// User will automatically return a 401 (Unauthorized) if a valid access token wasn't provided
async fn whoami(user: User) -> String {
    user.user_id
}

您还可以检查用户所在的哪些组织以及他们具有哪些角色和权限

// If the user isn't in the provided organization, a 403 is returned
async fn org_whoami(user: User,
                    Path(org_name): Path<String>) -> Result<String, UnauthorizedOrForbiddenError> {
    let org = user.validate_org_membership(RequiredOrg::OrgName(&org_name),
                                           UserRequirementsInOrg::IsRole("Admin"))?;
    Ok(format!("You are a {} in {}", org.user_role, org.org_name))
}

您还可以获取完整的auth结构并使用它进行API调用

// Extension(auth) is useful for making API requests
async fn make_req(Extension(auth): Extension<Arc<PropelAuth>>) -> String {
    let magic_link = auth.user().create_magic_link(CreateMagicLinkRequest {
        email: "[email protected]".to_string(),
        ..Default::default()
    }).await.expect("Couldn't create magic link");
    magic_link.url
}

Actix

要使用Actix,请确保在Cargo.toml中启用actix4功能。

将您的PropelAuth添加到您的路由器

let auth = PropelAuth::fetch_and_init(/*...*/)
//...
HttpServer::new(move || {
    App::new()
        .service(whoami)
        .service(org_whoami)
        .app_data(web::Data::new(auth.clone())) // <-- here
})

然后,您可以接受User作为参数,这将查找授权头中的访问令牌

// User will automatically return a 401 (Unauthorized) if a valid access token wasn't provided
#[get("/whoami")]
async fn whoami(user: User) -> impl Responder {
    HttpResponse::Ok().json(user)
}

您还可以检查用户所在的哪些组织以及他们具有哪些角色和权限

// If the user isn't in the provided organization, a 403 is returned
#[get("/org/{org_name}/whoami")]
async fn whoami(user: User, org_name: web::Path<String>) -> Result<impl Responder, UnauthorizedOrForbiddenError> {
   let org = user.validate_org_membership(RequiredOrg::OrgName(&org_name.into_inner()),
                                          UserRequirementsInOrg::IsRole("Admin"))?;
   Ok(HttpResponse::Ok()
       .body(format!("You are a {} in {}", org.user_role, org.org_name)))
}

您还可以获取完整的auth结构并使用它进行API调用

#[post("/magic_link")]
async fn make_req(auth: web::Data<PropelAuth>) -> impl Responder {
    let magic_link = auth.user().create_magic_link(CreateMagicLinkRequest {
        email: "[email protected]".to_string(),
        ..Default::default()
    }).await.expect("Couldn't create magic link");
    HttpResponse::Ok().json(magic_link)
}

使用Rustls而不是OpenSSL

如果您想使用纯Rust TLS实现而不是OpenSSL,请禁用默认功能并启用rustls,如下所示

propelauth = { version >= "0.12.1", features = ["rustls"], default-features = false }

其他

初始化auth后,您可以通过传递授权头(格式为Bearer TOKEN)来验证访问令牌

let result = auth.verify().validate_authorization_header(&authorization_header);
match result {
    Ok(user) => { /* valid access token in the header */ }
    Err(_) => { /* invalid access token, typically we return a 401 Unauthorized here */ }
}

您还可以检查用户所在的哪些组织以及他们具有哪些角色和权限

let org = auth.validate_org_membership(
    &authorization_header,
    RequiredOrg::OrgName("acme"),
    UserRequirementsInOrg::IsRole("Admin")
)?;

// Alternatively, if you already have a user from validate_authorization_header
let org = user.validate_org_membership(
    RequiredOrg::OrgName("acme"),
    UserRequirementsInOrg::IsRole("Admin")
)?;

最后,您可以直接从auth.user()auth.org()进行API调用

访问令牌从哪里来?

它们来自您的前端。您可以在此处了解有关前端集成的更多信息:这里

依赖项

~10–24MB
~468K SLoC