需要有关在生产应用程序中添加身份验证提供程序的建议 - Firebase
Posted
技术标签:
【中文标题】需要有关在生产应用程序中添加身份验证提供程序的建议 - Firebase【英文标题】:Need advice on adding Auth provider in production app - Firebase 【发布时间】:2017-10-02 03:28:03 【问题描述】:我一周前推出了一个应用程序,现在有几百个用户。我使用的唯一身份验证提供程序是 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 和名称,则会导致一些向后兼容性问题。
谁能帮我找到一个解决这个潜在的数据库结构重构的好方法?
【问题讨论】:
【参考方案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 处理,您可以高枕无忧了。
【讨论】:
具体一点怎么样【参考方案2】:我针对这个问题提出的解决方案以及另一个问题是 Facebook 用户可能甚至没有电子邮件(他们使用电话号码创建帐户)如下:
通过 facebook(或 gmail)对用户进行身份验证后,检查他们的电子邮件是否已经在数据库中,或者是否没有电子邮件(电话号码情况),在这种情况下,向他们显示一个屏幕,要求他们输入要使用的电子邮件使用这个新帐户。
不是最好的解决方案,但它解决了这两个问题。
【讨论】:
以上是关于需要有关在生产应用程序中添加身份验证提供程序的建议 - Firebase的主要内容,如果未能解决你的问题,请参考以下文章
将 Facebook 身份验证添加到我的 Spring MVC 应用程序
使用 Google 作为身份提供者的 Salesforce 的 Api 身份验证
Heroku上的现有Ruby on Rails Web应用程序(PostgreSQL),Devise身份验证,需要为移动支持添加Rails API