私有服务器的 Firebase 身份验证
Posted
技术标签:
【中文标题】私有服务器的 Firebase 身份验证【英文标题】:Firebase authentication for private server 【发布时间】:2019-02-14 02:13:14 【问题描述】:我正在开发一个 Flutter 应用,并希望使用 Firebase 身份验证服务让我的用户能够使用以下方式注册/登录:
电子邮件/通过 谷歌 脸书我有一个带有 mysql 数据库的 lumen 后端 REST 服务器。
问题:通过大量的 firebase 文档,我无法理解这应该如何工作的整个流程。
我可以使用该应用成功创建用户,并且他们会出现在 Firebase 控制台中,但是,我不知道如何使他们能够安全地与我的后端服务器通信。
我希望 Firebase 像 AWS cognito 那样发布访问和刷新令牌,用于我在应用程序和后端之间的私人通信。相反,它发出一个“ID 令牌”,即 JWT 令牌,应在后端进行验证。但是验证后我该怎么办?
如何将我的数据库中的用户链接到经过身份验证的用户?存储在数据库中以映射到经过身份验证的用户的东西是什么?
我是否必须通过 Admin SDK 生成自定义令牌?
或者 ID Token 是应该在每个请求上从客户端传递到后端然后验证的东西?但是,我要从这个 ID 令牌到我的数据库中放入什么来将经过身份验证的用户与他们的数据联系起来?
【问题讨论】:
【参考方案1】:这就是我现在的做法。效果很好。
-
在您的后端服务器上安装 Firebase admin sdk,如果您使用的是 php,以下是我所遵循并完美工作的内容:PHP Firebase Admin sdk
在您的客户端(应用程序)中使用 firebase SDK 获取 firebase idToken,我为此使用了 Firebase auth package。
发送 idToken 到您的后端
使用 Admin SDK 验证 idToken,如果验证成功则返回一个 Firebase 用户对象。您可以对其执行各种管理操作(修改、删除、获取不同的数据等)。
从 Firebase 用户对象中获取 uid。
将 uid 存储在您的数据库中。
现在,每次经过身份验证的用户向您的后端服务器发出请求时,您都会将 idToken 附加到请求的标头中。
每次验证(参见第 4 步)后端服务器上的 idToken 时,如果验证成功,您将提取 uid 以了解要在数据库中查询的用户。
欢迎对此进行任何 cmets/改进 :)
【讨论】:
感谢您的解决方案!我有一个基本问题!我正在尝试通过 ios 将 Firebase Auth 同步到 MySQL(这是我的问题***.com/questions/54703955/…)我认为,为了验证用户,在“注册”步骤中,我需要存储一个公用密钥(例如电子邮件、用户 ID)提前在 Firebase Auth 和 MySQL 中。但是,根据您的解释,首先从 Firebase 获取 uid,然后将 uid 存储在数据库中是第二个。 “验证”过程不是比较两个密钥是否相同? 非常热门的话题,没有任何其他答案(( 另见firebase.google.com/docs/auth/admin/verify-id-tokens @czmarc 为什么要存储 firebase uid 在步骤 8 中进行了说明。即对于来自应用程序的每个后续请求,您将发送 idToken,通过在后端验证它,您将获得一个 firebase 用户对象,该对象反过来为您提供 uid,这就是您如何知道要在 mysql 数据库中对哪个记录执行操作的方式。请注意,idToken 会在一段时间后发生变化。这就是为什么您总是需要验证它并获取 uid。对于第二个问题,是的,用户或某些数据可以与uid相关联。 如果您的网站就像带有简单 mysql(表用户和问题)的 ***。假设用户已正确登录并发布了一个新问题,它将在标头中发送 tokenid,服务器将验证并返回 uid。那么,你会以哪种方式在你的服务器上使用 uid 呢?您是否会基于 uid 进行简单的选择查询,以检查用户是否真的存在于您的 users 表中,然后在问题表上插入新问题,或者您是否会直接插入一个新问题,假设 uid 为“user_id”(“提问者') 在问题表上,或任何其他方式?以上是关于私有服务器的 Firebase 身份验证的主要内容,如果未能解决你的问题,请参考以下文章
Firebase AppCheck for Firebase 身份验证
使用 Firebase 和 ReactJS 的基于角色的身份验证