Firebase Auth UI 注销后,如何禁用密码自动登录请求的智能锁?

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)中有一个设置。只需禁用它即可。