Xamarin Android-Google Play服务认证和Azure移动服务后端
我正在使用新的谷歌SDK在android上进行身份验证 下面是我用来获取身份验证令牌的代码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
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返回访问令牌。见下面我的答案