【问题标题】:Firebase Auth cannot sign out using AndroidFirebase Auth 无法使用 Android 退出
【发布时间】:2016-11-06 16:27:52
【问题描述】:

我对 Android 和 firebase 完全陌生,当我尝试从 Firebase 退出时遇到了一些问题。

我的一段代码在底部..

在 onAuthStateChanged 监听器中,我尝试创建一个 Firebase 用户并获取当前用户,以检查它是否不为空(根据 Firebase 文档,这意味着用户已登录)或空,这意味着用户不是登录..

那么问题来了..

出于测试/好奇的目的,如果用户已登录,我会尝试更新用户个人资料并设置自定义显示名称.. 看看会发生什么。

似乎在更新配置文件之后,更具体地说是该行 “user.updateProfile(profileUpdates);”破坏了 signout() 函数。

如果我注释掉“user.updateProfile(profileUpdates);”这一行signout() 函数似乎工作正常!

你能指出我做错了什么吗?

某处是否存在 firebase 用户的重复实例?

提前致谢!

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private FirebaseAuth FireAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private FirebaseDatabase mFireDatabase;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    FireAuth = FirebaseAuth.getInstance();

    mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

            FirebaseUser user = firebaseAuth.getCurrentUser();

            if (user != null) {
                // already signed in
                UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                        .setDisplayName("SuperMan").build();
                user.updateProfile(profileUpdates); // This breaks it!
                signoutButton.setText(user.getDisplayName().toString());

            } else {
                // not signed in

            }

        }
    };

}

public void signin(String email, String password){

   FireAuth.signInWithEmailAndPassword(email,password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            Log.d("myTEST","signInWithEmailAndPassword:complete:"+task.isSuccessful());
        }
    });
}
private void signout(){
    //FireAuth.getInstance().signOut();
    FireAuth.signOut();

}

public void getDisplayName(){

    if (FireAuth.getCurrentUser() !=null){
        UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                .setDisplayName("SuperMan").build();

        FireAuth.getCurrentUser().updateProfile(profileUpdates);
        signoutButton.setText(FireAuth.getCurrentUser().getUid().toString());
        if(FireAuth.getCurrentUser().isAnonymous()){
            signoutButton.setText("Anonymous");
        }

    }else{
        signoutButton.setText("empty..");
    }
}


@Override
public void onStart() {
    super.onStart();
    FireAuth.addAuthStateListener(mAuthListener);
}

@Override
public void onStop(){
    super.onStop();
    FireAuth.removeAuthStateListener(mAuthListener);
}


@Override
public void onClick(View v){
    switch (v.getId()){
        case R.id.signinButton:
            signin(loginEditText.getText().toString(),passwordEditText.getText().toString());
        break;
        case R.id.signoutButton:
            signout();
        break;
        case R.id.button3:
            getDisplayName();
            break;

    }

}}

【问题讨论】:

    标签: android firebase firebase-authentication


    【解决方案1】:

    一些观察可以解释您所看到的行为。

    首先,FirebaseUser.updateProfile() 可能需要往返 Firebase 服务器并异步完成。您可以添加带有Log 消息的完成侦听器以了解这一点:

    UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
            .setDisplayName("SuperMan").build();
    user.updateProfile(profileUpdates)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            Log.d(TAG, "onComplete: " + user.getDisplayName());
        }
    });
    Log.d(TAG, "Profile change requested");
    

    其次,更改用户配置文件似乎会导致AuthStateListener 触发,这将导致您的代码循环。添加一些Log 语句将确认这种情况正在发生。我怀疑循环干扰了注销处理。

    【讨论】:

    • 调用 FirebaseAuth.signOut() 时似乎触发了 FirebaseAuth.AuthStateListener()。是不是应该在 FirebaseAuth.signOut() 成功或错误完成后触发 FirebaseAuth.AuthStateListener() ?如果成功完成,意味着用户现在已注销,则不应点击更新用户配置文件的代码,因为它位于 IF 块内 if (user != null) {...} 我错过了什么吗?
    • 您是否更改了代码以消除在onAuthStateChanged() 内部调用updateProfile() 导致的死循环?
    • 不.. 我怎样才能防止这种情况?我会尝试添加您建议的侦听器,但我不知道这会有什么帮助。我会尽快回复结果!
    • 所以..是的,它是异步触发的..但这并不能帮助我理解为什么在某些时候用户没有变为空..是因为它恢复了会话吗?我在另一个stackoverflow帖子中发现有人提到有一个错误导致authstatechange侦听器被触发两次或多次而不是一次..我不知道这是否会以某种方式影响..到目前为止,我刚刚删除了更新用户配置文件代码侦听器并将其移动到我稍后在侦听器之外调用的单独函数..(仍然对此行为不满意)
    猜你喜欢
    • 2019-07-11
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    相关资源
    最近更新 更多