【发布时间】:2017-12-11 01:05:54
【问题描述】:
看起来,当 Firebase 从 v2 迁移到 v3.x SDK(现在迁移到 v4)时,他们决定删除自动会话到期选项,转而支持始终经过身份验证的模型。
- Firebase 3.x - Token / Session Expiration
- https://groups.google.com/forum/#!topic/firebase-talk/uYMlQny1Jb4
这是一个不错的功能,但从网络安全的角度来看,我发现了一些问题,因为这是带有 Firebase 生成令牌的 Firebase SDK 的唯一选项,例如 email and password authentication(一些其中在链接的谷歌小组讨论中得到了很好的解释)。
在页面退出时调用user.signOut() 的常用建议存在一些漏洞。也就是说,如果客户端崩溃了,那么这段代码永远不会被执行,因此策略就会崩溃。 “在页面加载时退出”建议也有漏洞:
- 每次页面加载/重新加载时强制所有用户登录(不是目标)
- 由于 Firebase 将大部分内容推送到客户端,因此没有什么能阻止某人创建一个尝试访问目标 Firebase 的脚本没有
user.signOut()
我正在寻找一种策略,从网络安全的角度来看,它可以让用户选择加入“始终经过身份验证”策略,而不是默认策略(即带有“记住我”按钮)。
我想出的一个策略如下:
- 用户登录
- 获取为该会话生成的 JWT 并将其写入 Firebase
- 如果用户在登录时没有选择“记住我”,请设置一个 onDisconnect 处理程序,从用户令牌列表中清除令牌
- 在 Firebase 安全规则中,确保发出请求的用户的 JWT 在该用户的令牌列表中
这感觉更安全,因为即使浏览器崩溃,onDisconnect 方法仍然会执行。 但是,JWT 不能用作 Firebase 规则变量 (only the contents of the token)!
鉴于这些问题/有缺陷的方法,如何在浏览器关闭/崩溃后(甚至在预定时间段后)使用 Firebase 生成的令牌使会话无效?
【问题讨论】:
标签: session firebase firebase-authentication