Android Java Firebase身份验证和保存用户

时间:2020-07-09 11:08:48

标签: java android google-cloud-firestore firebase-authentication

我在注册过程中从用户那里获得了一些信息。我想将每个用户名注册为唯一。我的方法如下。

if(!nameRegister.isEmpty() && !surnameRegister.isEmpty()
                        && !usernameRegister.isEmpty() && !emailRegister.isEmpty()
                        && !passwordRegister.isEmpty() && !passwordConfirmRegister.isEmpty()){
                if (passwordRegister.equals(passwordConfirmRegister)) {

                    isUsernameTaken = checkUsernameIsExist(nameRegister, surnameRegister, usernameRegister, emailRegister, passwordRegister);

                    if(!isUsernameTaken)
                        isMailAuthenticationSuccess = createUserWithEmailAndPassword(nameRegister, surnameRegister, usernameRegister, emailRegister, passwordRegister);

                }else{
                    passwordConfirm.setError("Passwords does not match.");
                    passwordConfirm.requestFocus();
                }

                if(isMailAuthenticationSuccess)
                    saveUserToFirebase(newUser);

            }

其内容如下。

private boolean checkUsernameIsExist(final String nameRegister, final String surnameRegister, final String usernameRegister, final String emailRegister, final String passwordRegister) {

    FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
    DocumentReference docIdRef = rootRef.collection("users").document(usernameRegister);
    docIdRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful()) {
                DocumentSnapshot document = task.getResult();
                if (document.exists()) {
                    isUsernameTaken = true;
                    Log.d(TAG, "Document exists!");
                    Toast.makeText(Register.this, "User name already taken", Toast.LENGTH_LONG).show();
                } else {
                    Log.d(TAG, "Document does not exist!");
                    Toast.makeText(Register.this, "User can be taken", Toast.LENGTH_LONG).show();
                }
            } else {
                Log.d(TAG, "Failed with: ", task.getException());
            }
        }
    });
    return isUsernameTaken;
}

private boolean createUserWithEmailAndPassword(final String nameRegister, final String surnameRegister, final String usernameRegister, final String emailRegister, String passwordRegister) {

    auth.createUserWithEmailAndPassword(emailRegister, passwordRegister)
            .addOnCompleteListener(Register.this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if(!task.isSuccessful()){
                        email.setError("Mail is already taken");
                        email.requestFocus();
                    }else{
                        newUser = new User(nameRegister, surnameRegister, usernameRegister, emailRegister);
                        isMailAuthenticationSuccess  = true;
                        auth.signOut();
                        startActivity(new Intent(Register.this, Login.class));
                        finish();
                    }
                }
            });
    return  isMailAuthenticationSuccess;

}

private static void saveUserToFirebase(User newUser) {

        FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
        firebaseFirestore.collection("users").document(newUser.getUsername())
                .set(newUser)
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.d(TAG, "User add success.");
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.w(TAG, "user can not be added.", e);
                    }
                });
    }

方法无法将真实的布尔值添加到我的变量中。我认为,在分配值给我的布尔值之前,addOnCompleteListener并没有结束。

但是,如果可以在控制用户名之后获得用户名,则用户身份验证成功,但不会写入Firebase。这可能是什么原因?我正在等待您的帮助。

2 个答案:

答案 0 :(得分:0)

在此方法“ checkUsernameIsExist”的onSuccess中将此方法称为“ createUserWithEmailAndPassword”,并确保您的返回类型为空。

答案 1 :(得分:0)

一个简单的建议是,在设置saveUserToFirebase(newUser)之前,您需要在createUserWithEmailAndPassword()函数内调用isMailAuthenticationSuccess = true;

或在内部调用该函数

if(!isUsernameTaken){

isMailAuthenticationSuccess = createUserWithEmailAndPassword(nameRegister, surnameRegister, usernameRegister, emailRegister, passwordRegister);

if(isMailAuthenticationSuccess) saveUserToFirebase(newUser); }

那可能会解决您的问题。

或者您可以尝试以下代码

if(!nameRegister.isEmpty() && !surnameRegister.isEmpty() && !usernameRegister.isEmpty() && !emailRegister.isEmpty() && !passwordRegister.isEmpty() && !passwordConfirmRegister.isEmpty()){
    if (passwordRegister.equals(passwordConfirmRegister)) {
        checkUsernameIsExist(nameRegister, surnameRegister, usernameRegister, emailRegister, passwordRegister);
    }else{
        passwordConfirm.setError("Passwords does not match.");
        passwordConfirm.requestFocus();
    }
}


//checkUsernameIsExist
private void checkUsernameIsExist(final String nameRegister, final String surnameRegister, final String usernameRegister, final String emailRegister, final String passwordRegister) {
    FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
    DocumentReference docIdRef = rootRef.collection("users").document(usernameRegister);
    docIdRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {
                isUsernameTaken = true;
                Log.d(TAG, "Document exists!");
                Toast.makeText(Register.this, "User name already taken", Toast.LENGTH_LONG).show();
            } else {
                Log.d(TAG, "Document does not exist!");
                Toast.makeText(Register.this, "User can be taken", Toast.LENGTH_LONG).show();
                createUserWithEmailAndPassword(nameRegister, surnameRegister, usernameRegister, emailRegister, passwordRegister);
            }
        } else {
        Log.d(TAG, "Failed with: ", task.getException());
        }
        }
    });
}
// createUserWithEmailAndPassword
private void createUserWithEmailAndPassword(final String nameRegister, final String surnameRegister, final String usernameRegister, final String emailRegister, String passwordRegister) {
    auth.createUserWithEmailAndPassword(emailRegister, passwordRegister)
    .addOnCompleteListener(Register.this, new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if(!task.isSuccessful()){
                email.setError("Mail is already taken");
                email.requestFocus();
            }else{
                newUser = new User(nameRegister, surnameRegister, usernameRegister, emailRegister);
                saveUserToFirebase(newUser);
                isMailAuthenticationSuccess  = true;
                auth.signOut();
                startActivity(new Intent(Register.this, Login.class));
                finish();
            }
        }
    });
}

private static void saveUserToFirebase(User newUser) {
    FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
    firebaseFirestore.collection("users").document(newUser.getUsername())
    .set(newUser)
    .addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            Log.d(TAG, "User add success.");
            Toast.makeText(Register.this, "User added successfully", Toast.LENGTH_LONG).show();
        }
    })
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Log.w(TAG, "user can not be added.", e);
            Toast.makeText(Register.this, "Couldn't add User. Try again later.", Toast.LENGTH_LONG).show();
        }
    });
}