BOG*_*GUS 8 firebase firebase-authentication firebase-realtime-database
我正在研究Firebase实时数据库的身份验证,并提出一些我似乎无法找到答案的问题.
我们有一个Firebase实时数据库,其中包含一系列应该可供所有用户访问的数据.但是,它只能通过我们的移动应用程序访问,并且最好不需要用户注册和登录.用户不会写入数据库,它只是我们担心的阅读部分.我们不希望有人通过脚本/应用程序"复制"整个数据库.
此问题非常类似于限制Firebase数据库访问一个Android应用和Firebase只读,无应用身份验证.在这些讨论中,建议使用匿名身份验证https://firebase.google.com/docs/auth/web/anonymous-auth.
如果我正确理解匿名身份验证,它将无法解决问题.任何人都可以使用Firebase SDK从他们自己的脚本/应用程序连接到同一个Firebase网址,只需匿名登录即可.这将允许他们阅读我们的所有数据.
即使整合了用户登录,例如Facebook或Google,我们的数据仍然存在遭受损害的巨大风险.任何人都可以在我们的应用中创建用户.之后,他们可以创建自己的Firebase脚本/应用程序,并与该用户连接到我们的数据库并检索数据.
讨论限制Firebase数据库访问一个Android应用程序,讨论限制只能访问移动应用程序的可能解决方案.这可以通过使用API密钥或用户名/密码组合来完成.然后,这将在应用程序中进行硬编码或通过服务发送.如讨论中所述,由于反编译,硬编码似乎既麻烦又不安全,如果用户名/密码组合因某种原因而发生变化,将来很难更新.通过服务发送API密钥也是不安全的,因为任何人都可以从外部请求服务.如如何防止其他访问我的firebase,没有办法保护网址.
这是可以实现还是我遗漏了什么?
使用 Firebase 实时数据库(或者通常使用任何给定的公共数据库 API)无法实现您想要的目标。
如果您不要求用户提供唯一形式的标识(例如,每个用户身份验证),那么唯一的选择是使用您的应用程序提供的某种形式的秘密进行身份验证。当然,正如您所注意到的,如果您的应用程序提供了该秘密,那么拥有您的应用程序副本的任何人都可以提取该秘密并使用它。
以更纯粹的形式来思考数据库可能会更容易——就像它的REST 端点一样。
实际上,如果规则配置为允许任何人阅读,那么任何人都可以访问该 URL。但是您提供的任何秘密都只是该 URL 的某种扩展(或作为 HTTP 标头)。任何知道如何访问您的数据库的人都可以在您的应用程序之外的另一个上下文中使用相同的凭据。
同样,即使您使用云功能或其他服务器端应用程序代码通过管理 API 来协调对数据库的所有访问(并有效地将安全规则设置为私有),您仍然会再次遇到同样的问题 - 如何您的函数是否知道它是“您的应用程序”而不是冒充您的应用程序的其他代码?在这种情况下,您所能做的最好的事情就是对 API 进行某种形式的速率限制,但没有什么可以阻止数据的完全提取。
另一个例子:谷歌可能不希望任何人完全下载他们的整个搜索索引,但他们希望对索引的访问能够有效地公开和匿名——他们只能通过速率限制并允许针对索引进行非常具体的操作来真正控制这一点在服务器端代码中,它们永远不允许您转储整个数据库。同样,它们根本不直接向最终用户公开数据的“更有趣”部分(例如排名数据)——只允许服务器端代码访问并使用它来生成结果。
最后,即使您进行了每用户身份验证,如果这些用户有权查看除了仔细编写的服务器端代码之外的整个内容,也没有什么可以阻止这些用户使用自己的凭据有效地复制数据库。但是,在这种情况下,您至少可以通过将活动绑定到特定用户(并使用服务器端代码来执行该检测)来进行更准确的速率限制和滥用检测。
| 归档时间: |
|
| 查看次数: |
305 次 |
| 最近记录: |