sza*_*ske 4 firebase firebase-authentication
我正在构建一个单一的活动 Android 应用程序,以尝试遵循 Google 的建议。我正在使用 FirebaseAuth UI 进行身份验证,它显然使用“Smart Lock for Passwords”将凭据保存到您的 Google 帐户中。我的注销功能如下所示:
private fun signOutUser(){
AuthUI.getInstance()
.signOut(this)
.addOnCompleteListener {
Timber.i("Sign out completed")
}
sharedViewModel.setUser(null)
}
Run Code Online (Sandbox Code Playgroud)
但是,一旦注销完成,UI 会立即启动用户登录过程,这意味着使用 Smart Lock for Passwords 会弹出一个对话框。这会阻止用户选择另一个帐户。在 FirebaseAuth UI 的 github 帐户中,Google 提到了这个问题说:
“必须指示 Smart Lock for Passwords 禁用自动登录,以防止自动登录循环阻止用户切换帐户。”
他们建议的代码是:
public void onClick(View v) {
if (v.getId() == R.id.sign_out) {
AuthUI.getInstance()
.signOut(this)
.addOnCompleteListener(new OnCompleteListener<Void>() {
public void onComplete(@NonNull Task<Void> task) {
// user is now signed out
startActivity(new Intent(MyActivity.this, SignInActivity.class));
finish();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
但是由于我只有一项活动,因此我无法进行 startActivity。
所以我的问题是如何防止 Smart Lock for Passwords 在用户注销后尝试重新登录?
如果相关,这是我的其余身份验证代码:
override fun onStart() {
super.onStart()
// Enable Auth listener
startAuthListener()
// If user is not logged in, start the login process
if(!sharedViewModel.isUserAuthenticated()){
startLoginProcess()
}
}
private fun initializeAuthListener() {
mAuthStateListener = FirebaseAuth.AuthStateListener { firebaseAuth ->
if (null != firebaseAuth.currentUser) {
// User is authenticated
// user = firebaseAuth.currentUser
sharedViewModel.setUser(firebaseAuth.currentUser)
//refresh all data by calling getAllCollections, getAllPois
sharedViewModel.refreshLocalCacheData()
} else {
// User is not signed in so kick off FirebaseUI login
startLoginProcess()
}
}
}
private fun startAuthListener(){
authService.addAuthStateListener(mAuthStateListener)
}
private fun startLoginProcess(){
val providers = Arrays.asList(
AuthUI.IdpConfig.EmailBuilder().build(),
AuthUI.IdpConfig.GoogleBuilder().build())
// Create and launch sign-in intent
startActivityForResult(
AuthUI.getInstance()
.createSignInIntentBuilder()
.setAvailableProviders(providers)
.build(),
RC_SIGN_IN)
}
Run Code Online (Sandbox Code Playgroud)
小智 6
如果您不想为 Firebase UI 禁用谷歌智能锁,那么您可以使用
.setIsSmartLockEnabled(boolean)
的财产
AuthUI.getInstance().createSignInIntentBuilder()
例子 :
private final Intent signIn = AuthUI.getInstance()
.createSignInIntentBuilder().setIsSmartLockEnabled(false)
.setAvailableProviders(providers)
.build();
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if (auth.getCurrentUser() != null)
{
//User is already loged in
//show the main page
} else startActivityForResult(signIn, RC_SIGN_IN);
}
Run Code Online (Sandbox Code Playgroud)
在这里,我使用了一个全局变量来存储 Intent,以便在需要时可以重用它。但这并不总是必要的。
这不是解决此问题的正确方法,但禁用智能锁只是禁用用户可能拥有的功能。所以更好的解决方案是使用智能锁。
要在使用智能锁时注销用户,您应该添加:
Credentials.getClient(this).disableAutoSignIn();
到您的注销功能。这将防止智能锁在用户退出后立即重新登录。
小智 0
我也面临这个问题。经过一番尝试和错误后,发现(API 19)Google 设置 -> 密码智能锁或(API 21+)设置 -> 安全 -> 高级可信代理 -> 智能锁(Google)中有一个设置。只需禁用它即可。
| 归档时间: |
|
| 查看次数: |
2029 次 |
| 最近记录: |