Google登录使用新的GoogleSignInOptions

时间:2015-11-21 14:12:24

标签: android oauth-2.0 google-play-services google-login google-oauth2

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

有没有人知道是否可以从中获取访问令牌(如前所述),如果是这样的话?任何帮助表示赞赏。

2 个答案:

答案 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