【问题标题】:Firebase session expirationFirebase 会话到期
【发布时间】:2017-12-11 01:05:54
【问题描述】:

看起来,当 Firebase 从 v2 迁移到 v3.x SDK(现在迁移到 v4)时,他们决定删除自动会话到期选项,转而支持始终经过身份验证的模型。

这是一个不错的功能,但从网络安全的角度来看,我发现了一些问题,因为这是带有 Firebase 生成令牌的 Firebase SDK 的唯一选项,例如 email and password authentication(一些其中在链接的谷歌小组讨论中得到了很好的解释)。

在页面退出时调用user.signOut() 的常用建议存在一些漏洞。也就是说,如果客户端崩溃了,那么这段代码永远不会被执行,因此策略就会崩溃。 “在页面加载时退出”建议也有漏洞:

  1. 每次页面加载/重新加载时强制所有用户登录(不是目标)
  2. 由于 Firebase 将大部分内容推送到客户端,因此没有什么能阻止某人创建一个尝试访问目标 Firebase 的脚本没有user.signOut()

我正在寻找一种策略,从网络安全的角度来看,它可以让用户选择加入“始终经过身份验证”策略,而不是默认策略(即带有“记住我”按钮)。

我想出的一个策略如下:

  1. 用户登录
  2. 获取为该会话生成的 JWT 并将其写入 Firebase
  3. 如果用户在登录时没有选择“记住我”,请设置一个 onDisconnect 处理程序,从用户令牌列表中清除令牌
  4. 在 Firebase 安全规则中,确保发出请求的用户的 JWT 在该用户的令牌列表中

这感觉更安全,因为即使浏览器崩溃,onDisconnect 方法仍然会执行。 但是,JWT 不能用作 Firebase 规则变量 (only the contents of the token)!

鉴于这些问题/有缺陷的方法,如何在浏览器关闭/崩溃后(甚至在预定时间段后)使用 Firebase 生成的令牌使会话无效?

【问题讨论】:

    标签: session firebase firebase-authentication


    【解决方案1】:

    这里有一个建议: ID 令牌有一个 auth_time 字段。这是用户进行身份验证的时间,您可以强制使用所需的任何会话长度。如果您在服务器上验证令牌或使用 https://firebase.google.com/docs/reference/security/database/#now 和 auth.token.auth_time 通过数据库规则验证令牌,则可以强制执行此操作。检查https://firebase.google.com/docs/reference/security/database/#authtoken

    您将要求用户重新进行身份验证才能访问数据。重新认证将更新令牌中的 auth_time。

    这是一种更好的方法,因为跟踪所有 ID 令牌不会很好地扩展,并且 ID 令牌会在一小时后过期,新的令牌将在用户返回应用程序后刷新,但会保持相同的 auth_time。

    不确定这是否会减轻您的担忧,但 Firebase 正在研究以下功能:

    1. 能够为 Web 身份验证指定持久性。这类似于 sessionOnly auth 在 Firebase 3.x 中的工作方式。这将使“记住我”功能易于实现。
    2. 撤销会话的能力。

    【讨论】:

    • 嘿@bojeil,感谢您的建议。我认为在多租户场景中存在一些边缘情况(用户可能会通过更新auth_time 在不知不觉中“扩展”登录到同一帐户的其他用户的会话),但同时这是一个不错的解决方案.这些其他功能的任何时间表? :)
    • 您的意思是“用户可能在不知不觉中通过更新 auth_time 来“扩展”登录到同一帐户的其他用户的会话”。 auth_time 仅在重新认证或登录时更新。目前这些功能还没有明确的时间表。
    • 我写了一个关于用户 A 和用户 B 从不同机器登录的完整解释,其中一台基本上更新了另一台的 auth_time,但后来意识到我很傻,因为 auth_time 是不共享,因为它是他们各自 JWT 的一部分。谢谢!要考虑的另一个功能是允许通过电子邮件和密码身份验证自定义 JWT 声明定义,而不需要单独的服务器。
    • 自定义 JWT 声明必须通过受信任的机构(开发人员服务器上的管理 SDK、Firebase 函数等)而不是客户端提供。自定义 JWT 声明用于设置访问级别(如果用户是管理员、付费订阅者等)。 Firebase 也在研究这一点,因为它是一项非常重要的功能。
    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2014-07-08
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多