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 身份验证
1,136 每月下载量
300KB
6.5K SLoC
PropelAuth
将身份验证和授权添加到您的应用程序中。
此库旨在与PropelAuth账户一起使用。您可以免费注册并开始使用。
初始化
首先,您需要初始化库。您可以通过调用PropelAuth::init
或PropelAuth::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