首页 > 解决方案 > 在多个 Firebase 实例之间实现单点登录

问题描述

我正在尝试在多个 Firebase 实例之间创建单点登录。假设我有一个名为 UserBase 的项目,然后我有另一个名为 Sales 的项目。两个项目都使用相同的用户,因此我将在 UserBase 项目上配置 Firebase 身份验证,并且我想使用相同的用户登录另一个项目。

我的想法是这样的:

我创建了一个连接到 UserBase 项目的网页 login.example.com,它接受用户名和密码,以及另一个将重定向到该页面的销售页面。

用户转到销售并单击“登录”,它将打开一个带有回调地址的 login.example.com 弹出窗口。成功登录后,我将使用 user.getIdToken 获取令牌并将其发送到云函数(UserBase),该函数将验证令牌并使用回调地址将其传递给另一个云函数(销售),这将返回一个令牌对于销售,此令牌将返回到销售页面,然后我将使用 signInWithCustomToken 使用有效的销售令牌登录。

像这样的东西:

TokenU 是 UserBase 的 JWT,tokenS 是 Sales 的 JWT

|Sales page| -callback-> |Login page| -tokenU-> |UserBase Cloud Function| -token?-> |Sales Cloud Function|
|          | <--tokenS-- |          | <-tokenS- |                       | <-tokenS- |                    |

一切正常,但现在我只是将未加密和未签名的 uid 从 UserBase Cloud Function 发送到 Sales Cloud Function,这显然不理想,否则任何人都可以仅使用 uid 登录。

这只是一个简化的例子,我们将有几十个连接但独立的项目,只共享用户,每个项目都有自己的数据(Firestore 和 Storage)所以为了保护我相信我需要用户存在于每个项目中,这可以通过在所有项目上创建具有相同 uid 的令牌来完成。此外,理想情况下,用户应该只为所有项目输入一次密码。

所以我有两个问题:

  1. 如何在不共享私钥的情况下安全地将用户从 UserBase Cloud Function 发送到 Sales Cloud Function?
  2. 假设问题 1 已解决,这是一个有效且安全的方案吗?

标签: firebasefirebase-authenticationjwt

解决方案


推荐阅读