在 android 应用程序中成功注销后 GoogleSignInClient.silentSignIn() 应该失败吗?
Should GoogleSignInClient.silentSignIn() fail after successful signOut in an android app?
在 Android 应用程序中,我按照开发指南登录、silentSignIn 和 [注销] https://developers.google.com/identity/sign-in/android/disconnect google 帐户。登录流程一切正常:首次登录后,应用程序可以成功静默登录并检索用户帐户数据。
我在成功注销后提出了问题:我希望 silentSignIn 应该失败以要求用户再次手动登录。我认为这就是上面 link 中的开发指南“...退出您的应用程序,并完全断开他们的帐户与您的应用程序的连接”的意思。但是,silentSignIn 仍然会成功并且可以检索用户帐户数据(例如:电子邮件、配置文件数据等),就好像用户从未注销一样。我确信 silentSignIn 在撤销访问权限而不是注销后会失败,但是注销是为了什么。
有没有人遇到同样的问题?有人可以就我的问题分享评论和经验吗?提前致谢。
public static GoogleSignInOptions getGSignInOptions(){
return new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
.requestScopes(new Scope(DriveScopes.DRIVE_APPDATA))
.requestEmail()
.requestProfile()
.build();
}
// below code is excerpted from an activity
protected void signInSilently() {
Log.d(TAG, "signInSilently");
try {
GoogleSignInClient gClient = GoogleSignIn.getClient(this, getGSignInOptions());
gClient.silentSignIn().addOnCompleteListener(this,
task -> {
if (task.isSuccessful()) {
mGAccount = task.getResult();
Log.d(TAG, "signInSilently: success on " + mGAccount == null ? "" : mGAccount.getEmail());
}
});
} catch (Exception ex){
Log.e(TAG, "signInSilently: " + ex.getMessage());
handleSignInException(ex);
}
}
protected void signOut() {
Log.d(TAG, "signOut");
GoogleSignInClient gClient = GoogleSignIn.getClient(this, getGSignInOptions());
gClient.signOut().addOnCompleteListener(this,
task -> {
if (task.isSuccessful()) {
mGAccount = null;
Log.d(TAG, "signOut: success");
} else {
handleException(task.getException(), "signOut: failed!");
}
});
}
我看到了一个similar question on Google OAuth for web and a reasonable answer on its signout behavior from the same site and Google docs for developers:注销是为了让用户在不注销Google的情况下注销您的应用而设计的。
因此,应用不应在每次启动时调用 sign-in,甚至 silentSignIn。相反,应用程序应调用 GoogleSignIn.getLastSignedInAccount 来检查用户之前是否已成功登录。如果之前没有登录帐户或 returned 帐户被授予的应用程序所需范围的权限不足,那么是时候尝试 silentSignIn 了。
所以是时候结束我自己的问题了:退出是为了什么?成功注销后,GoogleSignIn.getLastSignedInAccount return 为 null,应用程序可以回退到 sign-in 流。
在 Android 应用程序中,我按照开发指南登录、silentSignIn 和 [注销] https://developers.google.com/identity/sign-in/android/disconnect google 帐户。登录流程一切正常:首次登录后,应用程序可以成功静默登录并检索用户帐户数据。
我在成功注销后提出了问题:我希望 silentSignIn 应该失败以要求用户再次手动登录。我认为这就是上面 link 中的开发指南“...退出您的应用程序,并完全断开他们的帐户与您的应用程序的连接”的意思。但是,silentSignIn 仍然会成功并且可以检索用户帐户数据(例如:电子邮件、配置文件数据等),就好像用户从未注销一样。我确信 silentSignIn 在撤销访问权限而不是注销后会失败,但是注销是为了什么。
有没有人遇到同样的问题?有人可以就我的问题分享评论和经验吗?提前致谢。
public static GoogleSignInOptions getGSignInOptions(){
return new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
.requestScopes(new Scope(DriveScopes.DRIVE_APPDATA))
.requestEmail()
.requestProfile()
.build();
}
// below code is excerpted from an activity
protected void signInSilently() {
Log.d(TAG, "signInSilently");
try {
GoogleSignInClient gClient = GoogleSignIn.getClient(this, getGSignInOptions());
gClient.silentSignIn().addOnCompleteListener(this,
task -> {
if (task.isSuccessful()) {
mGAccount = task.getResult();
Log.d(TAG, "signInSilently: success on " + mGAccount == null ? "" : mGAccount.getEmail());
}
});
} catch (Exception ex){
Log.e(TAG, "signInSilently: " + ex.getMessage());
handleSignInException(ex);
}
}
protected void signOut() {
Log.d(TAG, "signOut");
GoogleSignInClient gClient = GoogleSignIn.getClient(this, getGSignInOptions());
gClient.signOut().addOnCompleteListener(this,
task -> {
if (task.isSuccessful()) {
mGAccount = null;
Log.d(TAG, "signOut: success");
} else {
handleException(task.getException(), "signOut: failed!");
}
});
}
我看到了一个similar question on Google OAuth for web and a reasonable answer on its signout behavior from the same site and Google docs for developers:注销是为了让用户在不注销Google的情况下注销您的应用而设计的。
因此,应用不应在每次启动时调用 sign-in,甚至 silentSignIn。相反,应用程序应调用 GoogleSignIn.getLastSignedInAccount 来检查用户之前是否已成功登录。如果之前没有登录帐户或 returned 帐户被授予的应用程序所需范围的权限不足,那么是时候尝试 silentSignIn 了。
所以是时候结束我自己的问题了:退出是为了什么?成功注销后,GoogleSignIn.getLastSignedInAccount return 为 null,应用程序可以回退到 sign-in 流。