使用Firestore时在Cookie中存储Firebase身份验证UID-这安全吗?

使用Firestore时在Cookie中存储Firebase身份验证UID-这安全吗?,firebase,cookies,google-cloud-firestore,firebase-authentication,Firebase,Cookies,Google Cloud Firestore,Firebase Authentication,我最近与我的另一位程序员同事就在启用了sameSite:'strict'的cookie中存储Firebase身份验证UID(只是UID,其他什么都没有)一事发生了争论 争论是关于什么的 目前,我正在一个Nuxt JS项目中工作,我将用户的uid保存在onAuthStateChange()事件中的cookie中,并启用sameSite:“strict”,这样我就可以在serverMiddleware代码中获取它并使用它做一些事情 我已经检查了这个firebase文档,它展示了如何将JWTidTok

我最近与我的另一位程序员同事就在启用了
sameSite:'strict'
的cookie中存储Firebase身份验证UID(只是UID,其他什么都没有)一事发生了争论

争论是关于什么的 目前,我正在一个Nuxt JS项目中工作,我将用户的uid保存在
onAuthStateChange()
事件中的cookie中,并启用
sameSite:“strict”
,这样我就可以在
serverMiddleware
代码中获取它并使用它做一些事情

我已经检查了这个firebase文档,它展示了如何将JWT
idToken
存储在cookie中,然后在服务器中对其进行解码

事实上,这就是我最初编写工作代码的人。但是由于某些要求,如果我存储
uid
,这将非常有用。所以,我做到了。然后我开始阅读关于如何破解我自己的数据,看看是否有人可以从cookie中的
uid
中破坏我的数据

然后我偶然发现了这个firebase文档:它展示了如何使用REST API获取firestore数据,我发现您需要在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
并查看data,所以在那一点上,没什么重要的

但我确实说过,如果有人使用firebase Realtime database,那么我不建议将
uid
存储在cookie中,因为实时数据库提供了简单的REST API,无需任何身份验证层即可获取数据。当时我建议改用JWT
idToken

那么,最后一个问题是什么? 最后一个问题是:

如果有人在他的项目中使用firebase SDK使用firebase auth&firebase cloud firestore(非实时数据库),那么在cookie中只存储
uid
而不是存储JWT
idToken
是否安全,如果这将减少使用
idToken
时的代码复杂性和代码执行时间

我很想知道你对这些的想法,因为除了两个程序员之外,还有很多经验丰富的开发人员在争论


我的朋友一直告诉我,在cookie中存储
uid
是不确定的,但当我问他具体原因时,他没有具体的答案。因为什么是安全的,什么不是通用的,并且随着工具的改变而改变。但在这种情况下,你们会怎么想?我知道通常在大多数情况下,这不是一件安全的事情,但我只询问这个特定的上下文。

事实上,向其他用户公开用户的UID以识别该用户是相当常见的。请参阅


将UID存储在cookie中,或者在中间件中读取cookie,都没有什么不安全的地方。但是,如果中间件随后假定UID是经过身份验证的用户,则存在安全风险

是什么阻止任何其他用户将您或我的UID放入该cookie,从而访问您或我的数据

还要注意的是,UID不会随着时间的推移而改变,所以如果有一个(甚至是无意中)泄漏,您可以永远模拟该用户


另一方面,ID令牌的寿命有限(目前约为一小时),这限制了它们意外暴露的风险。

你说“这样我就可以在我的服务器中间件代码中获取它并处理它”。这是否安全取决于“东西”你可以这样做。但是如果这些东西使用UID作为唯一的手段来识别正在进行身份验证的用户,这确实是不安全的,因为任何人都可以将任何UID放入这样的cookie中。我强烈建议大大缩短你的问题(我们对你朋友的意见不感兴趣,因为他们没有问问题),并关注您对该UID的实际操作,以及您担心的具体风险。您好,感谢您的评论。假设我只是在我的服务器中间件中执行firestore db get请求。将该数据附加到req并在我的前端获取。我不是在服务器中检查用户身份验证。我只是想从用户的db中提取一些数据已登录。因此,如果用户登录uid cookie存在,我将执行firestore调用。现在您认为如何?对于这个冗长的问题,也很抱歉。我们刚刚讨论了所有问题。将uid存储在cookie中,或者在中间件中读取该cookie,都没有什么不安全的地方。但是如果中间件假定uid是身份验证人icated用户,您有安全风险。是什么阻止任何其他用户将您或我的UID放入该cookie,从而访问您或我的数据?如果您在应用程序的代码中的任何其他地方显示UID(这是很常见的),任何人都可以拿起它并开始传递它。字符串本身没有任何数据,但如果你像Frank建议的那样公开使用该UID的机制,那么实际上你允许任何人将这些机制与他们知道的任何UID一起使用。事实上,向其他用户公开用户的UID以识别该用户是相当常见的。请参阅lso请注意,UID不会随时间而改变,因此,如果有一个(即使是无意中)泄漏,您可以永远模拟该用户。另一方面,ID令牌的寿命有限(目前约为一小时),这限制了它们意外暴露的风险。非常感谢您的回答。只需一个问题,即使是JWT IDToken也可以使用