有没有办法让一个人跨子域通过 firebase 进行身份验证

geo*_*oot 12 node.js web firebase firebase-authentication

我在我的网站上使用 firebase 进行身份验证,并且我想让用户身份验证会话跨子域保持活动状态。

不幸的是,firebase 使用本地存储来存储用户的会话。不幸的是,它独立于每个子域。

我已经知道您可以从服务器端使用 firebase 生成 JWT 令牌,但是它不允许用户退出站点,因为用户最终仍会登录其他子域。

Joh*_*ohn 11

在花了更长的时间之后,我打算跨子域进行单点登录,我写了一篇博客文章,详细介绍了如何实现这一点。

作为高级概述(忽略了重要的安全细节):

  1. 我们在不同的领域有三个应用程序。

    • accounts.domain.com
    • app1.domain.com
    • app2.domain.com
  2. 我们有三个 Firebase 函数

    • ...cloudfunctions.net/users-signin
    • ...cloudfunctions.net/users-checkAuthStatus
    • ...cloudfunctions.net/users-signout

为了登录:

  1. 有人导航到accounts.domain.com应用程序
  2. 他们提供身份验证信息
  3. 该身份验证信息被发送到我们的/users-signin云函数,该函数验证信息,如果有效,则设置__session包含用户 UID的签名cookie,并向客户端返回成功指示。
  4. 成功后,客户端调用/users-checkAuthStatus云函数,该函数查找签名的__sessioncookie,提取用户 UID,并使用 UID 和 firebase-admin SDK 生成自定义身份验证令牌,并将其返回给客户端。
  5. 当客户端收到此自定义身份验证令牌时,它会使用它来使用 firebase javascript SDK 进行登录。
  6. 例如,当有人导航到其他应用程序之一时app1.domain.com,该应用程序首先检查此人是否已使用 firebase javascript SDK 登录。
    1. 如果他们是,太棒了。
    2. 如果没有,它会调用/users-checkAuthStatus云函数,该函数查找签名的__sessioncookie,如果__session找到有效的cookie,则将自定义身份验证令牌返回给客户端。
      • 如果返回自定义身份验证令牌,客户端将使用它来使用 firebase sdk 为用户签名。
      • 如果未返回自定义身份验证令牌,则表示用户未通过身份验证。然后,您可以选择将它们重定向到身份验证应用程序进行登录。

同样,这是一个高级概述,它忽略了跨站点脚本攻击、实际退出等问题。有关更多信息,请查看博客文章


boj*_*eil 7

这是对的。Firebase 仅支持单主机原始会话。Firebase Auth 正在研究支持 cookie。目前没有简单的解决方案。请随时在 Firebase 论坛上申请此功能:https ://groups.google.com/forum/#!forum/firebase-talk

现在,如果您真的需要这个,这里有一个相对简单的选择:创建一个端点,它接受一个 Firebase ID 令牌并基本上为其底层用户返回一个自定义令牌(您需要使用 Admin SDK 来执行此操作,您验证然后是 ID 令牌,获取用户 UID,然后创建自定义令牌)。用户登录的子域会将 ID 令牌传递给用户仍未通过身份验证的其他子域(您可以使用 iframe 跨源 postMessage 传递它,或者将该 ID 令牌保存在 *.domain.com 策略中) . 然后,自定义令牌可用于使用自定义令牌进行 signInWithCustomToken,从而有效地在此页面上登录同一用户。

虽然这是有风险的,因为端点可能会暴露一个漏洞(它将短期令牌转换为无限期令牌)。如果 ID 令牌被泄露,攻击者基本上可以作为利用此端点的用户登录。


Tra*_*der 7

Firebase 现在似乎支持内置 cookie,因此您应该能够按照这个新指南跨子域使用它:

https://firebase.google.com/docs/auth/admin/manage-cookies