使用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文档,它展示了如何将JWTidToken
存储在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,无需任何身份验证层即可获取数据。当时我建议改用JWTidToken
那么,最后一个问题是什么?
最后一个问题是:
如果有人在他的项目中使用firebase SDK使用firebase auth&firebase cloud firestore(非实时数据库),那么在cookie中只存储uid
而不是存储JWTidToken
是否安全,如果这将减少使用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也可以使用