【问题标题】:How to setup Firebase security rules to accept connections only from an iOS App如何设置 Firebase 安全规则以仅接受来自 iOS 应用的连接
【发布时间】:2014-06-03 21:10:22
【问题描述】:

我想配置一个 Firebase 数据库,使其只接受来自我的 iOS 应用的连接。

我在配置规则以管理来自经过身份验证的用户的访问等方面没有问题...,但我想知道什么是防止来自我以外的其他应用程序连接的最佳方法。

我该怎么做?

更具体的用户案例。我的应用程序是一项服务,用户可以注册以使用它通过 twitter 和 Facebook 进行身份验证。用户为服务付费,应用程序将使用 Firebase 作为后端,这意味着我将为 Firebase 服务付费。用户付钱给我,我付给 Firebase。所以这就是我只希望我的应用程序是唯一一个连接和使用 Firebase 数据库的原因。我认为这是常见的情况。 Parse 等其他后端服务允许您在应用连接时使用密钥来执行此操作。

【问题讨论】:

  • 你能解释一下这个用例吗?具体来说,如果用户拥有有效的身份验证凭据,那么他们从哪里连接又有什么关系呢?这听起来很可疑,就像“我如何防止云中的东西在云中”。理解这一点应该有助于缩小回答的范围。
  • 存储在 Firebase 中的数据已经过整理,旨在供 iOS 应用使用。这些数据是 iOS 应用程序为其用户提供的价值的一部分,因此无法从其他任何地方访问。
  • 除了浏览器签名(当然可以伪造)之外,云中的服务器是否可以使用某种方法来确保从应用程序而不是浏览器接收请求?我可以提供 Firebase 部分来保护数据,但不能告诉您任何网络服务如何确保连接的设备是一种或另一种类型。
  • 嗨加藤。我对知道设备的类型或者它是网络还是移动设备不感兴趣。我想要的是该应用程序可以像用户一样对自己进行身份验证。把它想象成一个社交应用程序。一方面,我想让用户使用 twitter 和 Facebook 等进行身份验证……另一方面,我只希望通过我的服务(我的应用程序)使用数据。双方都使业务成为可能。
  • 让应用程序以某种方式向服务注册是否合理,以便应用程序的每个实例接收一个唯一标识符?如果是这样,我可以解释如何使用它。

标签: ios authentication firebase firebase-security


【解决方案1】:

如果我理解正确的话,标准如下:

  1. 您提供了一个可购买的应用程序,该应用程序可以访问高级数据
  2. 只有付费客户才能读取该数据
  3. 用户可以在不下载您的应用的情况下使用 FirebaseSimpleLogin 登录
  4. 您想阻止这种情况

假设所有这些都是正确的,我看到两个快速答案:

创建您自己的身份验证令牌

由于 FirebaseSimpleLogin 可在云端使用,因此您将无法阻止用户基于设备进行身份验证。但是 FirebaseSimpleLogin 只是 token generator 的一个包装器,所以没有什么能阻止您访问 generating your own

#!/usr/bin/env node

var FirebaseTokenGenerator = require("firebase-token-generator");
var tokenGenerator = new FirebaseTokenGenerator(YOUR_FIREBASE_SECRET);

if( validateUserIsFromiOSApp() ) {
   var token = tokenGenerator.createToken({id: userId});
}

function validateUserIsFromiOSApp() { /* ??? */ }

现在可以简单地关闭简单登录,如果不先从您的服务获取有效令牌,用户将无法进行身份验证。这里的安全规则是专有的,但会包含如下内容:

".read": "auth.uid !== null"

根据需要 twitter/facebook 身份验证的用例,通过一些创意,您可以绕过整个身份验证过程,只需让应用在注册时请求一个令牌,并且根本不强制用户进行身份验证。

结合简单登录使用一些元数据

当然,简单登录按照定义是简单的,并且不需要服务器进程。您可以通过存储有关哪些用户购买了您的应用的信息来利用它:

  1. 用户从商店购买应用程序
  2. 在收到交易期间,您将用户 ID 和购买记录存储在 Firebase 中
  3. 照常使用简单的登录验证
  4. 添加安全规则以确保用户已购买应用程序

安全规则如下所示:

".read": "root.child('purchase_receipts/'+auth.uid).exists()"

补充阅读:

【讨论】:

    猜你喜欢
    • 2020-10-09
    • 2021-04-24
    • 1970-01-01
    • 2014-08-22
    • 2018-12-19
    • 2014-02-08
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    相关资源
    最近更新 更多