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

Ste*_*Lee 24 firebase-authentication

我想将Firebase用于我的网络应用程序,该应用程序适用于护理院患有痴呆症的人.他们没有电子邮件或社交网络帐户,因此需要一个简单的用户名/密码注册/登录.

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

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

Alf*_*nas 15

您是正确的,此时Firebase Auth本身不支持用户名/密码登录.

您可以采用不需要将自定义身份验证与其他后端一起使用的解决方法是接受UI中的用户名,但在基础逻辑上,@yourowndomain.com在调用函数注册或使用电子邮件登录之前附加" ".

因此,您将使用电子邮件/密码身份验证,映射<username><username>@yourowndomain.com

  • 谢谢.没有密码重置将是有问题的:( (5认同)

Sau*_*kar 10

最后添加一个虚拟域是一种补丁,应该避免.要启用用户名登录,请按照以下简单步骤操作

注册

在注册期间,请使用用户ID,电子邮件和密码.使用普通电子邮件和密码注册用户.在成功时将电子邮件保存在单独节点(分支)中的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();
                    }
                });

            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

数据库

数据库结构将如下所示

在此输入图像描述

登录

检查用户是否输入了电子邮件或userId.如果是电子邮件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
                    }
                });
            }

        }
    });
Run Code Online (Sandbox Code Playgroud)
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();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

  • 如果提议是存储用户的真实电子邮件地址,这似乎有问题,因为地址可能会暴露给任何客户端. (3认同)

far*_*ruk 7

您可以使用 sign in with custom token

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

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

可以在本文档中阅读更多详细信息

  • 这意味着您仍然在 BE 上保存密码 - 所以您没有将身份验证问题导出到 Firebase - AFAIU 这是使用它的主要想法 (2认同)