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

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

蒋芷阳
2023-03-14

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

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

如果我确实需要这样做,那么提供代币的最简单方法是什么?Azure中有函数,AWS有Lambda,但我看这里没有Firebase

共有3个答案

万俟穆冉
2023-03-14

在末尾附加一个虚拟域是一种修补,应该避免。要启用用户名登录,只需执行以下简单步骤。

注册

在注册过程中,使用用户名、电子邮件和密码。使用普通电子邮件和密码注册用户。成功后,根据user\u 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并进行登录。

    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();
        }
    });
}
水渊
2023-03-14

您可以使用自定义令牌登录

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

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

更多详细信息请参阅本文档

董奇思
2023-03-14

目前Firebase Auth中不支持本机用户名/密码登录,您是正确的。

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

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

因此,您将使用电子邮件/密码身份验证,映射<代码>

 类似资料:
  • 使用Firebase,我可以使用电子邮件地址注册和登录用户。但是,如果我希望应用程序基于用户名怎么办?例如,您使用“Bobzilla”而不是“Bob@mail.com”登录? Firebase是否可以这样做?

  • 我有一个使用Spring Security的应用程序。在成功注册后,我试图获取用户的姓名,但当我进入登录页面时,我收到的是电子邮件而不是姓名。成功登录后,我提供了一个屏幕截图。 在上图中,我想要名字,而不是电子邮件地址。 我在给你上课,我认为这最重要。 控制器类 安全配置类 LOGIN.HTML 应用程序用户类

  • 我已经实现了登录用户名或电子邮件在我现有的项目和工程罚款。我想将其扩展为使用用户名、电子邮件或电话登录。我想要一个用户登录用户名,电子邮件或电话号码和密码。 这是我的代码App\Http\Controllers\Auth\LoginController 应用程序\Http\控制器\Auth\注册控制器 注册工作正常,我可以将用户电话存储到用户表中。我已将电子邮件的输入类型更改为views/auth

  • 我正在使用Firebase数据库创建一个应用程序,其中添加了登录和注册功能。我想添加使用用户名而不是电子邮件ID的登录。但是我找不到任何使用用户名进行身份验证的方法。如果我将Firebase数据库规则更改为公共,那么我可以使用用户名登录,但在这种情况下数据库的安全性受到阻碍。因此,请指导我在Firebase上使用用户名登录,并建议我如何在注册前检查用户名的可用性,如果用户名可用,则用户可以注册,如

  • 问题内容: 我正在尝试创建一个auth后端,以允许我的用户使用他们的电子邮件地址或他们在Django 1.6中使用自定义用户模型的用户名登录。当我使用用户名登录时,后端工作正常,但由于某种原因,没有电子邮件。有什么我忘记要做的事吗? 编辑:按照建议,我已从ModelBackend继承并将其安装在我的设置中。在我的设置中,我有这个(,)并且我将后端更改为这个: 现在我得到一个错误。 问题答案: 遵循

  • 我希望身份验证组件允许用户登录输入用户名或电子邮件。在我的用户表中,两个字段-userName和userEmail都是唯一的。注册时,密码生成如下: sha1($username.$password); 问题是用户无法使用电子邮件登录。 应用程序控制器 用户控制器:登录功能如下: Auth。php:(我在这里对生成密码的方式做了一些更改,因为我正在使用cakephp会话自动登录到SMF论坛。) 我