在两个iOS应用中共享Firebase身份验证/令牌

时间:2017-07-08 04:30:20

标签: ios objective-c swift firebase qr-code

我有一个使用Firebase后端的iOS应用App1,用户可以使用以下方式登录/创建帐户:

  1. Firebase帐户(电子邮件/密码)
  2. Facebook(认证后交换Firebase凭据)
  3. Google(身份验证后交换Firebase凭据)
  4. 这很好用。

    我有另一个iOS应用程序,App2,使用Firebase后端,允许用户使用与App1完全相同的选项登录/创建帐户(App2使用与App1完全相同的核心代码),此外,第4次登录/创建帐户选项:

    1. Firebase帐户(电子邮件/密码)
    2. Facebook(认证后交换Firebase凭据)
    3. Google(身份验证后交换Firebase凭据)
    4. 扫描其他设备上显示的QR码App1正在
    5. 上运行

      要使用选项4,QR code sign,App1上的用户点击按钮“生成QR码”,App1上生成的QR码的数据包含Firebase凭证uid和displayName。

      一切正常。 App2可以读取App1 QR码中的数据,App2现在可以轻松拥有App1上登录用户的uid和displayName。

      现在我遇到了第一个问题,我后来尝试使用App1二维码中的uid更新Firebase数据库时遇到了问题,Firebase错误:“权限被拒绝”:

      enter image description here

      理解,必须经过身份验证,我的数据库规则清楚地表达了这一点,我当然不知道这在我的QR码策略之前:

      {
        "rules": {
          ".read": "auth != null",
          ".write": "auth != null"
        }
      }
      

      但是,我不想将我的Firebase规则切换为公开,这将允许任何人访问。所以接下来我想,没问题,我只是将用户输入的电子邮件/密码作为数据存储在App1上生成的二维码中,我的应用程序没有很高的安全性问题,那么,当App2扫描App1二维码时,App2就可以了使用从App1 QR码中的数据中读取的电子邮件/密码登录Firebase。

      我的解决方案存在一个问题,对于使用Google或Facebook登录App1的用户不起作用。在这种情况下,我不会收到他们的电子邮件或密码。

      我正在思考的另一个解决方案,但我很确定无法为我工作,请参阅上面的Firebase“Permission Denied”是Firebase的signInAnonymously,这对我来说无效,因为Firebase用户存在,该用户登录App1,有自己的uid,这不是signIn匿名创建的uid。

      我正在考虑的另一个解决方案是使用NSUbiquitousKeyValueStore 从App1与App2共享Firebase凭据,但我不确定在Firebase凭据中需要在App2上重新创建它。我想即使我通过Auth.auth().signIn或其他建议从App1共享了有效的Firebase凭据/令牌,我仍然需要在App2上致电NSUbiquitousKeyValueStore以在App2上创建新的有效Firebase会话。 ..

1 个答案:

答案 0 :(得分:0)

感谢信息herehere我意识到我可以添加一个具有“角色”作为管理员的Firebase帐户。这样,当我从QR代码中检索uid和displayName时(即使对Firebase数据库具有完全访问权限,除了you cannot retrieve it later之外,QR代码必须包含displayName)我可以以管理员Firebase身份登录帐户,我可以通过以下数据库规则更改来编写和读取uid中传递的QR代码,请注意我有一个我创建的“用户”数据库,这是我存储我的角色的地方:

{
  "rules": {
    "users": {
      ".read": "root.child('users').child(auth.uid).child('role').val() == 'admin'",
      ".write": "root.child('users').child(auth.uid).child('role').val() == 'admin'",
      "$uid": {
        ".read": "auth.uid == $uid",
        ".write": "auth.uid == $uid"
      }
    }
  }
}