OAuth 授权流程 - 令牌过期

OAuth grant flow - tokens expiration

我正在开发一个使用 Outlook 日历 REST API 的 Android 应用程序。我正在尝试保持同步并更新多个用户(会议室)的日历。

我的问题是:

1) 初始授权码多久后过期?

2) 而对于 刷新令牌 呢?

访问令牌 将在 60 分钟后过期。如果刷新令牌在 6 小时、14 天或 90 天后过期,我无法获取。

3) 后者是可配置的吗?我可以让它永不过期吗?

`

更新:(来自 https://msdn.microsoft.com/en-us/library/azure/dn645542.aspx

"The lifetime of the refresh token is not provided and varies based on policy settings and the time when the authorization code grant is revoked by Azure AD. The application should expect and handle cases when the request for a new access token fails. In that case, it should return to the code that requests a new access token."

还有:(来自 http://blogs.msdn.com/b/exchangedev/archive/2014/03/25/using-oauth2-to-access-calendar-contact-and-mail-api-in-exchange-online-in-office-365.aspx) "Refresh tokens do not have specified lifetimes. Typically, the lifetimes of refresh tokens are relatively long. However, in some cases, refresh tokens expire, are revoked, or lack sufficient privileges for the desired action. The client application needs to expect and handle errors returned by the token issuance endpoint correctly. When you receive a response with a refresh token error, discard the current refresh token and request a new authorization code or access token. In particular, when using a refresh token in the Authorization Code Grant flow, if you receive a response with the interaction_required or invalid_grant error codes, discard the refresh token and request a new authorization code."

那么如何保证我的应用程序始终让所有用户登录?

它将在夜间处于飞行模式,并且它也应该自动从崩溃中恢复。 我可以在不以编程方式存储凭据的情况下对用户进行身份验证的情况下解决吗?

谢谢

答案:

  1. 几分钟。确切的值是一个实现细节,可以随时更改。收到代码后,您应该尽一切努力兑换代码。
  2. 参见 http://www.cloudidentity.com/blog/2015/03/20/azure-ad-token-lifetime/
  3. 从今天起,无法更改生命周期限制。我们正在开发可赋予您更多控制权的功能,但目前我们无法分享预计到达时间

保证用户登录的唯一方法是成功兑换刷新令牌,或通过身份验证流程。缓存凭据的使用仅限于极少数情况,并且在即将推出的服务版本中可能会被禁止。

如果刷新令牌过期,您应该计划执行交互式身份验证。请注意,刷新令牌也可能因同意撤销而失效,这将在所有情况下强制交互。

你能做的就是获得refresh_token和access_token。通过 access_token 访问您需要的内容,如果失败则假设它已过期并使用 refresh_token 更新 access_token。如果用户更改了他们的密码(或者可能有其他情况),那么您从第一步开始重新启动用户。

要获得 refresh_token,我认为您需要将 offline_access 添加到您的范围。像这样:

USER_OAUTH2_AUTHORIZE_URL
    + "?client_id=" + config.getClientId()
    + "&redirect_uri=" + getOutlookLoginRedirect(request)
    + "&response_type=code"
    + "&scope=https%3A%2F%2Foutlook.office.com%2Fmail.send%20" +
             "https%3A%2F%2Foutlook.office.com%2Fmail.readwrite%20" + 
             "offline_access%20openid%20email%20profile"