Xamarin Android - Google Play服务身份验证和Azure移动服务后端

时间:2017-10-31 19:40:37

标签: xamarin azure-mobile-services google-authentication

我在Android上使用新的Google SDK进行身份验证。

以下是我用来获取身份验证令牌的代码

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

然后在活动结果下,我获得了id标记:

// Signed in successfully, show authenticated UI.
GoogleSignInAccount acct = result.SignInAccount;

var idToken = acct.IdToken;
var authorizationCode = acct.ServerAuthCode

在此步骤中,一切正常。 然后我尝试调用azure移动客户端进行身份验证。这是代码。我传入了id令牌和授权码。

var zumoPayload = new JObject();
zumoPayload["id_token"] = idToken;
zumoPayload["authorization_code"] = authorizationCode;

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

此步骤失败。我得到一些未知的错误。我传递给azure移动服务的id令牌似乎无效。

只是为了让您知道我已经设置了Google项目,并在azure portal下启用了Google身份验证。当我使用服务器流时,谷歌身份验证工作正常。但由于某些原因,此客户端流程无法正常工作。知道我做错了什么?????

2 个答案:

答案 0 :(得分:2)

对于Client-managed authentication,您需要传递从谷歌返回的access_token,然后使用以下代码对您的移动应用进行身份验证:

var zumoPayload = new JObject();
zumoPayload["access_token"] = "{access_token}";

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

注意:由于您使用的是客户端身份验证流程,因此您需要独立联系您的身份提供商,您需要检索access_token,然后将其传递到您的Azure移动应用后端,这次你的移动后端会通过使用access_token来获取已记录的用户配置文件,向相关的rest api发送请求,然后它会向你的移动客户端发出一个名为authenticationToken的JWT令牌。

<强>更新

我尝试模拟针对客户端身份验证流程发送针对azure移动应用程序的请求,如下所示:

POST https://{your-app-name}.azurewebsites.net/.auth/login/google
Body {"access_token":"{your-access-token}"}

但我检索到以下错误:

  

400&#39; id_token&#39;字段是必需的。

我测试了MSA,Facebook,Google等的客户端身份验证流程。但似乎通过Google帐户更改了客户端身份验证流程。我更改了有效负载并发送了id_token,然后它可以按如下方式工作:

enter image description here

通常,您只需删除zumoPayload["authorization_code"] = authorizationCode;,然后您的日志记录应按预期工作。

答案 1 :(得分:0)

我只想在这里加2美分。我能够在Android上使用Facebook SDK和Google SDK本地实现,然后将其注册到Azure移动服务中。这里的技巧是Facebook SDK为您提供实际访问令牌,但谷歌SDK并没有给你,而是从谷歌获得IdToken。您需要请求如下

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)
                                                         .RequestEmail()
                                                          .RequestIdToken("yourClientCode")
                                                          .RequestServerAuthCode("yourClientCode")
                                                         .Build();

然后将IdToken传递给Mobile Azure Services,如下所示

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