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

使用电子邮件进行Firebase数据库身份验证

冯阳云
2023-03-14

我是新的Firebase.我已经建立了一个Firebase实时数据库,如果读写规则设置为true,可以读写它。

我的身份验证有问题。我已经为谷歌和电子邮件加密码设置了身份验证。

我的目标是允许任何用户读取数据,但只有一个用户(我自己)可以在使用单个电子邮件地址和密码登录后写入数据。

如果我用谷歌登录,我可以成功地读写数据库(规则设置为: auth!=null)。

如果使用电子邮件地址和密码登录,我还可以使用相同的规则(auth!=null)读取和写入数据库。

我不知道如何将其设置为只允许使用电子邮件地址和密码登录的单个用户进行写访问。

我曾尝试在规则中包含一个用户节点,但在使用模拟器(见下文)时无法访问该节点,并且在构建引用时不知道如何包含uid(登录后可以获得该uid)——这是我当前使用的引用(在读写规则设置为true的情况下工作):

DatabaseReference databaseReference = mRootReference.child("Action_helper/1/Action_table_of_contents");

我的数据库中没有包含用户节点,因为我假设该节点由firebase身份验证负责。

下面是我的数据布局:

我尝试了使用各种规则选项的模拟器。在模拟器中使用这些设置测试访问(选择自定义提供程序选项):

auth{"提供程序":"Firebase","uid":"Rp3OgoaABMN3hqTv0aF29ECQRCQ2"}

注意:我使用我在Firebase身份验证中设置的电子邮件地址和密码登录后,从Firebase对象获取提供商和uid:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    if (user != null) {
        // User is signed in
        userId = user.getUid();
        String provider = user.getProviderId();

我将感谢一些帮助1)制定我的规则,2)如果和如何我应该改变我的数据结构,最后3)如何在数据库引用中包括uid,我将用来向数据库写入数据。

谢谢

共有2个答案

阮昊阳
2023-03-14

谢谢你的帮助。我设法让它工作(部分),但不确定我做得是否正确。这是我的数据结构(我已经更改了名称)-有一个用户节点(使用身份验证uid)和两个包含数据的子节点:

以下是我的规则:

基本上它在模拟器中工作,但在代码中,我能够登录和读写。但是我现在有一个问题,如果我不登录,那么查询引用中传递的uid为null,如果我把一个虚拟值作为uid,那么我根本无法访问数据(因为数据在用户/the_valid_uid节点下,虚拟uid不匹配the_valid_uid)。

那么,如何在不硬编码有效用户的uid的情况下构建数据库引用呢?这样我就可以访问Addiction_items和table_of_contents_items节点中的数据(我的目标是允许任何人读取这两个节点中的数据,但只允许一个用户(我自己)在使用我的电子邮件地址和密码登录后能够写入这两个节点?

谢谢

苏涵润
2023-03-14

没有用户节点,所以在规则中定义是没有用的。我认为可能有效的规则如下(假设0和1是uid):

   {
      "rules": {

         "Action_helper":{

           "$uid":{

               //user-based security
               ".read": "auth != null && $uid === auth.uid",
               ".write": "auth != null", 

           }//$uid

        }//Action_helper

   }// rules
}

默认情况下检查上述规则如果我们没有定义规则,那么它是错误的,即在Action_helper上,读写都是错误的。当涉及到节点uid(其中$表示通配符)时,我们检查登录用户的用户id是否与该节点的uid相同,并相应地定义规则。

我强烈建议浏览Firebase安全的关键链接——Google I/O 2016,它非常有用,易于理解,是迄今为止我在演示示例中找到的最好的解释。

数据布局将取决于您的要求和屏幕。尽管Firebase允许32级嵌套,但强烈建议尽可能少地嵌套节点。关于数据布局,需要考虑的另一个重要问题是尽可能地使数据非规范化,即使我们必须在节点之间复制字段。

要在数据库引用中包含uid,可以继续追加每个子项:

DatabaseReference databaseReference = mRootReference.child("Action_helper).child(uid).child("Action_table_of_contents");

所以,这里我们从根节点到子节点“Action_helper”,再往下看,它的子节点匹配uid,我们引用的是子节点“Action_table_of_contents”。

 类似资料:
  • 我已经创建了一个android应用程序,并使用firebase作为电子邮件注册和认证的手段。注册后,用户可以在数据库中存储库存项目。所以我的问题是,如何设置firebase身份验证规则,以便特定用户只能访问他们输入的数据。现在,每个人都可以读/写数据库。我不担心写的部分,因为电子邮件认证。提前感谢! 我的数据库是这样设置的:数据库

  • 如何使用firebase中的验证电子邮件验证使用电子邮件和密码登录的用户?这背后的逻辑是如何工作的,它在代码中会是什么样子? 解决方案/帮助:对于那些仍在寻找答案的人,我找到了这篇文章 堆栈溢出 帖子

  • 我想知道是否有能力登录与电子邮件和用户id+密码,我有一个项目,我想让用户添加一个唯一的号码(实际上是我们公司提供的工作识别号码),以能够登录到该计划将保持私人公司就业。 我需要firebase认证拒绝登录,即使电子邮件和密码是正确的,但用户id是错误的。

  • 我使用Firebase身份验证和电子邮件验证来实现用户注册,如下所示: 用户注册完成后,我可以在Firebase控制台内的Authentication菜单上看到电子邮件。然后我点击了电子邮件上的验证链接,在浏览器上得到了这样的消息: 返回false。所以电子邮件验证过程没有成功完成。这里怎么了? 我使用的是CompilesDKVersion29和Firebase-Auth19.3.2。

  • 我也不会得到一个错误,如果我登录我的电子邮件和密码没有验证电子邮件。 非常感谢你事先的帮助。

  • 情况 我想为我的web应用程序使用Azure B2C身份验证服务。但是,我希望应用程序管理员限制对某些电子邮件或域的访问,例如白名单,如下所示: tom1@abc.com tom2@def.com *@alphabet.com 因此,只有前两封电子邮件和任何以“alphabet.com”结尾的电子邮件才能访问该网站。 问题 我已经实现了所有功能,并且工作正常,但是我正在努力获取经过身份验证的用户的