这是我们在 MS 社区论坛上发布的问题的副本,因为它没有引起太多关注。
该流程之前已经通过其他几个注册进行了测试,并且对于我们所有的租户都运行良好,除了这个特定的租户(尝试了该租户的多个应用程序注册,所有注册都有相同的问题)。租户没有自定义令牌生命周期。
用于颁发令牌的端点是:
https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token
(单租户应用程序注册)
该流程使用来自 id 令牌的数据,需要首先验证该数据。 流行的 NodeJS 包用于验证令牌。问题是token总是验证失败。这是由于令牌的生命周期和过期时间,由令牌负载中的
iat
和 exp
属性表示。
例如,具有如下有效负载的令牌:
{
...,
"iat": 1695209618,
"nbf": 1695209618,
"exp": 1695209918,
...,
"auth_time": 1695209915,
...}
这些值的问题在于,该令牌是在
1695209915
处请求的,这几乎是 iat
之后 5 分钟。因此,问题的第一部分是端点总是发出一个几乎 5 分钟前的令牌。问题的第二部分是,当令牌到达服务器时,它总是已经过期。因此,除非您忽略令牌过期,否则它永远无法被验证。仅供参考,上面示例中的令牌是由
1695209919
收到的,正好是在它过期之后。回顾一下奇怪的时刻:
iat
始终在auth_time之前
到目前为止我们已经尝试过:
因此尝试使用以下查询创建注意:如果相同的流程适用于所有租户,但不适用于一个租户,则可能是配置设置错误或某些策略在租户中被覆盖。
自定义令牌生命周期:
POST https://graph.microsoft.com/v1.0/policies/tokenLifetimePolicies
Content-type: application/json
{
"definition": [
"{\"TokenLifetimePolicy\":{\"Version\":1,\"AccessTokenLifetime\":\"8:00:00\"}}"
],
"displayName": "Contoso token lifetime policy",
"isOrganizationDefault": true
}
对于
sample,我将令牌生命周期设置为 8 小时,并使用以下参数生成 访问令牌:
https://login.microsoftonline.com/TenantID/oauth2/v2.0/token
client_id:ClientID
scope:https://graph.microsoft.com/.default
code:code
redirect_uri:https://jwt.ms
grant_type:authorization_code
client_secret:ClientSecret
生成的访问令牌的生命周期为 8 小时。
如果问题仍然存在,请检查以下内容:
5 分钟的时钟偏差 AzureAD/microsoft-authentication-library-for-js · GitHub