在 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 服务