我正在使用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但刷新令牌不存在。任何帮助都会很棒!
答案 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 authentication与Microsoft.Azure.Mobile.Client一起使用,那么您可以利用RefreshUserAsync
来刷新访问令牌,此时您之前的access_token,clientId存储在azure上,而您的移动应用后端将直接与Google的OAuth 2.0端点通信,并为您请求新的访问令牌并更新Azure上的令牌存储。有关App Service中令牌存储的更多详细信息,您可以关注here。