Xamarin Android - Google Play 服务身份验证和 Azure 移动服务后端
Xamarin Android - Google Play service Authentication and Azure mobile service backend
我正在使用新的 google SDK 在 android 上进行身份验证。
这是我用来获取身份验证令牌的代码
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)
.RequestEmail()
.RequestId()
.RequestIdToken(serverClientID)
.RequestServerAuthCode(serverClientID)
.Build();
mGoogleApiClient = new GoogleApiClient.Builder(context)
.AddApi(Auth.GOOGLE_SIGN_IN_API, gso)
.Build();
然后在activity结果下,我得到了id token:
// Signed in successfully, show authenticated UI.
GoogleSignInAccount acct = result.SignInAccount;
var idToken = acct.IdToken;
var authorizationCode = acct.ServerAuthCode
到这一步为止一切正常。
然后我尝试调用 azure 移动客户端进行身份验证。这是代码。我传入了id token和授权码。
var zumoPayload = new JObject();
zumoPayload["id_token"] = idToken;
zumoPayload["authorization_code"] = authorizationCode;
user = await this.client.LoginAsync(MobileServiceAuthenticationProvider.Google, zumoPayload);
此步骤失败。我收到一些未知错误。我传递给 Azure 移动服务的 ID 令牌似乎不起作用。
只是想让你知道我已经设置了 google 项目并且还在 azure 门户下启用了 google 身份验证。当我使用服务器流时,google 身份验证工作正常。但由于某些原因,此客户端流程不起作用。知道我做错了什么吗?????
对于 Client-managed authentication,您需要传递从 google 返回的 access_token
,然后使用以下代码对您的移动应用程序进行身份验证:
var zumoPayload = new JObject();
zumoPayload["access_token"] = "{access_token}";
user = await this.client.LoginAsync(MobileServiceAuthenticationProvider.Google, zumoPayload);
注意:由于您使用的是客户端身份验证流程,您独立联系您的身份提供者,您需要检索access_token
,然后将其传递给您的天蓝色移动应用后端,此时您的移动后端将通过使用 access_token 向相关的 rest api 发送请求以获取已记录的用户配置文件,然后它会发出一个名为 [=14= 的 JWT 令牌] 到您的移动客户端。
更新:
我尝试模拟针对 Azure 移动应用发送请求以进行客户端身份验证的流程如下:
POST https://{your-app-name}.azurewebsites.net/.auth/login/google
Body {"access_token":"{your-access-token}"}
但我检索到以下错误:
400 'id_token' field is required.
我确实测试了MSA,Facebook,Google等的客户端认证流程。但是似乎通过 Google 帐户的客户端身份验证流程发生了一些变化。我更改了有效载荷并发送了 id_token
,然后它可以按如下方式工作:
一般来说,您只需删除 zumoPayload["authorization_code"] = authorizationCode;
,然后您的日志记录就会按预期工作。
我只想在这里加上我的 2 美分。我能够在 Android 上使用 Facebook SDK 和 Google 本地 SDK 实现,然后将它们注册到 Azure 移动服务中。这里的技巧是 Facebook SDK 为您提供实际的访问令牌,但 Google SDK 没有给您,相反,您从 google 获取 IdToken。您需要申请如下
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)
.RequestEmail()
.RequestIdToken("yourClientCode")
.RequestServerAuthCode("yourClientCode")
.Build();
然后将该 IdToken 传递给移动 Azure 服务,如下所示
var zumoPayload = new Newtonsoft.Json.Linq.JObject();
if(provider== MobileServiceAuthenticationProvider.Facebook)
zumoPayload.Add("access_token", accessToken);
if (provider == MobileServiceAuthenticationProvider.Google)
zumoPayload.Add("id_token", accessToken);
var result = await App.Client.LoginAsync(provider, zumoPayload);
我正在使用新的 google SDK 在 android 上进行身份验证。
这是我用来获取身份验证令牌的代码
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)
.RequestEmail()
.RequestId()
.RequestIdToken(serverClientID)
.RequestServerAuthCode(serverClientID)
.Build();
mGoogleApiClient = new GoogleApiClient.Builder(context)
.AddApi(Auth.GOOGLE_SIGN_IN_API, gso)
.Build();
然后在activity结果下,我得到了id token:
// Signed in successfully, show authenticated UI.
GoogleSignInAccount acct = result.SignInAccount;
var idToken = acct.IdToken;
var authorizationCode = acct.ServerAuthCode
到这一步为止一切正常。 然后我尝试调用 azure 移动客户端进行身份验证。这是代码。我传入了id token和授权码。
var zumoPayload = new JObject();
zumoPayload["id_token"] = idToken;
zumoPayload["authorization_code"] = authorizationCode;
user = await this.client.LoginAsync(MobileServiceAuthenticationProvider.Google, zumoPayload);
此步骤失败。我收到一些未知错误。我传递给 Azure 移动服务的 ID 令牌似乎不起作用。
只是想让你知道我已经设置了 google 项目并且还在 azure 门户下启用了 google 身份验证。当我使用服务器流时,google 身份验证工作正常。但由于某些原因,此客户端流程不起作用。知道我做错了什么吗?????
对于 Client-managed authentication,您需要传递从 google 返回的 access_token
,然后使用以下代码对您的移动应用程序进行身份验证:
var zumoPayload = new JObject();
zumoPayload["access_token"] = "{access_token}";
user = await this.client.LoginAsync(MobileServiceAuthenticationProvider.Google, zumoPayload);
注意:由于您使用的是客户端身份验证流程,您独立联系您的身份提供者,您需要检索access_token
,然后将其传递给您的天蓝色移动应用后端,此时您的移动后端将通过使用 access_token 向相关的 rest api 发送请求以获取已记录的用户配置文件,然后它会发出一个名为 [=14= 的 JWT 令牌] 到您的移动客户端。
更新:
我尝试模拟针对 Azure 移动应用发送请求以进行客户端身份验证的流程如下:
POST https://{your-app-name}.azurewebsites.net/.auth/login/google
Body {"access_token":"{your-access-token}"}
但我检索到以下错误:
400 'id_token' field is required.
我确实测试了MSA,Facebook,Google等的客户端认证流程。但是似乎通过 Google 帐户的客户端身份验证流程发生了一些变化。我更改了有效载荷并发送了 id_token
,然后它可以按如下方式工作:
一般来说,您只需删除 zumoPayload["authorization_code"] = authorizationCode;
,然后您的日志记录就会按预期工作。
我只想在这里加上我的 2 美分。我能够在 Android 上使用 Facebook SDK 和 Google 本地 SDK 实现,然后将它们注册到 Azure 移动服务中。这里的技巧是 Facebook SDK 为您提供实际的访问令牌,但 Google SDK 没有给您,相反,您从 google 获取 IdToken。您需要申请如下
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)
.RequestEmail()
.RequestIdToken("yourClientCode")
.RequestServerAuthCode("yourClientCode")
.Build();
然后将该 IdToken 传递给移动 Azure 服务,如下所示
var zumoPayload = new Newtonsoft.Json.Linq.JObject();
if(provider== MobileServiceAuthenticationProvider.Facebook)
zumoPayload.Add("access_token", accessToken);
if (provider == MobileServiceAuthenticationProvider.Google)
zumoPayload.Add("id_token", accessToken);
var result = await App.Client.LoginAsync(provider, zumoPayload);