Per*_*qin 5 google-api google-signin
我在我的应用程序中使用 Google 登录,一旦用户登录并检索到 ID 令牌,我就会将 ID 令牌发送到我的反手服务器。现在,我会将 ID 令牌添加到每个 HTTP 请求的标头中,然后验证它,获取用户 ID 并将数据响应回我的应用程序。我想知道是否可以持久存储 ID 令牌并将其用于所有未来请求。ID 令牌会更改或过期吗?如果是这样,如何获得新的 ID 令牌?除了要求用户重新登录之外,我找不到任何方法。或者我应该只验证一次 ID 令牌并在以后的请求中直接使用 ID?
不要存储 ID 令牌。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
| 归档时间: |
|
| 查看次数: |
1013 次 |
| 最近记录: |