3个版本
0.1.2 | 2024年2月5日 |
---|---|
0.1.1 | 2024年2月5日 |
0.1.0 | 2024年2月5日 |
#244 in 身份验证
每月27次下载
28KB
410 行
Actix-Web openid
轻量级异步OpenID Connect (OIDC) 客户端和中间件,适用于Actix-Web。
支持授权代码流
依赖优秀的 openidconnect-rs Rust库
示例
Cargo.toml
[dependencies]
actix-web-openid = "~0.1.2"
main.rs
use actix_web::{App, get, HttpResponse, HttpServer, Responder};
use actix_web::dev::ServiceRequest;
use actix_web_openidconnect::ActixWebOpenId;
use actix_web_openidconnect::openid_middleware::Authenticated;
#[get("/no_auth/hello")]
async fn unauth() -> impl Responder {
HttpResponse::Ok().body("hello unauth_user")
}
#[get("/is_auth/hello")]
async fn auth(auth_data: Authenticated) -> impl Responder {
HttpResponse::Ok().body(format!("hello auth_user {:?}. email: {:?}", auth_data.access.preferred_username().unwrap(),
auth_data.access.email()))
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
env_logger::init();
let should_auth = |req: &ServiceRequest| {
!req.path().starts_with("/no_auth") && req.method() != actix_web::http::Method::OPTIONS
};
let openid = ActixWebOpenId::init("client_id".to_string(),
"client_secret".to_string(),
"https://127.0.0.1:8081/auth_callback".to_string(),
"https://my-keycloak.com/realms/myrealm".to_string(),
should_auth,
Some("https://127.0.0.1:8081/is_auth/hello".to_string()),
vec!["openid".to_string()]).await;
HttpServer::new(move || App::new()
.wrap(openid.get_middleware())
.configure(openid.configure_open_id())
.service(unauth)
.service(auth)
)
.bind(("0.0.0.0", 8081))?
.run()
.await
}
参数
名称 | 描述 | 示例 | 文档 |
---|---|---|---|
client_id | 在您的OIDC提供者上定义的应用程序的客户端ID | "client_id" | keycloak |
client_secret | 在您的OIDC提供者上定义的应用程序的客户端密钥 | "client_secret" | keycloak |
redirect_url | 在OIDC提供者验证用户后重定向到的URI。路径必须是/auth_callback。通常需要在OIDC提供者上注册 | "https://127.0.0.1:8080/auth_callback" | keycloak |
issuer_url | OIDC提供者的URL | "https://my_keycloak.com/realms/my_realm" | |
should_auth | 接受一个 actix_web::service::ServiceRequest 作为输入并返回布尔值的闭包。如果为true,则请求需要认证。允许您配置哪些端点需要认证 |
|req: &ServiceRequest| { !req.path().starts_with("/no_auth") && !req.method() == actix_web::http::方法::OPTIONS }; |
|
post_logout_redirect_url | 在用户登出后用户将被重定向的URL。通常需要在OIDC提供者上注册 | "https://127.0.0.1:8080" | keycloak |
scopes | 在身份验证过程中使用的范围列表。"openid"范围是openid流程必需的 | [openid, profile, email] | keycloak |
特性
身份验证中间件
添加一个检查用户身份验证信息的中件,并在需要时进行用户认证。
将身份验证信息提供给端点处理器
登录
在需要认证时,自动将用户重定向到OIDC提供者。
在授权代码流的最后打开回调端点(/auth_callback),将用户重定向到该端点,并将访问令牌、刷新令牌、id_token和用户信息存储在cookie中
登出
打开登出端点(/logout)。调用此端点将自动将用户重定向到openID connect登出
前端
通过一个cookie user_info将包含在ID令牌中的用户信息提供给前端
免责声明
元数据
该库期望OIDC提供者在OIDC RFC中定义的内容之外,额外提供1个元数据。
end_session_endpoint
:OIDC提供者的注销端点。(https://openid.net/specs/openid-connect-session-1_0-17.html)此元数据在现代OIDC提供者元数据端点(keycloak,okta,auth0...)中均可用。
访问令牌
目前该库对访问令牌格式不敏感,使用/userinfo端点获取用户信息并验证此令牌。
这主要是因为openidconnect-rs库遵循OIDC RFC,而OIDC RFC没有定义访问令牌格式。
然而,由于JWT(https://datatracker.ietf.org/doc/html/rfc9068)是访问令牌格式的既定标准,因此该库应在未来更新以支持它。
待办事项
- 添加对刷新令牌的支持
- 添加对PKCE的支持
- 添加对JWT访问令牌的支持(https://datatracker.ietf.org/doc/html/rfc9068)
依赖项
~23–36MB
~652K SLoC