我在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身份验证。当我使用服务器流时,谷歌身份验证工作正常。但由于某些原因,此客户端流程无法正常工作。知道我做错了什么?????
答案 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
,然后它可以按如下方式工作:
通常,您只需删除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);