【发布时间】:2020-02-16 08:31:56
【问题描述】:
我最近与我的另一个程序员伙伴发生了争执,关于在启用 sameSite: 'strict' 的 cookie 中存储 Firebase Auth UID(仅是 uid)。
论据是什么
目前,我正在一个 Nuxt JS 项目中工作,在该项目中,我将用户在 onAuthStateChange() 事件上的 uid 保存在启用了 sameSite: 'strict' 的 cookie 中,这样我就可以在我的 serverMiddleware 代码中获取它并用它做一些事情.
我检查了这个 firebase 文档 about managing cookie,它显示了如何将 JWT idToken 存储在 cookie 中,然后在服务器中对其进行解码。
事实上,这就是我最初为我的工作编写代码的人。但是由于某些要求,如果我存储 uid 会非常有帮助。所以,我做到了。然后我开始阅读有关如何破解我自己的数据以查看是否有人可以从 cookie 中的uid 中破坏我的数据。
然后我偶然发现了这个 firebase 文档:Use the Cloud Firestore REST API,它显示了如何使用 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 和推送通知的 2 步身份验证。此外,如果有人可以登录我的 Google 帐户,他可以轻松转到 console.firebase.com 并查看数据,所以到那时,一切都无关紧要了。
但我确实说过,如果有人使用 firebase 实时数据库,那么我不建议将 uid 存储在 cookie 中,因为实时数据库提供了简单的 REST API,无需任何身份验证层来获取数据.那时我会推荐使用 JWT idToken。
那么,最后一个问题是什么?
最后一个问题是这样的:
如果有人在他的项目中使用firebase SDK使用firebase auth和firebase cloud firestore(不是实时数据库),那么在cookie中只存储uid而不是存储JWT idToken是否安全,如果它会减少代码使用idToken的复杂性和代码执行时间?
我很想知道你对这些的看法,因为除了两个程序员在争论之外,还有很多经验丰富的开发者。
我的朋友一直告诉我,在 cookie 中存储uid 不确定,但当我问他究竟为什么时,他没有具体的答案。什么是安全的,什么不是通用的,并且随着您更改工具而变化。但是在这种确切的情况下,你们怎么看?我知道通常在大多数情况下这不是一件安全的事情,但我只是询问这个特定的上下文。
【问题讨论】:
-
你说“这样我就可以在我的 serverMiddleware 代码中抓取它并用它做一些事情”。这是否安全取决于你用它做的“东西”。但是,如果这些东西使用 UID 作为唯一的手段来识别用户是经过身份验证的,那确实是不安全的,因为任何人都可以将任何 UID 放在这样的 cookie 中。我强烈建议大大缩短您的问题(我们对您朋友的意见不感兴趣,因为他们没有提出问题),并专注于您对该 UID 的实际操作,以及您担心的具体风险。跨度>
-
您好,感谢您的评论。假设我只是在我的 serverMiddleware 中执行了一个 firestore db get 请求。将该数据附加到 req 并在我的前端获取。我没有在服务器中检查用户身份验证。我只是想从用户登录的数据库中提取一些数据。所以在这里,如果用户登录的 uid cookie 存在并且我进行 firestore 调用。现在你怎么看?也很抱歉这个冗长的问题。只是覆盖所有地面。
-
将 UID 存储在 cookie 中并在中间件中读取该 cookie 并没有什么不安全的地方。但是,如果您的中间件假设 UID 是经过身份验证的用户,那么您就有安全风险。是什么阻止任何其他用户将您或我的 UID 放入该 cookie,从而访问您或我的数据?
-
如果您在应用程序代码的其他任何地方显示 UID(这很常见),任何人都可以拿起它并开始传递它。字符串本身没有任何数据,但是如果您按照 Frank 的建议公开使用该 UID 的机制,那么您实际上允许任何人使用他们知道的任何 UID 使用这些机制。
-
事实上,将用户的 UID 暴露给其他用户以识别该用户是相当普遍的。请参阅stackoverflow.com/questions/37221760/… 另请注意,UID 不会随着时间而改变,因此如果有一个(甚至是无意的)泄漏,您可以永远冒充该用户。另一方面,ID 令牌的使用寿命有限(目前约为一个小时),这限制了它们意外暴露的风险。
标签: firebase cookies google-cloud-firestore firebase-authentication