【问题标题】:Sharing Firebase authentication/token across two iOS apps在两个 iOS 应用之间共享 Firebase 身份验证/令牌
【发布时间】:2023-03-06 07:02:01
【问题描述】:

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

  1. Firebase 帐户(电子邮件/密码)
  2. Facebook(身份验证后交换 Firebase 凭据)
  3. Google(身份验证后交换 Firebase 凭据)

这很好用。

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

  1. Firebase 帐户(电子邮件/密码)
  2. Facebook(身份验证后交换 Firebase 凭据)
  3. Google(身份验证后交换 Firebase 凭据)
  4. 扫描显示在另一台运行 App1 的设备上的二维码

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

这一切都很好。 App2 可以读取 App1 二维码中的数据,App2 现在轻松拥有 App1 上登录用户的 uid 和 displayName。

现在我在 App2 上遇到的第一个问题是后来尝试使用 App1 QR 码中的 uid 更新 Firebase 数据库时,Firebase 错误:“Permission Denied”:

明白了,必须认证,我的数据库规则明确表达了这一点,我之前的二维码策略当然不知道这一点:

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

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

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

我正在考虑的另一个解决方案,但我很确定对我不起作用,请参阅上面的 Firebase“Permission Denied”是 Firebase 的 signInAnonymously,这对我不起作用,因为 Firebase 用户存在,该用户已登录App1上有自己的uid,显然不是signInAnonymously创建的uid。

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

【问题讨论】:

  • 永远,永远,永远公开用户的用户名/密码。如果你这样做了,至少告诉他们。
  • @Multinerd 停止你的戏剧

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


【解决方案1】:

感谢here 和here 提供的信息,我意识到我可以添加一个具有管理员“角色”的 Firebase 帐户。这样,当我从 QR 码中检索 uid 和 displayName 时(QR 码必须包括 displayName 以及 uid 为 you cannot retrieve it later 即使完全访问 Firebase 数据库)我可以只以我的管理员 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"
      }
    }
  }
}

【讨论】:

    猜你喜欢
    • 2016-09-17
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2019-03-23
    • 2011-10-10
    • 1970-01-01
    • 2018-10-04
    相关资源
    最近更新 更多