12 个版本
0.2.3 | 2024 年 6 月 1 日 |
---|---|
0.2.2 | 2023 年 3 月 21 日 |
0.2.1 | 2021 年 3 月 9 日 |
0.1.7 | 2019 年 4 月 23 日 |
#157 in 身份验证
每月 581 次下载
40KB
353 行
用于验证 Azure JWT 令牌的库
此库将从 Microsoft 获取公钥并使用这些密钥验证您提供的令牌的真实性。默认情况下,它会为您验证并映射 Azure Id 令牌。
我们通过发送请求到 open-connect api 来获取 Azure 的公钥。默认情况下,存储的密钥在 24 小时后过期,并重新获取新的密钥,因为这与正常的密钥轮换方案相匹配。还有一个默认的重试回退,其中不匹配我们当前任何公钥的 kid
将触发 一次 密钥刷新(限制为每小时一次),以防默认设置与公钥轮换不匹配或 Microsoft 出于某种原因立即轮换密钥。这两个设置都可以配置。
示例
use azure_auth_rs::*;
let client_id = "my client id from Azure";
let mut az_auth = AzureAuth::new(client_id).unwrap();
let decoded = az_auth.validate_token(TEST_TOKEN)?;
性能
在默认配置下创建新的 AzureAuth
实例将触发对 Microsoft 端点的两次调用(一次获取 open connect 元数据以获取当前 jwks_uri,一次获取 jwk 集合)。您应该谨慎创建这些对象,并优先使用一个实例的引用。如果您在 Web 服务器上使用它,应避免在每次连接时创建新实例,而是在服务器启动时实例化一个实例,并使用互斥锁或通道进行验证。一旦加载了密钥,操作应该非常快。然而,还需要更多的基准测试来确认这一点,但当前的基准测试表明,在我的 2020 年 Ryzen 3900X 处理器上执行验证需要大约 34 微秒,一旦获取了公钥(如果设置正确,这应该只发生在每 24 小时一次)。
安全性
此库验证以下六点
- 该令牌是由 Azure 发布的,并且没有被篡改
- 该令牌是为您的应用程序发布的
- 该令牌尚未过期
- 该令牌在有效之前没有被使用
- 该令牌不是在未来发布的
- 令牌头指定的算法是正确的算法*
- 请注意,我们不使用令牌头来自动设置算法,请参阅这篇文章以了解更多关于为什么这样做是不好的信息
验证失败时,将返回 Error
,为库用户提供了更多粒度,以便找出令牌被拒绝的原因。
您需要
您需要一个由 Azure 为您的应用程序创建的 私有 client_id 才能验证令牌是为您的应用程序创建的(而不是任何拥有有效 Azure 令牌的人都可以登录)。这是库需要从您那里获取的 ID,用于验证令牌是否为您的应用程序签发。
您将获得一个为您解析的已验证令牌。
您仍需注意
- 验证用户是否有权访问您的系统
- 验证对您的用例重要的其他任何信息
- 如果您请求关于用户的信息超出了Microsoft ID tokens 参考中定义的内容,您需要创建一个映射到令牌中所有字段的 Struct,并使用
custom_validation
方法。
更多信息,请参阅这篇文章:https://docs.microsoft.com/en-us/azure/active-directory/develop/id-tokens
依赖项
~13–26MB
~496K SLoC