#actix-web #oauth2 #basic-authentication #oauth #openid #actix

actix-web-security

为actix web提供的易于使用的Basic-Auth / OAuth2认证模块

3个版本

0.1.0 2021年5月2日
0.1.0-alpha.22021年2月12日
0.1.0-alpha.12021年2月11日

#766身份验证

MIT/Apache

57KB
915

Actix web安全

为actix web提供的易于使用的Basic-Auth / OAuth2认证模块。

特性

  • 以下认证方案支持的HTTP认证
    • 基本认证
    • Bearer认证
  • OAuth2资源服务器"自动配置"
  • JWK-Downloader验证JWT
  • JWT验证

注意:未经审计和渗透测试

此库提供"原样",不提供任何类型的保证,并且未验证为安全。它既未经过审计以确保在审计中安全,也未经过渗透测试。库是基于知识和信念开发的。检查代码以查找潜在的安全问题或错误以及是否认为代码安全可靠或是否选择不使用它是您的责任。库作为开源提供,根据软件提供的许可证,任何类型的责任均予以排除。

安装

将以下依赖项添加到您的 cargo.toml

actix-web-security = "0.1.0"

以下功能可以启用

  • jwk-loader
    此功能可以激活以从授权服务器下载自定义JWK

    actix-web-security = { version="0.1.0", features = ["jwk-loader"] }
    
  • jwk-default-loader
    此功能可以激活以从授权服务器下载 DefaultJwks

    actix-web-security = { version="0.1.0", features = ["jwk-default-loader"] }
    

这两个功能都需要在系统上安装 openssl。有关如何安装它的文档可以在 此处 找到。

示例

示例应用程序可以在 此处 找到。

用法

具体类型的 UserDetails,BasicUserDetailsService 或 JwtUserDetailsService,

用户详情

UserDetails 是一个标记trait,由用户实体实现。用户实体可以添加到请求扩展中,以将其注入API端点。

#[derive(Clone, Debug)]
pub struct User {
    pub id: i64,
    pub user_id: String,
    pub name: String
}

impl UserDetails for User {}

用户详情服务

必须实现 BasicUserDetailsServiceJwtUserDetailsService trait 之一,以解决给定的凭据 / JWT。

一个 JwtUserDetailsService 的实现可能如下所示

#[derive(Clone)]
pub struct JwtUserDetailsServiceImpl {
    pub(crate) user_repository: Arc<UserRepository>,
}

#[async_trait]
impl JwtUserDetailsService for JwtUserDetailsServiceImpl {
    #[allow(clippy::borrowed_box)]
    async fn find_user(&self, token: &Box<dyn Claims>) -> Option<Box<dyn UserDetails>> {
        match token.downcast_ref::<DefaultJwt>() {
            Some(claims) => {
                let sub = claims.sub.clone().expect("sub expected");
                let found_user = self.user_repository.find_by_user_id(sub.clone()).await;
                match found_user {
                    Ok(user) => match user {
                        Some(u) => Some(Box::new(u)),
                        None => None,
                    },
                    Err(e) => None
                }
            }
            None => None,
        }
    }
}

头部提取器

必须配置 BasicAuthenticationExtractorBearerAuthenticationExtractor 之一。

一个 BasicAuthenticationExtractor 可以像下面这样轻松创建

BasicAuthenticationExtractor::new()

对于 BearerAuthenticationExtractor,必须配置一个或多个 TokenDecoder。如果使用 jwk-default-loader 特性,可以使用 load_default_rsa_jwks 函数自动下载 JWK 并自动实例化令牌解码器。

BearerAuthenticationExtractor::new(load_default_rsa_jwks(auth_server_jwks_url, Algorithm::RS256)?);

端点匹配器

身份验证提取和身份验证可以限制在特定的端点上,也可以应用于所有端点。必须实例化一个 EndpointMatcher。有两种默认实现可供选择:用于保护所有端点的 AllEndpointsMatcher 和用于保护具有精确匹配 URL 的 URS 的 SpecificUrlsMatcher。如果默认实现不适用于特定用例,可以实现自定义版本。

AllUrlMatcher::new()

警告:只有当匹配器覆盖了端点时,端点才会受到保护。

认证提供者

认证提供者是一个抽象,用于执行身份验证。有两种默认实现:BasicAuthenticationProviderJwtAuthenticationProvider。可以编写自定义实现以使用不同的认证机制。

一个 BasicAuthenticationProvider 可以像这样轻松实例化

BasicAuthenticationProvider::new(Box::new(user_details_service))

一个 JwtAuthenticationProvider 可以像这样轻松实例化

JwtAuthenticationProvider::new(Box::new(user_details_service))

提供者管理器

必须配置一个或多个 AuthenticationProvider 来对用户进行认证。它们注册在 ProviderManager 中。

ProviderManager::new(vec![authentication_provider1, authentication_provider2])

中间件

HttpAuthenticationModdleware 是之前所述所有组件的包装器,用于处理实际的身份验证过程。

HttpAuthenticationMiddleware::new(
    ProviderManager::new(vec![
        Box::new(JwtAuthenticationProvider::new(
          Box::new(user_details_service)
        ))
    ]),
    Box::new(authentication_extractor),
    Box::new(endpoint_matcher),
)

可以在 actix 中正常注册中间件

HttpServer::new(move || {
    let cors_middleware = ...;
    let auth_middleware = ...;
    App::new()
        .wrap(auth_middleware)
        .wrap(cors_middleware)
        .service(api::endpoint1)
})
.bind("0.0.0.0:8081")?
.run()
.await?;

更多详细信息可以在示例应用程序存储库中找到 repository

许可证

该项目根据您的要求,许可方式如下

任选其一。

依赖项

~30–44MB
~871K SLoC