ADB2C refresh_token 总是在一天后过期
ADB2C refresh_token always expires in one day
我已经为 adb2c 苦苦挣扎了一段时间。特别是刷新流程。我正在使用最新版本的 msal-browser
并且一切正常,刷新令牌也很好。唯一的问题是令牌端点 returns a refresh_token
总是会在一天后过期。在这种情况下,用户只能登录一天,之后,用户将始终需要重新授权。这是端点的示例以及登录后直接 returns 的内容。(请注意,出于测试目的,我已将 access_token
过期时间设置为 5 分钟)
端点:
https://{b2c_domain.onmicrosoft.com/{b2c_policy}/oauth2/v2.0/token
回复:
{
"access_token": "{access_token_hidden}",
"id_token": "{id_token_hidden}",
"token_type": "Bearer",
"not_before": 1610023338,
"expires_in": 300,
"expires_on": 1610023638,
"resource": "{resource_hidden}",
"client_info": "{client_info}",
"scope": "https://{adb2c_domain_hidden}.onmicrosoft.com/api/user_impersonation",
"refresh_token": "{refresh_token_hidden}",
"refresh_token_expires_in": 86400
}
当应用程序在某个时候尝试刷新令牌时,它将再次调用令牌端点。这是第二个回复的样子:
{
"access_token": "{access_token_hidden}",
"id_token": "{id_token_hidden}",
"token_type": "Bearer",
"not_before": 1610023891,
"expires_in": 300,
"expires_on": 1610024191,
"resource": "{resource_hidden}",
"client_info": "{client_info}",
"scope": "https://{adb2c_domain_hidden}.onmicrosoft.com/api/user_impersonation",
"refresh_token": "{refresh_token_hidden}",
"refresh_token_expires_in": 85846
}
refresh_token_expires_in
没有滚动。但这是可以理解的,用户不应始终保持登录状态。但是,在我的 adb2c 策略中,以下设置处于活动状态:
我假设,正如我在设置中配置的那样,刷新令牌应该至少处于活动状态 14 天。如果没有,甚至长达 90 天?我可以玩这些设置,但它总是会给我一个持续 1 天的 refresh_token。有没有人对此有任何经验或有可能的解决方案?谢谢!
是的,如你所想,lifetime of the refresh token can be up to 90 days. If you need to configure the lifetime of the refresh token, you should use powershell to create a token lifetime policy, and then assign the policy to your service principal to set the token lifetime. See: here。
更新:
刚才用Azure AD B2C portal把refresh token的生命周期设置为14天,然后用ROPC user flow测试了一下,结果确实生效了。我得到的刷新令牌是 14 天。
因此,请确保您为刷新令牌设置生命周期的用户流是您正在使用的用户流,这一点非常重要!
对了,你的端点是错误的,应该是:
https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/{b2c_policy}/oauth2/v2.0/token
2.
3.
如果您使用的是 Msal 浏览器,它在 SPA 应用程序中使用 PKCE 实现了 代码授权。对于这种情况,您将获得 24 小时到期且不会滚动的刷新令牌。 24 小时后,您需要转到 azure ad 的 /authorization 端点以获取新的访问和刷新令牌。如果浏览器具有有效的登录会话,这也可以是非交互式流程。
在Msal-browser 库中,如果您配置的会话超过24 小时,那么您可以使用ssoSilent() 执行静默登录,它需要您发送login_hint。
我已经为 adb2c 苦苦挣扎了一段时间。特别是刷新流程。我正在使用最新版本的 msal-browser
并且一切正常,刷新令牌也很好。唯一的问题是令牌端点 returns a refresh_token
总是会在一天后过期。在这种情况下,用户只能登录一天,之后,用户将始终需要重新授权。这是端点的示例以及登录后直接 returns 的内容。(请注意,出于测试目的,我已将 access_token
过期时间设置为 5 分钟)
端点:
https://{b2c_domain.onmicrosoft.com/{b2c_policy}/oauth2/v2.0/token
回复:
{
"access_token": "{access_token_hidden}",
"id_token": "{id_token_hidden}",
"token_type": "Bearer",
"not_before": 1610023338,
"expires_in": 300,
"expires_on": 1610023638,
"resource": "{resource_hidden}",
"client_info": "{client_info}",
"scope": "https://{adb2c_domain_hidden}.onmicrosoft.com/api/user_impersonation",
"refresh_token": "{refresh_token_hidden}",
"refresh_token_expires_in": 86400
}
当应用程序在某个时候尝试刷新令牌时,它将再次调用令牌端点。这是第二个回复的样子:
{
"access_token": "{access_token_hidden}",
"id_token": "{id_token_hidden}",
"token_type": "Bearer",
"not_before": 1610023891,
"expires_in": 300,
"expires_on": 1610024191,
"resource": "{resource_hidden}",
"client_info": "{client_info}",
"scope": "https://{adb2c_domain_hidden}.onmicrosoft.com/api/user_impersonation",
"refresh_token": "{refresh_token_hidden}",
"refresh_token_expires_in": 85846
}
refresh_token_expires_in
没有滚动。但这是可以理解的,用户不应始终保持登录状态。但是,在我的 adb2c 策略中,以下设置处于活动状态:
我假设,正如我在设置中配置的那样,刷新令牌应该至少处于活动状态 14 天。如果没有,甚至长达 90 天?我可以玩这些设置,但它总是会给我一个持续 1 天的 refresh_token。有没有人对此有任何经验或有可能的解决方案?谢谢!
是的,如你所想,lifetime of the refresh token can be up to 90 days. If you need to configure the lifetime of the refresh token, you should use powershell to create a token lifetime policy, and then assign the policy to your service principal to set the token lifetime. See: here。
更新:
刚才用Azure AD B2C portal把refresh token的生命周期设置为14天,然后用ROPC user flow测试了一下,结果确实生效了。我得到的刷新令牌是 14 天。
因此,请确保您为刷新令牌设置生命周期的用户流是您正在使用的用户流,这一点非常重要!
对了,你的端点是错误的,应该是:
https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/{b2c_policy}/oauth2/v2.0/token
2.
3.
如果您使用的是 Msal 浏览器,它在 SPA 应用程序中使用 PKCE 实现了 代码授权。对于这种情况,您将获得 24 小时到期且不会滚动的刷新令牌。 24 小时后,您需要转到 azure ad 的 /authorization 端点以获取新的访问和刷新令牌。如果浏览器具有有效的登录会话,这也可以是非交互式流程。
在Msal-browser 库中,如果您配置的会话超过24 小时,那么您可以使用ssoSilent() 执行静默登录,它需要您发送login_hint。