如何为用户提供用户名而不是电子邮件登录?

问题描述 投票:0回答:5

我想在我的网络应用程序中使用 Firebase,该应用程序适用于疗养院中的痴呆症患者。他们没有电子邮件或社交网络帐户,因此需要简单的用户名/密码注册/登录。

最简单的方法是什么?从我在文档中看到的,我必须使用自定义身份验证流程,但我没有现有的身份验证服务器。

如果我确实需要这样做,提供令牌的最简单方法是什么? Azure 有 Functions,AWS 有 Lambda,但我在这里看不到 Firebase

firebase-authentication
5个回答
59
投票

您说得对,Firebase Auth 目前不支持用户名/密码登录。

您可以实现自定义提供程序,如此示例所示。这使您可以满足任何自定义要求,但无可否认,比使用内置提供程序更复杂一些。 here 有一个示例,您可以将其用作起点。

无需对另一个后端使用自定义身份验证,您可以采取的解决方法是在 UI 中接受用户名,但在底层逻辑上,在调用函数注册或使用电子邮件登录之前附加“

@yourowndomain.com
”。

因此您将使用电子邮件/密码身份验证,将

<username>
映射到
<username>@yourowndomain.com


14
投票

您可以使用

sign in with custom token

Firebase 允许您使用安全的 JSON Web 令牌 (JWT) 对用户或设备进行身份验证,从而使您可以完全控制身份验证。您在服务器上生成这些令牌,将它们传回客户端设备,然后使用它们通过

signInWithCustomToken()
方法进行身份验证。

  1. 您需要将用户名和密码保存在数据库或rtdb或firestore中
  2. 当用户触摸登录按钮时,客户端会将用户名和密码发送到您的后端。如果用户名和密码正确,则生成自定义令牌并将其发送回客户端
  3. 客户端然后可以使用
    signInWithCustomToken()
    方法从服务器使用自定义令牌登录

更多详细信息可以阅读此文档


13
投票

在末尾添加虚拟域是一种修补,应该避免。 要启用用户名登录,只需按照以下简单步骤操作即可。

注册

注册时请输入用户名、电子邮件和密码。使用普通电子邮件和密码注册用户。成功后,将电子邮件根据 user_id 保存在单独的节点(分支)中。

mButtonSignUp.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(isValid()){
                mProgressBar.setVisibility(View.VISIBLE);
                final String userId = mEditTextUserId.getText().toString();
                final String emailId = mEditTextEmail.getText().toString() ;
                String password = mEditTextPassword.getText().toString() ;
                firebaseRef.createUser(emailId, password, new Firebase.ResultHandler() {
                    @Override
                    public void onSuccess() {
                       firebaseRef.child("user_ids").child(userId).setValue(emailId);
                       Toast.makeText(getBaseContext(),"You are successfully registered ",Toast.LENGTH_SHORT).show();
                       mProgressBar.setVisibility(View.GONE);
                    }

                    @Override
                    public void onError(FirebaseError firebaseError) {
                        mProgressBar.setVisibility(View.GONE);
                        Toast.makeText(getBaseContext(),firebaseError.toString(),Toast.LENGTH_SHORT).show();
                    }
                });

            }
        }
    });

数据库

数据库结构将如下所示

登录

检查用户是否输入了电子邮件或用户 ID。如果是电子邮件 ID,则直接使用它执行登录,否则获取与用户名关联的电子邮件 ID 并执行登录。

    Button buttonLogIn = (Button)findViewById(R.id.button_login);
    buttonLogIn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {             

            mProgressBar.setVisibility(View.VISIBLE);
            String username = mEditTextEmail.getText().toString() ;
            final String password = mEditTextPassWord.getText().toString() ;

          //  Check if it is an email or not
             if(android.util.Patterns.EMAIL_ADDRESS.matcher(username).matches())                 {
                performLogin(username,password);
            }else{
              //get the emailId associated with the username      
        firebaseRef.child("user_ids").child(username)
              .addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if(dataSnapshot!=null){
                            String userEmail =  dataSnapshot.getValue(String.class);
                            performLogin(userEmail,password);
                        }
                    }

                    @Override
                    public void onCancelled(FirebaseError firebaseError) {
                        //Handle Error
                    }
                });
            }

        }
    });

private void performLogin(String emailId, String password) {
    firebaseRef.authWithPassword(emailId,password, new Firebase.AuthResultHandler() {
        @Override
        public void onAuthenticated(AuthData authData) {
            uid = authData.getUid() ;
            Toast.makeText(getBaseContext(), authData.toString(), Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onAuthenticationError(FirebaseError firebaseError) {
            Toast.makeText(getBaseContext(), firebaseError.toString(), Toast.LENGTH_SHORT).show();
        }
    });
}

3
投票

您也可以使用阿方索的解决方案。如果您需要真实的电子邮件,您可以在用户注册时为电子邮件设置一个文本字段,您可以将其保存在数据库中并可以使用它。


0
投票

我无法找到 Firebase 对此的支持。 但是,执行以下操作将解决您的问题。

注册


 private void clickListener() {
     registerbtn.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View view) {
             String email = emailEdit.getText().toString();
             String pass = passwordEdit.getText().toString();

             if (email.isEmpty()) {
             emailEdit.setError("Lutfen Kullanici Adinizi Giriniz.");
             return;
             }
             if (pass.isEmpty()) {
             passwordEdit.setError("Lütfen Parolanizi Giriniz.");
             return;
             }
             email=email+"@gmail.com";
             createAccount(email,pass);
         }
     });

 }

 private void createAccount(String email, String pass){
     auth.createUserWithEmailAndPassword(email, pass)
             .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                 @Override
                 public void onComplete(@NonNull Task<AuthResult> task) {
                     if (task.isSuccessful()){
                         FirebaseUser user=auth.getCurrentUser();
                         updateUi(user,pass);

                     }
                     else{

                         Toast.makeText(MainActivity.this, "Error: "+
                                 task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                     }
                 }
             });
 }

这样我们就可以将短语“@gmail.com”添加到电子邮件中。

email=email+"@gmail.com";

我们以“abdulkerim”为例。即使用户输入短语“abdulkerim”,我们也会得到一个用户名而不是电子邮件,这要归功于我们添加到末尾的“@gmail.com”。

database view

© www.soinside.com 2019 - 2024. All rights reserved.