firebase - Firebase 安全开放访问
问题描述
我的 android 壁纸应用程序已连接到Firebase Cloud Firestore
. 它没有任何用户身份验证,因为我希望用户能够毫不费力地使用它。要做到这一点,它必须是开放访问的,也就是说,允许用户read
和write
. 这很危险,因为如果他知道项目 ID,他还可以编辑和修改数据。项目 ID 在应用程序的 url 中可见,因此这不是一个好的选择。出于显而易见的原因,封闭访问也不是一种选择。
在不需要用户身份验证的情况下,我可以做些什么来保护我的数据?我很想看到 Cloud Firestore 和 Storage 保护数据所需的代码。我希望用户只读,我作为所有者应该是唯一可以写的人。请参考所附图片。非常感谢您花时间回答我的问题。
解决方案
使用安全规则保护您的数据
Firebase Cloud Firestore
,Firebase Realtime Database
并Firebase Cloud Storage
受其自己的安全规则保护。它们以简单而富有表现力的格式提供访问控制和数据验证,并允许您控制对数据库中文档和集合的访问。
要构建基于用户和基于角色的访问系统以确保用户数据的安全,您需要使用Firebase Authentication
Cloud Firestore 安全规则。
您的特定用例
我假设您将数据存储Firebase Cloud Firestore
在Firebase Cloud Storage
. 然后,用户会获得一个包含下载壁纸链接的文档,并且也许还可以将他们自己的壁纸上传到数据库。
开放数据库的危险
正如您所提到的,允许在生产应用程序中对您的数据库进行所有读写是非常危险的。显然,任何拥有您的数据库引用的人都将能够读取或写入您的数据库中的数据。未经授权的用户可能会破坏您的后端,并且成本也有可能成倍增加。因此不建议这样做。总是应该有一些机制来防止这些情况。
建议:首先使用匿名身份验证,然后再连接现有的身份提供者
我建议您使用Firebase Authentication
创建和使用临时匿名帐户来通过 Firebase 进行身份验证。这些临时匿名帐户可用于允许尚未注册您的应用程序的用户使用受安全规则保护的数据,而不会妨碍您的用户体验。如果匿名用户后来决定注册您的应用程序,您可以将他们的登录凭据链接到匿名帐户,以便他们可以在以后的会话中继续使用受保护的数据。
如果您不希望使用常规密码身份验证,您还可以启用 Google-Sign-In、Facebook Login、Twitter、GitHub、Microsoft、Yahoo 等,让用户以非常快速和简单的方式进行身份验证,而不会影响安全性(从用户体验的角度来看)。FirebaseUI
使将这些添加到您现有的应用程序变得非常容易。查看有关此主题的官方文档。
实施 Cloud Firestore 安全规则
关于如何开始使用 Cloud Firestore 安全规则的官方文档非常棒。
但是,这些安全规则可能对您有用:
允许所有用户对 root 进行读取访问(不推荐,因为这会在生产中产生巨大的成本)。用户没有写入(创建、更新、删除)权限。在这种情况下,您可以通过 Firebase 控制台编辑您的数据。为您的项目选择选项 1 或选项 2。
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Option 1: Matches any document in the 'root' collection.
match /root/{rumiXYZ} {
allow read: if true;
allow write: if false;
}
// Option 2: Matches any document in the 'root' collection or subcollections.
match /root/{document=**} {
allow read: if true;
allow write: if false;
}
}
}
上述规则中的{document=**}
路径可用于匹配集合/子集合或整个数据库中的任何文档。但是,这对于您的用例来说不是必需的。继续阅读构建安全规则的指南,了解如何匹配特定数据路径和使用分层数据。
不要忘记保护您的 Firebase 云存储!
推荐阅读
- powershell - PS脚本在文件类型中打印目录名称
- mongodb - mongodb:在其他文档中按条件查找所有记录
- html - 为什么标题框元素超出正文框元素?
- pyaudio - 如何在谷歌云外壳中安装 pyaudio 模块?
- php - 如何正确拆分包含 HTML 实体的 php 中的字符串
- javascript - PHP fputcsv函数不适用于对象数组
- javascript - 为什么在检查时跳过了函数并且未定义 onclick,尽管在脚本中定义了?
- css - 如何在 MUI Grid 中有不同的水平和垂直间距?
- python - 分页不适用于我的 Django 休息框架项目,我正在使用通用视图
- javascript - 尽管 URL 正确,Angular 路由器仍无法加载我的组件