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

时间:2018-03-19 05:02:41

标签: java android firebase firebase-realtime-database firebase-security-rules

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

  1. 用户输入手机号码和没有。根据我的数据库进行检查,如果存在则:

  2. Firebase的通知服务和电话验证生成的一次性密码。

  3. 在下一个屏幕上,针对我的数据库检查用户的图钉,最后他进入菜单屏幕。

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

1 个答案:

答案 0 :(得分:1)

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

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

通过这种方式,您可以将一些限制性读取访问规则应用于电话号码列表,因为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 /云功能检查电话号码是否存在。如果是这样,它可以发回成功消息(或写入RT DB的其他节点)。如果不是,它会发回失败消息。

3 /在Android应用中,收到云功能的响应后,继续(或不继续)下一步

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

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

相关问题