请求Azure App Service身份验证刷新令牌

时间:2016-03-29 16:05:02

标签: azure authentication azure-web-sites

我很难使用移动应用程序让刷新令牌适用于Azure App Service中的某些身份验证提供程序。 CGillum已经写了一篇很棒的帖子(http://cgillum.tech/2016/03/07/app-service-token-store/),在关注该帖子后,我得到了刷新方法,就像微软账号的魅力一样,但我很难为Facebook和谷歌刷新访问令牌。我们的应用程序(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确定

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

  

2016-03-29T14:53:14 PID [5536]详细收到请求:获取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;
    }

1 个答案:

答案 0 :(得分:0)

App Service中不支持Facebook的令牌刷新。然而,令牌持续60天,因此对此功能的需求较少,因为您可以要求用户每60天以交互方式登录一次(并且在大多数情况下它应立即成功)。

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

编辑: 关于Google,看起来您的查询字符串可能有误。尝试 access_type =离线。看起来您正在指定 access_mode =离线,这是不正确的。