请求 Azure 应用服务身份验证刷新令牌

Posted

技术标签:

【中文标题】请求 Azure 应用服务身份验证刷新令牌【英文标题】:Requesting Azure App Service authentication refresh tokens 【发布时间】:2016-07-17 07:30:44 【问题描述】:

我很难使用移动应用程序让刷新令牌适用于 Azure 应用程序服务中的某些身份验证提供程序。 CGillum 对此写了一篇很棒的帖子 (http://cgillum.tech/2016/03/07/app-service-token-store/),在关注该帖子时,我得到了刷新方法,就像 Microsoft 帐户的魅力一样,但我很难刷新 Facebook 和 Google 的访问令牌。我们的应用程序(Xamarin Forms)使用 Microsoft Account、Google 和 Facebook 作为身份验证提供程序。根据您在帖子中的说明,它就像 Microsoft 帐户的魅力一样。

对于 Google,在 LoginAsync 中设置 access_mode=offline 时,我仍然无法刷新我的访问令牌,并且在来自 Azure 的流式日志中出现错误,指出问题所在,但我不明白该怎么做。对于 Facebook,我在日志中遇到了同样的错误,但我不知道如何请求离线访问,所以这里的问题更多是“我如何为 Facebook 请求离线访问”。

错误如下: 使用 Google 登录会呈现以下日志条目(删除了一些细节......)

2016-03-29T14:45:12 PID[5536] 详细接收请求:GET https://nnn.azurewebsites.net/.auth/login/google?access_mode=offline 2016-03-29T14:45:12 PID[5536] 信息重定向:https://accounts.google.com/o/oauth2/v2/auth?response_type............ 2016-03-29T14:45:38 PID [5536] 详细接收请求:GET https://nnn.azurewebsites.net/.auth/login/google/callback?state=nonce%3Dfd....... 2016-03-29T14:45:38 PID [5536] 详细调用外部 HTTP 端点 POST https://www.googleapis.com/oauth2/v4/token。 2016-03-29T14:45:38 PID [5536] 'nnn@nnn.com' 的信息登录已完成。提供者:“谷歌”。 2016-03-29T14:45:38 PID [5536] 为站点“nnn.azurewebsites.net”详细编写“AppServiceAuthSession”cookie。长度:664。 2016-03-29T14:45:38 PID[5536] 信息重定向:https://nnn.azurewebsites.net/.auth/login/done#token=%7B%22authenticationToken%22%3A %22eyJ0e........ 2016-03-29T14:45:39 PID [5536] 详细接收请求:GET https://nnn.azurewebsites.net/.auth/login/done 2016-03-29T14:45:39 PID[5536] 信息发送响应:200.0 OK

然后在尝试调用刷新方法时,日志中会写入以下内容:

2016-03-29T14:53:14 PID[5536] 详细接收请求:GET https://nnn.azurewebsites.net/.auth/refresh 2016-03-29T14:53:14 PID [5536] 详细 JWT 验证成功。主题:'sid:cc7e265f97060b2b067367d1ee02d808',发行人: 'https://nnn.azurewebsites.net/'。 2016-03-29T14:53:14 PID[5536] 警告 sid:cc7e265f97060b2b067367d1ee02d808 (SID: 37776b6cabedf8ff38df56de2e5db739) 失败,因为在令牌存储中找不到刷新令牌。 2016-03-29T14:53:14 PID[5536] 信息发送响应:400.80 错误请求

令牌存储已为服务启用,非常适合 Microsoft 帐户。有没有人知道出了什么问题以及如何使用 Google 去刷新访问令牌?

如何为 Facebook 启用刷新令牌?

用于刷新访问令牌并因此在上面的 Azure 日志中生成输出的代码是:

    public async Task<bool> RefreshAccessToken()
    
        // http://cgillum.tech/2016/03/07/app-service-token-store/
        // Calling /.auth/refresh will update the tokens in the token store
        // and will also return a new mobile authentication token.
        JObject refreshJson = (JObject)await App.m_azureMSClient.InvokeApiAsync("/.auth/refresh", HttpMethod.Get, null);

        string newToken = refreshJson["authenticationToken"].Value<string>();
        App.m_azureMSClient.CurrentUser.MobileServiceAuthenticationToken = newToken;
        App.Current.Properties[App.m_propNameAuthToken] = newToken; // persist it

        return true;
    

【问题讨论】:

您能添加您正在使用的代码吗?谢谢! 我建议提出两个单独的问题,而不是将它们合并为一个:一个用于获取 Google 刷新令牌,另一个用于是否可以刷新 Facebook 令牌。 我在使用 Microsoft 帐户的服务中遇到了同样的错误。客户端/aad/服务是否需要任何特殊配置才能启用刷新令牌? 对于 Microsoft 帐户(不是 AAD),您需要在 Azure 移动应用(或您拥有的应用类型)的 Microsoft 帐户身份验证设置中启用 wl.offline_access 范围,此设置将启用刷新令牌。 【参考方案1】:

应用服务不支持 Facebook 的令牌刷新。但是,令牌的有效期为 60 天,因此不需要此功能,因为您可以要求用户每 60 天以交互方式登录一次(并且在大多数情况下应该立即成功)。

如果您强烈需要能够刷新 Facebook 令牌,您还有另一个选择是使用 Facebook SDK,它会自动为您处理刷新。更多信息在这里:https://developers.facebook.com/docs/facebook-login/access-tokens/expiration-and-extension。在这种情况下,您可以使用移动应用的非交互式登录(也称为客户端登录)再次登录,以便获取最新的身份验证令牌以调用您的 API。

编辑: 关于谷歌,看起来您的查询字符串可能是错误的。试试 access_type=offline。您似乎在指定 access_mode=offline,这是不正确的。

【讨论】:

对于 Facebook,这是可以的。解决方法是避免为使用 Facebook 进行身份验证的用户调用 /.auth/refresh。对于谷歌,我尝试登录两次(连续两次调用 LoginAsync 以及登录/注销/登录)但我仍然没有让 /.auth/refresh 工作,它总是无法抛出异常(如在原始帖子中描述)。 哦,我认为问题是查询字符串参数名称错误。它应该是 access_type=offline。不是 access_mode=offline。 靶心!!那个错字是罪魁祸首。感谢您的帮助 CGillum。

以上是关于请求 Azure 应用服务身份验证刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core 3.1 API 中的刷新令牌 Azure 广告身份验证

使用刷新令牌 adal azure AD 静默更新访问令牌

在刷新身份验证令牌时处理多个未经授权的请求

ASP.NET Core 中基于令牌的身份验证(刷新)

身份服务器刷新令牌资源所有者密码凭证流

azure 应用服务身份验证令牌验证