我的Android应用程序目前使用GoogleAuthUtil登录用户并获取传递给后端的access_token
(下面的代码段显示创建GoogleApiClient并使用GoogleAuthUtil获取令牌)。
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Plus.API)
.addScope(new Scope("profile"))
.build();
...
...
String accessToken = GoogleAuthUtil.getToken(GoogleLoginActivity.this,
Plus.AccountApi.getAccountName(mGoogleApiClient),
"oauth2:profile email");
然后我发送到后端
我现在正试图转移到新的Google SignIn - https://developers.google.com/identity/sign-in/android/sign-in
因此更改了GoogleApiClient创建,如
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestIdToken("<web client id>")
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
然后进行登录使用,
startActivityForResult(Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient), RC_GET_TOKEN);
和活动结果使用(类似于上面链接中的示例),
OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient);
if (opr.isDone()) {
// If the user's cached credentials are valid, the OptionalPendingResult will be "done"
// and the GoogleSignInResult will be available instantly.
Log.d(TAG, "Got cached sign-in");
handleSignInResult(opr.get());
} else {
// If the user has not previously signed in on this device or the sign-in has expired,
// this asynchronous branch will attempt to sign in the user silently. Cross-device
// single sign-on will occur in this branch.
showProgress();
opr.setResultCallback(new ResultCallback<GoogleSignInResult>() {
@Override
public void onResult(GoogleSignInResult googleSignInResult) {
hideProgress();
handleSignInResult(googleSignInResult);
}
});
}
但现在似乎在handleSingInResult(GoogleSignInResult result)
我只能得到id token
result.getSignInAccount().getIdToken();
有没有人知道是否可以从中获取访问令牌(如前所述),如果是这样的话?任何帮助表示赞赏。
答案 0 :(得分:5)
登录后,您将能够获得令牌:
final String token = GoogleAuthUtil.getToken(mAppContext, mAccountName, AUTH_TOKEN_TYPE);
别忘了做Asynctask。有关详细信息,请查看here
修改强>
请注意,尽管方法名称为:
GoogleAuthUtil.getToken()
它不会为您提供OAuth令牌,而是根据documentation返回“短期授权码”。
通过拨打电话获取授权码后我应该怎么做 GoogleAuthUtil.getToken()?
您应该通过HTTPS将授权码传输到后端服务器。只有您的服务器才应该尝试接收访问和/或刷新令牌,而不是在您的应用中。
答案 1 :(得分:2)
所以我遇到了同样的问题。他们现在改变了它,所以令牌在
中出现GoogleSignInAccount acct = result.getSignInAccount();
Log.d(TAG, "handleSignInResult2: "+acct.getIdToken());
要获得此令牌,您也可以在
中提出要求GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail().requestProfile().requestId().requestIdToken(getString(R.string.server_client_ID))
.build();
R.string.server_client_ID
是您在Google开发者控制台中制作的项目的client ID
。
我希望这会对你有所帮助。
这里也是我遵循的文档。 https://developers.google.com/identity/sign-in/android/backend-auth