Keluar dari Firebase tidak dilakukan

Saya menggunakan Firebase Authentication untuk suatu Aplikasi dan saya mengalami masalah.

Metode Firebase FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password) memasukkan pengguna secara otomatis. Tapi saya tidak menginginkan ini karena saya memerlukan verifikasi email sebelum login.

Jadi saya menerapkan keluar ketika saya menyelesaikan alur pendaftaran saya. Anda dapat menemukan kode saya di bawah.

Masalah saya adalah ketika saya kembali ke LoginActivity dari SignUpActivity, FirebaseAuthStateListener dari LoginActivity mendeteksi pengguna dan beralih ke MainActivity yang merupakan sesuatu yang tidak saya inginkan.

Adakah yang pernah mengalami masalah yang sama?

Saat ini saya menggunakan bendera untuk memperbaikinya, tapi saya tidak menyukainya sama sekali. Saya tidak mengerti mengapa FirebaseAuth mengembalikan pengguna non-null setelah saya keluar.

Terima kasih sebelumnya,

Adrian.

LoginActivity.java

public class LoginActivity extends AppCompatActivity {

    // Firebase stuff
    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;

    // Facebook stuff
    private CallbackManager mCallbackManager;
    private Button mLoginButton;

    // Views stuff
    private LoginButton mLoginFbButton;
    private EditText mEmailTextField;
    private EditText mPasswordTextField;
    private ProgressDialog mProgressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_login);
        viewsSetup();
        firebaseSetUp();
    }

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

    @Override
    public void onPause() {
        super.onPause();
        if(mAuthListener != null)mAuth.removeAuthStateListener(mAuthListener);
    }

    @Override
    public void onResume() {
        super.onResume();
        mAuth.addAuthStateListener(mAuthListener);
    }

    @Override
    public void onStop() {
        super.onStop();
        if (mAuthListener != null) {
            mAuth.removeAuthStateListener(mAuthListener);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_SIGNUP) {
            if (resultCode == RESULT_OK) {
                Toast.makeText(getBaseContext(), getString(R.string.you_can_login), Toast.LENGTH_LONG).show();
            }
        }
        onResume();
        super.onActivityResult(requestCode, resultCode, data);
        mCallbackManager.onActivityResult(requestCode, resultCode, data);
    }

    private void firebaseSetUp() {
        mAuth = FirebaseAuth.getInstance();
        // Will be notified on login success
        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null && !mFromSignup) {
                    // Login success is handled here and should not be handled anywhere else.
                    mLoginButton.setEnabled(true);

                    // Stop the progress dialog
                    mProgressDialog.dismiss();

                    toMainActivity();                     
                }
            }
        };
    }

private void signIn(AuthCredential credential) {

    // pops up the progress dialog
    mProgressDialog = ProgressDialog.show(this, getString(R.string.signing_in), null, true);

    // Will be notified when sign in request finish
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {

                    // Do not handle authentification success here, on complete
                    // this will notify the Authentification Listener

                    if (!task.isSuccessful()) {
                        Log.w(TAG, "signInWithCredential", task.getException());
                        Toast.makeText(LoginActivity.this, getString(R.string.login_failed_message),
                                Toast.LENGTH_SHORT).show();
                        mProgressDialog.dismiss();
                        mLoginButton.setEnabled(true);
                    }
                }
            });
}

    private void viewsSetup() {
        mEmailTextField = (EditText) findViewById(R.id.email);
        mPasswordTextField = (EditText) findViewById(R.id.password);

        mLoginButton = (Button) findViewById(R.id.login_button);
        mLoginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                loginButtonPressed();
            }
        });

        TextView mSignUp = (TextView) findViewById(R.id.create_an_account);
        mSignUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), SignUpActivity.class);
                onPause();
                startActivityForResult(intent, REQUEST_SIGNUP);
            }
        });
        mProgressDialog = new ProgressDialog(this);
    }

    private void loginButtonPressed() {

        Log.d(TAG, "Login");

        if (!textFieldsFormatValid()) {
            Toast.makeText(LoginActivity.this, getString(R.string.check_text_fields),
                    Toast.LENGTH_SHORT).show();
            return;
        }

        View view = getCurrentFocus();
        if (view != null) {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }

        mLoginButton.setEnabled(false);

        String email = mEmailTextField.getText().toString();
        String password = mPasswordTextField.getText().toString();

        signIn();
    }

    private boolean textFieldsFormatValid() {
        boolean valid = true;

        String email = mEmailTextField.getText().toString();
        String password = mPasswordTextField.getText().toString();

        if (email.isEmpty() || !Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
            mEmailTextField.setError(getString(R.string.ask_valid_email));
            valid = false;
        } else {
            mEmailTextField.setError(null);
        }

        if (password.isEmpty()) {
            mPasswordTextField.setError(getString(R.string.required_field_msg));
            valid = false;
        } else {
            mPasswordTextField.setError(null);
        }

        return valid;
    }

    private void toMainActivity() {

        // Go to main activity
        startActivity(new Intent(LoginActivity.this, MainActivity.class));

        // Destroy activity to free memory we won't need it anymore until logout
        finish();
    }

}

SignUpActivity.java

