#actix-web #openid-connect #oidc #middleware #authorization #web-dev

actix_web_openidconnect

轻量级异步OpenID Connect (OIDC) 客户端和中间件,适用于Actix-Web

3个版本

0.1.2 2024年2月5日
0.1.1 2024年2月5日
0.1.0 2024年2月5日

#244 in 身份验证

每月27次下载

MIT/Apache

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个元数据。

访问令牌

目前该库对访问令牌格式不敏感,使用/userinfo端点获取用户信息并验证此令牌。
这主要是因为openidconnect-rs库遵循OIDC RFC,而OIDC RFC没有定义访问令牌格式。
然而,由于JWT(https://datatracker.ietf.org/doc/html/rfc9068)是访问令牌格式的既定标准,因此该库应在未来更新以支持它。

待办事项

依赖项

~23–36MB
~652K SLoC