Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin Android-Google Play服务认证和Azure移动服务后端_Xamarin_Azure Mobile Services_Google Authentication - Fatal编程技术网

Xamarin Android-Google Play服务认证和Azure移动服务后端

Xamarin Android-Google Play服务认证和Azure移动服务后端,xamarin,azure-mobile-services,google-authentication,Xamarin,Azure Mobile Services,Google Authentication,我正在使用新的谷歌SDK在android上进行身份验证 下面是我用来获取身份验证令牌的代码 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn) .RequestEmail() .RequestId() .RequestIdToken(serverClie

我正在使用新的谷歌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();
然后在“活动结果”下,我得到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令牌似乎不起作用

只是想让你知道,我已经设置了谷歌项目,还启用了azure门户下的谷歌认证。当我使用服务器流时,google身份验证工作正常。但由于某些原因,此客户端流不起作用。你知道我做错了什么吗????

因为,你需要传递从谷歌返回的
访问令牌,然后使用以下代码对你的移动应用进行身份验证:

var zumoPayload=new JObject();
zumoPayload[“访问令牌”]=“{访问令牌}”;
user=wait this.client.LoginAsync(MobileServiceAuthenticationProvider.Google,zumoPayload);
注意:由于您使用的是客户端身份验证流,您需要独立联系您的身份提供商,您需要检索
访问\u令牌,然后将其传递到azure mobile apps后端,此时,您的移动后端将使用access_令牌向相关rest api发送请求,以获取记录的用户配置文件,然后它将向您的移动客户端发出名为
authenticationToken
的JWT令牌

更新:

我尝试模拟针对azure mobile app发送客户端身份验证流的请求,如下所示:

POST https://{your-app-name}.azurewebsites.net/.auth/login/google
Body {"access_token":"{your-access-token}"}
但我检索到以下错误:

400“id\U令牌”字段是必需的

我确实测试了MSA、Facebook、Google等的客户端身份验证流,但似乎通过Google帐户的客户端身份验证流发生了一些变化。我更改了有效负载,只发送了
id\u令牌
,然后它可以按如下方式工作:

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


通常,您只需要删除
zumoPayload[“authorization\u 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();
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);
然后将IdToken传递给移动Azure服务,如下所示

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)
                                                         .RequestEmail()
                                                          .RequestIdToken("yourClientCode")
                                                          .RequestServerAuthCode("yourClientCode")
                                                         .Build();
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);

谢谢你的回答。你知道如何从谷歌提供商那里获得访问令牌吗?我尝试了以下代码,但GetToken方法似乎已被弃用
var token=GoogleAuthUtil.GetToken(上下文、acct.Account.Name、GOOGLE\u ID\u token\u范围);我做了一些测试,你可以参考细节来解决你的问题。布鲁斯,非常感谢你的帮助。它正在工作!我还必须做一件事——当我试图在OnActivityResult下调用“LoginAsync”时,似乎遇到了线程死锁。为了解决这个问题,我必须这样调用它:user=Task.Run(async()=>{return await client.LoginAsync(authenticationProvider,zumoPayload);})@MS你不需要谷歌的accesstoken,你可以直接使用IdToken。令人困惑的是,facebook sdk返回访问令牌。见下面我的答案