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

Posted

技术标签:

【中文标题】在 Android 上集成 Google 登录时如何在 ID 令牌过期后刷新?【英文标题】:How to refresh ID token after it expires when integrating Google sign-in on Android? 【发布时间】:2016-12-08 18:53:35 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

这里是sample code(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.
            
        );
    

请记住,您是在 UI 线程还是工作线程上调用 silentSignIn。如果您在工作线程上调用它,请使用blockingConnect() + await() 查看这篇文章,这大大简化了代码: Silent sign in to retrieve token with GoogleApiClient

【讨论】:

以上是关于在 Android 上集成 Google 登录时如何在 ID 令牌过期后刷新?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Google Chrome 或 Safari 在 Mac 上集成 Windows Auth (NTLM)

在 NativeScript App 上集成 Android 服务

Python Oauth2 - 使用 Google 登录

Python Oauth2 - 使用 Google 登录

如何在我的 Android 应用程序中集成 google+ 登录?

如何在设备上集成导航器应用程序