0

我正在使用 Azure 的 MobileServiceClient sdk 对我的服务器进行身份验证。随着升级到 4.x 版本,我还使用 Xamarin.Auth 通过 Google 和 Facebook 对用户进行身份验证。当响应从谷歌返回时,我得到了一个刷新令牌。然后我像这样调用移动服务 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,但刷新令牌不存在。任何帮助都会很棒!

4

1 回答 1

1

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

由于您使用的是客户端管理的身份验证,因此要刷新新的 access_token,您需要在移动客户端执行此操作。我检查了Xamarin.Auth,发现没有请求访问令牌的方法。您需要参考刷新访问令牌并自行实现此功能。我遵循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);
            }
        });
    }
}

此外,如果您通过Microsoft.Azure.Mobile.Client使用服务器管理的身份验证,那么您可以利用刷新访问令牌,此时您之前的 access_token、clientId 存储在 azure 上,并且您的移动应用后端将直接与Google 的 OAuth 2.0 端点并为您请求新的访问令牌并更新 Azure 上的令牌存储。有关 App Service 中令牌存储的更多详细信息,您可以关注此处RefreshUserAsync

于 2017-09-06T06:21:55.520 回答