在使用 Firestore 时将 Firebase Auth UID 存储在 Cookie 中 - 这安全吗?



我最近和我的另一位程序员伙伴发生了争执,关于将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令牌的寿命有限(目前约为一个小时(,这限制了意外暴露的风险。

最新更新