public class SignUpActivity extends AppCompatActivity {


    // Used to determine when user finished signing up
    private boolean mFinished = false;

    // Firebase stuff
    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;

    // Views stuff
    private EditText mEmail;
    private EditText mPassword;
    private EditText mPasswordConfirm;
    private EditText mFullname;
    private Button mSignUpButton;
    private ProgressDialog mProgressDialog;

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

        firebaseSetup();
        viewsSetup();
    }

    @Override
    public void onDestroy() {
        super.onStop();
        if(mAuthListener != null) mAuth.removeAuthStateListener(mAuthListener);
    }

    private void signUp() {
        mProgressDialog = ProgressDialog.show(this, getString(R.string.signing_up), null, true);

        if (!textFieldsFormatValid()) {
            Toast.makeText(getBaseContext(), getString(R.string.check_text_fields), Toast.LENGTH_LONG).show();
            return;
        }

        mSignUpButton.setEnabled(false);

        final String email = mEmail.getText().toString();
        final String password = mPassword.getText().toString();

        mAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(SignUpActivity.this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {

                        // Do not handle authentification success here, on complete
                        // this will notify the Authentification Listener

                        if(!task.isSuccessful()) {
                            Toast.makeText(getBaseContext(), getString(R.string.signup_fail), Toast.LENGTH_LONG).show();
                            mSignUpButton.setEnabled(true);
                            mProgressDialog.dismiss();
                        } else {
                            mFinished = true;
                        }
                    }
                });
    }

    private void firebaseSetup() {
        mAuth = FirebaseAuth.getInstance();
        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull final FirebaseAuth firebaseAuth) {
                final FirebaseUser user = firebaseAuth.getCurrentUser();
                if(user != null && !mFinished) {
                    UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                            .setDisplayName(mFullname.getText().toString())
                            .build();

                    user.updateProfile(profileUpdates).addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            firebaseAuth.signOut();
                        }
                    });
                } else if (mFinished){
                    // Wait for logout here
                    firebaseAuth.removeAuthStateListener(this);
                    mSignUpButton.setEnabled(true);
                    mProgressDialog.dismiss();
                    setResult(RESULT_OK, null);
                    finish();
                }
            }
        };
        mAuth.addAuthStateListener(mAuthListener);
    }

    private void viewsSetup() {
        mEmail = (EditText) findViewById(R.id.email);
        mPassword = (EditText) findViewById(R.id.password);
        mPasswordConfirm = (EditText) findViewById(R.id.password_confirm);
        mFullname = (EditText) findViewById(R.id.full_name);
        mSignUpButton = (Button) findViewById(R.id.signup_button);
        TextView mLoginLink = (TextView) findViewById(R.id.to_login);

        mSignUpButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                signUpButtonPressed();
            }
        });

        mLoginLink.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
        mProgressDialog = new ProgressDialog(this);
    }

    private void signUpButtonPressed() {
        View view = getCurrentFocus();
        if (view != null) {
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
        if(!textFieldsFormatValid()) {
            Toast.makeText(this, R.string.toast_signup_failed, Toast.LENGTH_SHORT);
            return;
        }
        signUp();
    }


    private boolean textFieldsFormatValid() {
        boolean valid = true;

        String email = mEmail.getText().toString();
        String password = mPassword.getText().toString();
        String password2 = mPasswordConfirm.getText().toString();

        if (email.isEmpty() || !Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
            mEmail.setError(getString(R.string.ask_valid_email));
            valid = false;
        } else {
            mEmail.setError(null);
        }

        if (password.isEmpty() || password.length() < 6 || password.length() > 10) {
            mPassword.setError(getString(R.string.password_err_msg));
            valid = false;
        } else {
            mPassword.setError(null);
        }

        if (password2.isEmpty() || password2.length() < 6 || password2.length() > 10) {
            mPasswordConfirm.setError(getString(R.string.password_err_msg));
            valid = false;
        } else if (!password2.equals(password)) {
            mPasswordConfirm.setError(getString(R.string.match_passwords));
            valid = false;
        } else {
            mPasswordConfirm.setError(null);
        }

        return valid;
    }
}

person alamit    schedule 31.10.2016    source sumber
comment
Ini mungkin tidak signifikan terhadap masalah Anda, tetapi SignUpActivity.onDestroy() harus memanggil super.onDestroy(), bukan super.onStop().   -  person Bob Snyder    schedule 01.11.2016
comment
Uupss, saya tidak melihat ini, terima kasih!   -  person alamit    schedule 01.11.2016
comment
Coba hapus authStateListener dari metode onStart Anda   -  person Rosário Pereira Fernandes    schedule 01.02.2017


Jawaban (1)


Jika seseorang menghadapi masalah yang sama sekali, inilah cara saya menyelesaikannya:

Masalahnya berasal dari kenyataan saya memanggil firebaseAuth.signOut() dari tugas asinkron (setelah selesai user.updateProfile(profile)). Dan saya membuat kesalahan saat menulis else if(mFinished) dan tidak memeriksa apakah user == null.

Hal ini menyebabkan beberapa kasus di mana saya kembali ke LoginActivity tanpa keluar.

person alamit    schedule 11.02.2017