#jwt #axum #keycloak #oidc #error-response

axum-keycloak-auth

使用Keycloak发出的JWT保护axum路由

8个版本 (4个重大更改)

0.5.0 2024年2月2日
0.4.1 2024年1月30日
0.3.0 2023年12月21日
0.2.0 2023年10月20日
0.1.1 2023年2月27日

#322 in 身份验证

Download history 44/week @ 2024-04-08 13/week @ 2024-04-15 1/week @ 2024-05-06 24/week @ 2024-05-13 66/week @ 2024-05-20 6/week @ 2024-05-27 89/week @ 2024-06-03 72/week @ 2024-06-10 66/week @ 2024-06-17 50/week @ 2024-06-24 46/week @ 2024-07-01 127/week @ 2024-07-08 63/week @ 2024-07-15 157/week @ 2024-07-22

每月393次下载

MIT/Apache

77KB
1K SLoC

axum-keycloak-auth

使用Keycloak发出的JWT保护axum路由。

特性

  • 可以附加到axum路由器的Tower层/服务。
  • 自动OIDC发现
  • 仅转发提供可验证且未过期的JWT的请求。
  • 允许将失败的认证尝试转发给可能使用另一个中间件处理认证的能力。
  • 能够在路由处理函数中访问提取的JWT数据(包括角色、KC uuid等)。
  • 测试以检查一个或多个必需的或禁止的Keycloak领域或客户端角色是否包含在JWT中。
  • 能够在处理程序中访问JWT的原始声明,允许提取自定义属性。
  • 实现IntoResponse的错误类型,提供有关认证失败原因的精确信息。
  • 能够从您的应用程序定义一个自定义角色类型,其中所有角色都会自动解析。

计划

  • 能够提供自定义类型,该类型将解析令牌,以便可以提取非标准JWT声明而无需开销。
  • 允许对AuthError如何转换为响应进行细粒度控制。赋予用户控制权,并允许添加上下文、自行处理。

用法

此库提供KeycloakAuthLayer,这是一个Tower层/服务实现,用于解析和验证JWT。

有关更详细的说明,请参阅文档

enum Role {
    Administrator,
    Unknown(String),
}

pub fn protected_router(instance: KeycloakAuthInstance) -> Router {
    Router::new()
        .route("/protected", get(protected))
        .layer(
             KeycloakAuthLayer::<Role>::builder()
                 .instance(instance)
                 .passthrough_mode(PassthroughMode::Block)
                 .build(),
        )
}

pub async fn protected(Extension(token): Extension<KeycloakToken<Role>>) -> Response {
    expect_role!(&token, Role::Administrator);

    info!("Token payload is {token:#?}");
    (
        StatusCode::OK,
        format!(
            "Hello {name} ({subject}). Your token is valid for another {valid_for} seconds.",
            name = token.extra.profile.preferred_username,
            subject = token.subject,
            valid_for = (token.expires_at - time::OffsetDateTime::now_utc()).whole_seconds()
        ),
    ).into_response()
}

Axum兼容性

axum axum-keycloak-auth
0.6 0.2
0.7 0.3 - 0.5

依赖项

~9–21MB
~344K SLoC