如何在Android上集成Google登录后过期后刷新ID令牌?

Per*_*qin 9 android google-signin googlesigninapi

我已按照https://developers.google.com/上的指南操作,我可以在用户登录后获取已登录用户的Google ID令牌.但我注意到令牌将在1小时后过期.我找不到任何官方参考资料,告诉我如何处理过期的Google ID令牌,因此我只能要求用户再次点击Google登录按钮.

如何在旧版ID令牌过期后刷新有效的Google ID令牌,而不会打扰用户一次又一次地手动登录?

son*_*eff 6

是的,Google ID 令牌的有效期为一小时并且会过期,您只需在您的应用程序中使用silentSignIn即可获得一个新令牌,无需任何用户交互。如果您现有的令牌尚未过期,您将获得(缓存的)版本(OptionalPendingResult返回的将有isDone() == true);如果它已经过期,你会得到一个更新的(但它会花费更长的时间,因此OptionalPendingResult isDone()会false)。

这是示例代码(UI 线程,请参阅下面有关工作线程的注释):

    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.server_client_id))

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();
...

    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");
        GoogleSignInResult result = opr.get();
        handleSignInResult(result);  // result.getSignInAccount().getIdToken(), etc.
    } 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.
        opr.setResultCallback(new ResultCallback<GoogleSignInResult>() {
            @Override
            public void onResult(GoogleSignInResult googleSignInResult) {
                handleSignInResult(googleSignInResult);  // result.getSignInAccount().getIdToken(), etc.
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

请记住是调用silentSignInUI 线程还是工作线程。如果您在工作线程上调用它,请查看带有blockingConnect()+ 的帖子,await()它大大简化了代码: Silent sign in to retrieve token with GoogleApiClient