当前位置: 首页 > 知识库问答 >
问题:

Android Java Firebase身份验证和保存用户[重复]

周飞
2023-03-14

我在注册过程中从用户那里得到了一些信息。我希望每个用户名都是唯一的。我称我的方法如下。

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个答案

高和通
2023-03-14

一个简单的建议是,您可以在设置isMailAuthentiation成功=true之前调用createUserWitEmailAndPassword()函数中的SaveUserToFirebase(newUser)

或者在内部调用该函数

if(! isUsernameTake){

isMailAuthenticationSuccess=createUserWithEmailAndPassword(姓名注册、姓氏注册、用户名注册、电子邮件注册、密码注册)

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();
        }
    });
}

宋畅
2023-03-14

将此方法调用"createUserWitEmailAndPassword",在成功的时候将此方法调用为"check UsernameIsExist",并确保返回类型无效。

 类似资料:
  • 我想知道socket.io身份验证的最佳实践是什么。 Alice发出事件'message',参数包括Bobs、唯一标识符等。Bob在监听Socket.on('message')事件时接收消息。

  • 于是我在这里看到:https://firebase . Google . com/docs/auth/web/account-linking # link-auth-provider-credentials-to-a-user-account现在可以在Firebase中链接用户账号了。我还看到Firebase提供了匿名认证的功能,它为一个用户创建一个用户会话,不需要任何凭证。 在我们的应用程序中,

  • 我已经实现了keycloak用户存储SPI流。它针对外部源进行身份验证。Keycloak是用外部存储属性更新的,如果它在getUserByUsername方法中更新,它就可以工作。 我正在isValid方法中验证userValidation,并更新UserModel和LocalHashMap中的userAttributes。 从日志中,我看到UserStoreProviderFactory创建了两

  • 我的管理员控制器扩展了控制器类,在那里我使用方法加载视图页面并传递保护。config/auth.php也通过添加管理员保护和提供程序进行了修改。在app/Actions/Fortify文件夹中,我添加了AttemptToAuthenticate和ReDirectIfTwoFactorAuthenticate类,并更改了命名空间。我的管理员控制器还扩展了Guard。用户的重定向中间件和管理员的重定向

  • 我一直在寻找使用各种AWS服务来处理我们下一个主要项目的基础设施。我们开始研究EC2实例上的docker容器,但在进一步研究AWS Lambda之后,这似乎是一条值得探索的道路。 使用AWS Lambda范例,我们只需使用Lambda函数作为逻辑粘合剂,将数据和事件(来自其他AWS服务)保存在一起。 例如,如果我们产品的用户创建了一个新记录,AWS Lambda可以在该事件中触发,我们可以调用La

  • 根据Spring Security,如果身份验证由外部身份验证提供者完成,则使用身份验证提供者。认证后,Spring Security将获得封装用户信息的认证对象。 如果Spring Security框架进行身份验证,则用户信息被封装在User接口的实例中(例如作为默认实现的User细节类)。 我的问题是——为什么Spring Security框架不能使用一致的方法?为什么他们不能在所有情况下使用