我有一个使用Firebase后端的iOS应用App1,用户可以使用以下方式登录/创建帐户:
这很好用。
我有另一个iOS应用程序,App2,使用Firebase后端,允许用户使用与App1完全相同的选项登录/创建帐户(App2使用与App1完全相同的核心代码),此外,第4次登录/创建帐户选项:
要使用选项4,QR code sign
,App1上的用户点击按钮“生成QR码”,App1上生成的QR码的数据包含Firebase凭证uid和displayName。
一切正常。 App2可以读取App1 QR码中的数据,App2现在可以轻松拥有App1上登录用户的uid和displayName。
现在我遇到了第一个问题,我后来尝试使用App1二维码中的uid更新Firebase数据库时遇到了问题,Firebase错误:“权限被拒绝”:
理解,必须经过身份验证,我的数据库规则清楚地表达了这一点,我当然不知道这在我的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会话。 ..
答案 0 :(得分:0)
感谢信息here和here我意识到我可以添加一个具有“角色”作为管理员的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"
}
}
}
}