需要有关在生产应用中添加Auth提供程序的建议 - Firebase

时间:2017-05-04 05:34:41

标签: firebase firebase-realtime-database firebase-authentication facebook-authentication

我在一周前推出了一个应用程序,现在有几百个用户。我使用的唯一身份验证提供程序是gmail,我的数据库结构如下所示:

- AllUsersInfo:
   - $userEmail                     // example: "blah@gmail.com"
       - "uid": $userUID            // example: "1234567890"
       - "name": $userDisplayName   // example: "John Doe"

- AllUsersData
   - $userUID                       // example: "1234567890"
       - "userData": { ... }

基本上,我创建了一个节点(AllUsersInfo)来容纳用户'电子邮件作为密钥,用户的uid和名称作为值。另一个节点(AllUsersData)实际上包含它们在应用程序中生成的每个用户的数据作为值,其中键是他们的uid。我把这两个节点分开了,因为顶部的节点很轻,很适合搜索,而底部的节点是安全的,有更多的数据。

问题:

现在我正在添加Facebook身份验证,并且正在努力了解如何保持数据库结构的完整性。问题是,如果有人先前使用Gmail登录并且现在正在注册Facebook,那么他们的Facebook帐户的电子邮件可能与他们之前注册的gmail相同。这会导致AllUsersInfo节点重叠,因为密钥在Firebase中必须是唯一的。

我正在努力弄清楚如何处理这些重叠案件。如果我使用新名称和uid覆盖电子邮件在AllUsersInfo节点中的先前数据,则会使旧用户的身份验证无法搜索。如果我更改AllUsersInfo的结构以允许多个uid和名称,则会导致一些向后兼容性问题。

有人可以帮我找到这个潜在的数据库结构重构的好解决方案吗?

2 个答案:

答案 0 :(得分:0)

我建议的解决这个问题的方法,以及Facebook用户可能甚至没有电子邮件的另一个问题(他们使用电话号码创建了他们的帐户)如下:

通过facebook(或gmail)对用户进行身份验证后,检查他们的电子邮件是否已存在于数据库中,或者是否没有电子邮件(电话号码情况),在这种情况下会向他们显示一个屏幕,要求他们输入要使用的电子邮件这个新帐户。

不是最好的解决方案,但它解决了这两个问题。

答案 1 :(得分:-1)

目前,您的应用只有数百名用户。我建议您使用Firebase UI库来处理所有这些问题,您只需编写3-5行代码即可。

Here是Firebase UI Android库的链接。将其添加到您的项目中,然后按照these步骤将您的应用连接到Firebase。

完成后,从Firebase控制台启用Google和Facebook登录,按照步骤操作,然后将这些行添加到您的应用中。

startActivityForResult(
AuthUI.getInstance()
    .createSignInIntentBuilder()
    .setProviders(Arrays.asList(
                                new AuthUI.IdpConfig.Builder(AuthUI.GOOGLE_PROVIDER).build(),
                                new AuthUI.IdpConfig.Builder(AuthUI.FACEBOOK_PROVIDER).build()
                                ))
    .build(),
RC_SIGN_IN);

现在所有测试用例都由Firebase处理,您可以高枕无忧。