我正在设计一个基于 VueJs 的应用程序(让它称之为TodoList应用程序)(对于 UI )+ NodeJs (对于后端,将在Google Cloud Platform中运行)+ Firestore (对于 auth +数据库)。
我已经浏览了Google的大量文档(有时候是多余的!)来实现可行的功能,但我不确定它是否符合生产要求。
情况:
我在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,我就可以对我的数据库执行任何操作。
参考
感谢您的帮助!
答案 0 :(得分:1)
管理员SDK将始终具有对数据库的完全访问权限。
由于客户端从不直接访问Firebase,因此应完全禁用对所有文档的访问。您的API仍然可以访问
match /{document=**} {
allow read, write: if false;
}
答案 1 :(得分:0)
我认为从客户端验证访问令牌后,您可以在firestore-admin的资源中发送uid,firestore规则如下:
allow read, write: if request.resource.data.uid == userId;