2017-07-08 105 views
0

我有一个iOS应用程序,应用1,使用火力地堡后端,用户可以登录/创建一个帐户使用:共享火力地堡认证/令牌应用程式

  1. 火力地堡帐户(电子邮件/密码)
  2. 的Facebook(交换了火力地堡证书认证后)
  3. 谷歌(认证后调换火力地堡凭证)

这工作得很好。

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

  1. 火力地堡帐户(电子邮件/密码)
  2. 的Facebook(交换进行身份验证后火力地堡凭证)
  3. 谷歌(认证之后交换了火力地堡凭证)
  4. 扫描另一台设备上显示的二维码APP1上

运行要使用,在APP1用户点击一个按钮,选项4 QR code sign“生成QR码”,用于在APP1生成的QR码的数据包含火力地堡凭证uid和显示名。

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

现在对于我的应用2跑进当后来试图更新使用从应用1 QR码(UID)的火力地堡数据库的第一个问题,火力地堡错误:“权限被拒绝”:

enter image description here

明白了,已被认证,我的数据库规则清楚地表达这一点,我不知道在此之前,当然我QR码策略:

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

不过,我不希望我的火力地堡的规则是改用公用电话,那会允许任何人访问秒。所以接下来我想,没问题,我只是把用户输入的电子邮件/密码作为App1上生成的QR码中的数据,我的应用程序没有高度安全性问题,然后,当App2扫描App1 QR代码时,App2可以使用从App1 QR代码中读取的电子邮件/密码登录到Firebase。

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

另一个解决方案我很琢磨,但我很肯定不会为我工作,上面提到Firebase“权限被拒绝”是Firebase的signInAnonymously,这对我来说不起作用,因为Firebase用户存在,该用户登录App1,有他们自己的uid,这显然不是由signIn匿名创建的uid。

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

+0

永远,永远,永远暴露一个用户名/密码。如果你这样做,至少告诉他们。 – Multinerd

+0

@Multinerd停止与您的戏剧 –

回答

0

感谢信息herehere我意识到我可以添加一个拥有“角色”作为管理员的Firebase帐户。这样,当我从QR码中检索到uid和displayName时(即使对Firebase数据库具有完全访问权限,QR码也必须包含显示名称除012以外的其他显示名称),我可以仅以管理员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" 
     } 
    } 
    } 
}