3个版本
0.3.2 | 2023年12月21日 |
---|---|
0.3.1 | 2023年12月21日 |
0.3.0 | 2023年12月21日 |
#430 in 认证
43KB
368 行
一个用于异步验证Azure JWT令牌的库。是azure-jwt的更新分支
此库将从Microsoft获取公钥并使用这些密钥来验证您提供的令牌的真实性。它默认为您验证和映射Azure Id令牌。
Azure的公钥通过通过open-connect api发送请求来获取。默认情况下,存储的密钥在24小时后过期,并获取新的密钥,因为这些密钥与正常的密钥轮换方案相对应。还有一个默认的重试回退机制,如果密钥(kid)与当前的任何公钥不匹配,将触发一次密钥刷新(限制为每小时一次),以防默认设置与公钥轮换不匹配或Microsoft出于某些原因立即轮换密钥。这两个设置都可以配置。
示例
let client_id = "my client id from Azure";
let mut az_auth = AzureAuth::new(client_id).await.unwrap();
let decoded = az_auth.validate_token(TEST_TOKEN).await?;
性能
在默认配置中创建新的AzureAuth
实例时,它将触发对Microsoft端点的两次调用(一次获取open connect元数据以获取当前的jwks_uri,一次获取jwk集)。您应该谨慎创建这些对象,并优先使用单个实例的引用。如果您在Web服务器上使用它,应避免在每次连接时创建新的实例,而是在服务器启动时实例化一个实例,并使用互斥锁或通道进行验证。密钥加载后,操作应该非常快。
安全
此库验证以下六个方面
- 令牌是由Azure签发且未被篡改的
- 此令牌是为您的应用程序签发的
- 令牌尚未过期
- 令牌在其有效之前未被使用
- 令牌不是在未来签发的
- 令牌头部指定的算法是正确的算法*
- 请注意,我们不会使用令牌头部来为我们设置算法,请参阅这篇文章了解更多关于为什么这样做是错误的信息
验证在失败时将返回Error
,为库用户提供更多粒度以了解为什么令牌被拒绝。
您需要
您需要一个由 Azure 为您的应用程序创建的 私有 client_id,以便能够验证令牌是为您的应用程序创建的(而不是任何拥有有效 Azure 令牌的人都可以登录)。这是库从您那里获取的 ID,以验证令牌是否为您的应用程序签发的。
您将获得一个已验证的、为您解析的令牌。
您仍然需要负责
- 验证用户是否有权访问您的系统
- 验证任何对您的用例重要的其他信息
- 如果您请求有关用户的信息超过了在 Microsoft ID tokens reference 中定义的信息,您需要创建一个映射到令牌中所有字段的 Struct,并使用
custom_validation
方法。
更多信息,请参阅此文章: https://docs.microsoft.com/en-us/azure/active-directory/develop/id-tokens
依赖关系
~13–30MB
~523K SLoC