#jwt #public-key #azure #token #validation #jwk

azure_jwt

Microsoft Azure Id tokens 的简单 JWT 验证器

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 身份验证

Download history 285/week @ 2024-04-23 158/week @ 2024-04-30 54/week @ 2024-05-07 145/week @ 2024-05-14 95/week @ 2024-05-21 383/week @ 2024-05-28 169/week @ 2024-06-04 189/week @ 2024-06-11 136/week @ 2024-06-18 92/week @ 2024-06-25 90/week @ 2024-07-02 99/week @ 2024-07-09 210/week @ 2024-07-16 110/week @ 2024-07-23 114/week @ 2024-07-30 112/week @ 2024-08-06

每月 581 次下载

MIT 许可证

40KB
353

用于验证 Azure JWT 令牌的库

Crates.io Chrono on docs.rs

此库将从 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 小时一次)。

安全性

此库验证以下六点

  1. 该令牌是由 Azure 发布的,并且没有被篡改
  2. 该令牌是为您的应用程序发布的
  3. 该令牌尚未过期
  4. 该令牌在有效之前没有被使用
  5. 该令牌不是在未来发布的
  6. 令牌头指定的算法是正确的算法*

验证失败时,将返回 Error,为库用户提供了更多粒度,以便找出令牌被拒绝的原因。

您需要

您需要一个由 Azure 为您的应用程序创建的 私有 client_id 才能验证令牌是为您的应用程序创建的(而不是任何拥有有效 Azure 令牌的人都可以登录)。这是库需要从您那里获取的 ID,用于验证令牌是否为您的应用程序签发。

您将获得一个为您解析的已验证令牌。

您仍需注意

  1. 验证用户是否有权访问您的系统
  2. 验证对您的用例重要的其他任何信息
  3. 如果您请求关于用户的信息超出了Microsoft ID tokens 参考中定义的内容,您需要创建一个映射到令牌中所有字段的 Struct,并使用 custom_validation 方法。

更多信息,请参阅这篇文章:https://docs.microsoft.com/en-us/azure/active-directory/develop/id-tokens

依赖项

~13–26MB
~496K SLoC