首页 文章

实时数据库Firebase安全规则问题

提问于
浏览
0

我在Android Studio中创建了一个应用程序,并将其与Firebase实时数据库相关联 . 我需要执行3次验证:

1.用户进入他的电话号码 . 和没有 . 根据我的数据库检查,如果它存在,那么,

  • 由Firebase的通知服务生成的OTP和电话已验证 .

  • 在下一个屏幕上,根据我的数据库检查用户的引脚,最后他进入菜单屏幕 .

现在,我对我应该设置什么作为我的安全规则感到困惑,因为身份验证正在第2步进行,所以我不能使用'auth'来规定规则而没有'auth'数据库将是公共的(至于我知道,如果我错了,请纠正我,这不安全 . 可以做些什么?

1 回答

  • 1

    实际上,正如您所提到的,在步骤1中没有身份验证 . 因此,如果您想“直接”读取实时数据库以检查电话号码是否存在,则无法避免每个人都有权访问列出所有电话号码的实时数据库节点 .

    另一种选择是使用将通过HTTPS(作为REST API)调用的 Cloud 功能,并检查给定的电话号码是否在授权电话号码列表中 .

    通过这种方式,您可以将一些限制性读取访问规则应用于电话号码列表,因为Clouds功能将以管理员身份访问它 . 而不是公开所有电话号码列表,您只允许检查一个电话号码是否被授权 .

    查看文档以了解如何创建可通过HTTP请求触发的函数https://firebase.google.com/docs/functions/http-events

    基本上你会做类似的事情:

    exports.checkPhoneNbr = functions.https.onRequest((req, res) => {
      let phoneNumberToCheck = req.query.phoneNumber;
    
      return admin.database().ref('/phoneNumbers/' + phoneNumberToCheck).once('value').then(snapshot => {
        if (snapshot.val()) {
           //the phone number exists, do something, i.e. write to another database node or send back a successful HTTP response
          //i.e. res.status(200).send("PhoneNbrExists");
        } else {
           //i.e. res.status(200).send("PhoneNbrDoesNotExist");
        }
       }
    }
    

    所以:

    1 /您通过Android应用程序(通过HTTPS)调用此功能,电话号码位于功能URL的QueryString中

    2 / Cloud 功能检查电话号码是否存在 . 如果是这样,它可以发回成功消息(或写入RT DB的其他节点) . 如果不是,则发回失败消息 .

    3 /在Android应用程序中,从 Cloud 功能接收响应后继续(或不)继续下一步

    另外,看一下函数样本,特别是HTTP样本,例如:

    https://github.com/firebase/functions-samples/blob/master/quickstarts/time-server/functions/index.js

相关问题