Node.js 限制firestore对管理员sdk的访问
我正在设计一个基于VueJs(用于UI)+NodeJs(用于后端,将在谷歌云平台上运行)+Firestore(用于auth+数据库)的应用程序(我们称之为TodoList应用程序) 我浏览了谷歌的大量文档(有时是多余的!)以获得一些本应有效的东西,但我不确定它是否符合生产要求 情况:Node.js 限制firestore对管理员sdk的访问,node.js,firebase,authentication,google-cloud-firestore,firebase-admin,Node.js,Firebase,Authentication,Google Cloud Firestore,Firebase Admin,我正在设计一个基于VueJs(用于UI)+NodeJs(用于后端,将在谷歌云平台上运行)+Firestore(用于auth+数据库)的应用程序(我们称之为TodoList应用程序) 我浏览了谷歌的大量文档(有时是多余的!)以获得一些本应有效的东西,但我不确定它是否符合生产要求 情况: 由于Firebase基于密码的身份验证,用户已登录我的VueJs应用程序(用户的凭据,包括他的accessToken,存储在我的Vuex存储中) Firebase管理SDK正在我的后端上运行 我的VueJs应用程
- 由于Firebase基于密码的身份验证,用户已登录我的VueJs应用程序(用户的凭据,包括他的accessToken,存储在我的Vuex存储中)
- Firebase管理SDK正在我的后端上运行
- 我的VueJs应用程序正在请求我的后端
- 在客户端请求中发送的后端
- 感谢Admin SDK,是我的后端请求我的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,我就可以在数据库上执行任何操作
参考资料
谢谢你的帮助 我认为在从客户端验证访问令牌后,您可以在firestore admin的资源中发送uid,firestore规则如下所示:
allow read, write: if request.resource.data.uid == userId;
管理员SDK将始终具有对数据库的完全访问权限。 由于客户端从未直接访问Firebase,因此应完全禁用对所有文档的访问。您的API仍将具有访问权限
match /{document=**} {
allow read, write: if false;
}
在这种情况下,使用自定义后端的原因是什么?为什么不让您的客户直接访问Firestore?在这种情况下,规则将被完全执行。我需要对从Firestore检索到的数据执行一些计算。因此,我更喜欢有一个后端,将做艰苦的工作:)我注意到。我可能会找到一种方法,通过我的后端将用户id传递给只适用于实时数据库的安全规则(如我的客户端直接访问firestore)。Admin SDK中的Firestore API目前不强制执行规则。哼,所以没有办法让后端服务模拟用户来限制对服务器进程的访问,不是吗?一个(坏)主意是在请求数据库之前,使用
databaseAuthVariableOverride:{uid:“user uid”}
为每个客户端请求初始化firebaseApp到我的后端…测试:除非安全规则都设置为true,否则Admin SDK在Firestore Emulator上不工作:@Antoniooi你确定吗?我没有在emulator上进行测试,但实时版本可以正常工作