看起来像Firebase,当他们从v2移动到v3.x SDK(现在进入v4)时,决定删除自动会话到期的选项,转而使用经过身份验证的模型。
这是一个很好的功能,但从网络安全的角度来看,我发现了一些问题,因为这是使用Firebase生成的令牌(例如email and password authentication)的Firebase SDK的唯一选项(其中一些在链接的谷歌小组讨论中得到了很好的解释)。
在页面退出时调用user.signOut()
的常见建议有一些漏洞。也就是说,如果客户端崩溃,那么这个代码永远不会被执行,因此策略就会崩溃。 “登出页面加载”建议也有漏洞:
user.signOut()
我正在寻找一种更好的工作策略,从网络安全的角度来看,允许用户选择“始终认证”的策略,如果他/她选择的话,而不是默认策略(即使用“记住我”按钮)。
我提出的一个策略如下:
这感觉更安全,因为即使浏览器崩溃,onDisconnect
方法仍会执行。 但,JWT无法作为Firebase规则变量(only the contents of the token)使用!
鉴于这些问题/有缺陷的方法,如何在浏览器使用Firebase生成的令牌关闭/崩溃(甚至在预定的时间段后)后使会话无效?
答案 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正在研究以下功能: