Xamarin MobileServiceClient RefreshUserAsync与Google 403

时间:2017-09-06 03:35:43

标签: azure xamarin oauth xamarin.auth mobileserviceclient

我正在使用Azure的MobileServiceClient sdk对我的服务器进行身份验证。升级到4.x版本后,我也使用Xamarin.Auth通过Google和Facebook对用户进行身份验证。当响应从Google返回时,我收到刷新令牌。然后我像这样呼叫移动服务sdk:

   var accessToken = account.Properties["access_token"];
                var idToken = account.Properties["id_token"];

                var zumoPayload = new JObject();
                zumoPayload["access_token"] = accessToken;
                zumoPayload["id_token"] = idToken;

                var user = await client.LoginAsync(MobileServiceAuthenticationProvider.Google, zumoPayload, );

这项工作完全没问题。什么不起作用是调用client.RefreshUserAsync()。即使我在登录后立即调用该方法,每次说刷新令牌已过期或不再有效也会抛出403.我没有看到很多使用MobileServiceClient 4.x sdk的例子,但没有一个有如何使用刷新令牌的示例。

我已尝试将其发送到zumo有效负载上,但它不起作用。我已经尝试在Google上使我的用户无效(我正在获取刷新令牌),尝试通过浏览器登录并转到auth / me但刷新令牌不存在。任何帮助都会很棒!

1 个答案:

答案 0 :(得分:1)

AFAIK,您可以利用 Xamarin.Auth SDK独立联系身份提供商并在移动客户端检索访问令牌,然后您需要使用后端登录(天蓝色移动应用)以及用于检索authenticationToken的令牌,您可以利用authenticationToken访问移动应用下的资源。

由于您使用Client-managed authentication,因此要刷新新的access_token,您需要在移动客户端进行此操作。我检查了 Xamarin.Auth ,发现没有请求访问令牌的方法。您需要参考Refreshing an access token并自行实施此功能。我按照OAuth2Authenticator.cs创建了一个扩展方法,用于请求访问令牌,如下所示:

public static class OAuth2AuthenticatorExtensions
{
    public static Task RefreshAccessTokenAsync(this OAuth2Authenticator authenticator, Account account)
    {
        var dics = new Dictionary<string, string>
        {
            {"refresh_token",account.Properties["refresh_token"]},
            {"client_id", authenticator.ClientId},
            {"grant_type", "refresh_token"}
        };
        if (!string.IsNullOrEmpty(authenticator.ClientSecret))
        {
            dics["client_secret"] = authenticator.ClientSecret;
        }
        return authenticator.RequestAccessTokenAsync(dics).ContinueWith(task =>
        {
            if (task.IsFaulted)
            {
                //todo:
            }
            else
            {
                authenticator.OnRetrievedAccountProperties(task.Result);
            }
        });
    }
}

此外,如果您将Server-managed authenticationMicrosoft.Azure.Mobile.Client一起使用,那么您可以利用RefreshUserAsync来刷新访问令牌,此时您之前的access_token,clientId存储在azure上,而您的移动应用后端将直接与Google的OAuth 2.0端点通信,并为您请求新的访问令牌并更新Azure上的令牌存储。有关App Service中令牌存储的更多详细信息,您可以关注here