#oauth2 #jwt #jose #tower #tower-middleware

aliri_tower

Tower中间件,用于与aliri权威机构交互

7个版本 (破坏性)

0.6.0 2024年4月12日
0.5.0 2023年5月27日
0.4.0 2023年3月2日
0.3.0 2022年11月28日
0.1.1 2022年3月19日

#357认证

Download history 305/week @ 2024-04-28 541/week @ 2024-05-05 372/week @ 2024-05-12 639/week @ 2024-05-19 504/week @ 2024-05-26 506/week @ 2024-06-02 366/week @ 2024-06-09 673/week @ 2024-06-16 553/week @ 2024-06-23 643/week @ 2024-06-30 913/week @ 2024-07-07 511/week @ 2024-07-14 582/week @ 2024-07-21 616/week @ 2024-07-28 463/week @ 2024-08-04 894/week @ 2024-08-11

2,574 每月下载量
用于aliri_axum

MIT/Apache

310KB
6.5K SLoC

Aliri

“访问”的 Esperanto

CI

Aliri是一组crate,旨在帮助构建访问控制,特别是Web API的访问控制,其中令牌是提供访问的主要手段。

功能

aliri crate提供了对JavaScript/JSON对象签名和加密(JOSE)标准的初级支持。有关此标准的RFC的更多信息,请参阅crate的文档

aliri_oauth2 crate提供了一些支持,以确保令牌持有者具有足够的作用域以允许访问。它还提供了一些使用本地或远程JSON Web Key Set(JWKS)作为令牌认证权威的功能。其中一些功能可能作为计划中的OpenID Connect(OIDC)功能的一部分被分离出来。

aliri_actix crate提供了一些用于创建actix-web网络服务器作用域保护器的有用绑定。

类似地,aliri_warp crate提供了对warp网络服务器的绑定,并包括用于验证端点访问的有用过滤器。

aliri标题下的其他crate提供了对这些主要crate的支持性功能。

JSON Web签名(JWS)操作

支持的算法

特性 hmac

  • HS256, HS384, HS512

特性 rsa

  • RS256, RS384, RS512
  • PS256, PS384, PS512

特性 ec

  • ES256, ES384

注意:由于算法在不正确接受时会产生安全漏洞,因此此库明确不支持 none

通过 private-keys 功能提供对私钥的支持,允许进行签名操作和生成新密钥。

由于在以所需 JWK 格式导入和导出生成的密钥方面的限制,使用 openssl 来提取或处理所需的参数。此外,ring 不支持缺少 pqdmp1dmq1iqmp 值的 RSA 私钥。这些参数被强烈推荐,因为它们可以加快签名计算速度,但根据 JWA 规范,它们在技术上为可选。

支持的检查

  • iss 精确字符串匹配
  • aud 精确字符串匹配(列表)
  • sub 正则表达式匹配
  • jti 断言函数
  • nbf 与当前时间比较
  • exp 与当前时间比较
  • iat 最大年龄检查
  • alg 精确匹配(列表)

未来计划

  • 支持 JWE
  • 作为信赖方支持 OpenID Connect
  • 支持获取令牌和令牌管理

替代方案

这一系列 crate 是从我之前使用 jsonwebtoken 中产生的,并扩展以适应实现整个 JOSE 套件的更大目标。进一步的灵感来自 jsonwebtokens,特别是 Verifier 类型。

不安全代码

Aliri 确实使用非常有限的不安全代码。此不安全代码仅限于定义在宏中的一个函数,用于为 StringVec<u8> 值生成强类型包装器。在这里使用不安全是必要的,因为引用类型需要重新解释 &str&MyTypeRef&[u8]&Base64Ref。这种重新解释是安全的,因为围绕 str 的包装器使用 #[repr(transparent)],这意味着包装器与底层切片具有完全相同的表示。

由于上述原因,一些包含的crate使用#![deny(unsafe_code)]而不是#![forbid(unsafe_code)]。代码库中唯一的#![allow(unsafe_code)]可以在typed_string!b64_builder!宏中找到。

我之所以做出这个选择,是因为我更倾向于强类型API而不是字符串类型API。我相信,使用这个库的用户将从这个选择中受益,因为它将帮助他们预防一些愚蠢的错误。

请注意,由于cargo-geiger难以从宏中解析出不安全的使用,这个工具不会将这些crate报告为“放射性”,但可能应该这样做。请务必进行尽职调查。

依赖项

~15–28MB
~517K SLoC