如何测试 Azure AD 访问令牌过期
Posted
技术标签:
【中文标题】如何测试 Azure AD 访问令牌过期【英文标题】:How can I test Azure AD access token expiration 【发布时间】:2018-07-23 04:25:11 【问题描述】:我正在使用this architecture 创建一个 Outlook 插件。
我正在尝试处理 Azure Active Directory 访问令牌过期的情况。根据the official documentation,token 的生命周期为 1 小时。
所以我正在考虑更改令牌的生命周期,如this question 中所述。但我不能这样做,因为我无权编辑 Azure 策略。另外,我相信有一种更简洁的方法来测试这种情况。
如何测试/调试这个场景?
【问题讨论】:
您要测试流程的哪一部分?使用过期令牌调用 API?让您的程序检测到它已过期并将其交换为刷新令牌?您是否为此使用了库? @ShawnTabrizi 我不想在我的应用程序中创建一个计时器来处理令牌过期问题。因此,我正在尝试使用过期令牌测试调用 Graph API 并检测它是否已过期并将其交换为刷新令牌。在这种情况下,我可以获得正确的过期令牌错误(错误代码和消息),因此我可以通过获取新的访问令牌在我的程序中正确处理它。如果我有任何其他错误,我将向最终用户显示正确的错误消息。我对 AAD 和 Graph API 使用带有 Ajax 调用的纯 javascript 不需要创建定时器。当您获得访问令牌时,有效负载的一部分是expires_in
variable,它会告诉您令牌何时到期。您只需将其存储为会话变量,并在调用之前对其进行检查。
@ShawnTabrizi 这是否意味着无法测试过期令牌场景?访问令牌不可能在 Azure AD 端过期(出于任何原因)吗?所以我的会话变量不再有效。
我并不是说无法测试过期令牌场景,但这取决于您在哪里测试以及测试什么。例如,您不能在过去使用我们的令牌服务生成令牌。您可以调整令牌生命周期,但您提到您无权访问它。无论如何,您都可以连接您的代码以将令牌声明中的时间视为“过期”,然后让您的代码执行。您不能将过期令牌伪造给下游 API,因为它不会由 STS 签名。
【参考方案1】:
每当您的访问令牌过期时,您都可以使用您的刷新令牌来交换新的访问/刷新令牌对。刷新令牌的最长不活动时间为 90 天。 通过在发出请求时在范围参数中指定offline_access,您可以在请求访问令牌时在结果中获取刷新令牌。
curl --location --request POST 'https://login.microsoftonline.com/common/oauth2/v2.0/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=clientid' \
--data-urlencode 'refresh_token=refreshtoken' \
--data-urlencode 'redirect_uri=redirect_uri' \
--data-urlencode 'grant_type=refresh_token' \
--data-urlencode 'client_secret=client_secret'
【讨论】:
以上是关于如何测试 Azure AD 访问令牌过期的主要内容,如果未能解决你的问题,请参考以下文章
带有 AdlsClient 的 Azure MSI:访问令牌已过期