限制对 admin-sdk 的 firestore 访问
Posted
技术标签:
【中文标题】限制对 admin-sdk 的 firestore 访问【英文标题】:Restrict firestore access to admin-sdk 【发布时间】:2018-09-02 09:10:41 【问题描述】:我正在设计一个基于 VueJs(用于 UI)+ NodeJs(用于后端,它将在 Google Cloud Platform 中运行)+ Firestore(用于 auth + 数据库)。
我浏览了 Google 的大量文档(有时是多余的!)以实现一些应该可以工作的东西,但我不确定它是否可以生产。
情况:
由于 Firebase 的基于密码的身份验证,用户已登录我的 VueJs 应用程序(并且用户的凭据,包括他的 accessToken,都存储在我的 Vuex 商店中)。 Firebase Admin SDK 正在我的后端运行。 我的 VueJs 应用正在请求我的后端。 客户端请求中发送的后端verifies the accessToken 感谢 Admin SDK,我的后端请求了我的 Firestore 数据库我在我的 Firestore 数据库上设置了一些安全规则:
service cloud.firestore
match /databases/database/documents
match /users/userId/document=**
allow read, write: if request.auth.uid == userId;
这样我就不希望任何登录的用户访问其他用户的数据。
问题:
由于 Firebase Admin SDK 对我的 Firestore 数据库拥有完全权限,我如何确保不会出现任何安全问题。目前,我只是在验证发送到后端的请求中的 accessToken,但是......有些东西让我觉得这有点不对劲!
代码:
在客户端:
auth.onAuthStateChanged((user) =>
if (user)
// Save the user credentials
在服务器端:
// idToken comes from the client app (shown above)
// ...
admin.auth().verifyIdToken(idToken)
.then(function(decodedToken)
var uid = decodedToken.uid;
// Retrieve or add some data in /users/userId/document=**
).catch(function(error)
// Handle error
);
如您所见,一旦我验证了 accessToken 并检索了 uid,我就可以对我的数据库执行任何操作。
参考文献
https://firebase.google.com/docs/admin/setup https://firebase.google.com/docs/auth/admin/verify-id-tokens https://firebase.google.com/docs/reference/admin/node/admin.firestore感谢您的帮助!
【问题讨论】:
在这种情况下通过自定义后端的原因是什么?为什么不让您的客户直接访问 Firestore?在这种情况下,规则将得到全面执行。 我需要对从 Firestore 检索到的数据执行一些计算。因此,我更喜欢有一个能够完成艰苦工作的后端:) 我注意到firebase.google.com/docs/database/admin/…。我可能会找到一种方法通过我的后端传递用户的 ID 以与安全规则匹配(例如,如果我的客户端直接访问 firestore) 这只适用于实时数据库。 Admin SDK 中的 Firestore API 目前不强制执行规则。 嗯,所以没有办法让后端服务模拟用户来限制对服务器进程的访问,不是吗?一个(坏的)想法是在请求数据库之前为每个客户端向我的后端请求使用databaseAuthVariableOverride: uid: "user-uid"
初始化一个firebaseApp ...
【参考方案1】:
我认为在客户端验证访问令牌后,您可以在 firestore-admin 的资源中发送 uid,firestore 规则如下:
allow read, write: if request.resource.data.uid == userId;
【讨论】:
【参考方案2】:admin SDK 将始终拥有对数据库的完全访问权限。
由于客户端从不直接访问 Firebase,因此您应该完全禁止访问所有文档。您的 API 仍然可以访问
match /document=**
allow read, write: if false;
【讨论】:
已测试:除非安全规则全部设置为 true,否则 Admin SDK 无法在 Firestore Emulator 上运行:github.com/firebase/firebase-tools/issues/… @AntonioOoi 你确定吗?我没有在模拟器上测试,但实时版本对我来说很好 在正确设置的情况下,至少最新版本的 Firestore Emulator 允许对 admin sdk 进行完全访问。以上是关于限制对 admin-sdk 的 firestore 访问的主要内容,如果未能解决你的问题,请参考以下文章
限制通过VPC网络访问Google Cloud Firestore。
Firebase Firestore 中一个集合下的文档数量限制