我最近和我的另一位程序员伙伴发生了争执,关于将Firebase Auth UID(只是uid没有别的(存储在启用了sameSite: 'strict'
的cookie中。
争论是关于什么的
目前,我正在一个Nuxt JS项目中工作,我将用户在事件onAuthStateChange()
uid保存在启用了sameSite: 'strict'
的cookie中,以便我可以在我的serverMiddleware
代码中获取它并使用它做一些事情。
我已经检查了这个关于管理 cookie 的 firebase 文档,它显示了如何将 JWTidToken
存储在 cookie 中,然后在服务器中对其进行解码。
事实上,这就是我最初编写工作代码的人。但是由于某些要求,如果我存储uid
,那将非常有帮助。所以,我做到了。然后我开始阅读关于如何破解我自己的数据,看看是否有人可以从 cookie 中的uid
中损害我的数据。
然后我偶然发现了这个 firebase 文档:使用 Cloud Firestore REST API,它展示了如何使用 REST API 获取火烧区数据,我发现你需要在 API 调用的标头中提供 Google OAuth 2.0 令牌才能让它工作,否则即使你输入了正确的 URL 包含所有集合名称和所有内容(局外人很难知道, 但让我们假设他知道(,你只会得到这个:
{
"error": {
"code": 403,
"message": "Missing or insufficient permissions.",
"status": "PERMISSION_DENIED"
}
}
我还尝试在浏览器控制台中运行代码,以便将数据从我的项目中清除出来。但这并没有奏效。
现在,为了获得Google OAuth 2.0令牌,该人必须需要登录我的帐户,这并不容易,因为我有一个唯一的长密码以及带有电话OTP和推送通知的两步身份验证。此外,如果有人可以登录我的Google帐户,他可以轻松地转到console.firebase.com
并查看数据,因此在这一点上,一切都无关紧要。
但我确实说过,如果有人使用Firebase实时数据库,那么我不建议将uid
存储在cookie中,因为实时数据库提供了简单的REST API,没有任何身份验证层来获取数据。当时我建议改用 JWTidToken
。
那么,最后一个问题是什么?
最后一个问题是:
如果有人在他的项目中使用 firebase SDK 使用 firebase auth 和 firebase cloud firestore(不是实时数据库(,那么在 cookie 中存储uid
而不是存储 JWT 是否安全idToken
如果它会降低代码复杂性和代码执行时间,而不是使用idToken
?
我很想知道你对这些的想法,因为除了两个程序员之外,还有许多超级有经验的开发人员在争论。
我的朋友一直告诉我,将uid
存放在饼干中并不确定,但是当我问他究竟为什么时,他没有具体的答案。因为什么是安全的,什么是不普遍的,随着您更换工具而变化。但是在这种确切的背景下,你们怎么看?我知道通常在大多数情况下这不是一件安全的事情,但我只问这个特定的背景。
事实上,将用户的 UID 公开给其他用户以识别该用户是相当常见的。请参阅 Firebase - auth.uid 是共享密钥吗?
将 UID 存储在 cookie 中以及在中间件中读取该 cookie 并没有什么不安全的。但是,如果您的中间件随后假定 UID 是经过身份验证的用户,则存在安全风险。
是什么阻止任何其他用户将您或我的 UID 放入该 cookie,从而访问您或我的数据?
另请注意,UID 不会随时间而改变,因此如果发生泄漏(即使是无意的(,您可以永远模拟该用户。
另一方面,ID令牌的寿命有限(目前约为一个小时(,这限制了意外暴露的风险。