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);