Firebase会话到期

时间:2017-07-06 21:04:48

标签: session firebase firebase-authentication

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

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

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

  1. 每次页面加载/重新加载(而不是目标)时强制所有用户登录
  2. 由于Firebase将大部分内容推送到客户端,因此无法阻止某人创建尝试访问目标Firebase 的脚本,而不具有user.signOut()
  3. 我正在寻找一种更好的工作策略,从网络安全的角度来看,允许用户选择“始终认证”的策略,如果他/她选择的话,而不是默认策略(即使用“记住我”按钮)。

    我提出的一个策略如下:

    1. 用户登录
    2. 获取该会话生成的JWT并将其写入Firebase
    3. 如果用户在登录时未选择“记住我”,请设置onDisconnect处理程序,从该用户令牌列表中清除该令牌
    4. 在Firebase安全规则中,确保发出请求的用户的JWT位于该用户的令牌列表中
    5. 这感觉更安全,因为即使浏览器崩溃,onDisconnect方法仍会执行。 ,JWT无法作为Firebase规则变量(only the contents of the token)使用!

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

1 个答案:

答案 0 :(得分:5)

这是一个建议: 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中的工作方式。这将使'#34;记住我"功能易于实现。
  2. 撤销会话的能力。