我正在设计一个应用程序(让我们称之为TodoList应用程序)基于VueJs(用于UI)NodeJs(用于后端,将在Google Cloud Platform中运行)Fi恢复(用于auth数据库)。
我已经浏览了谷歌的巨大留档(有时是多余的!)来实现一些应该有效的东西,但我不确定它是否能证明生产。
情况:
我已经在我的Fi恢复数据库上设置了一些安全规则:
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId}/{document=**} {
allow read, write: if request.auth.uid == userId;
}
}
}
这样我就不希望任何登录的用户访问来自另一个用户的数据。
问题:
由于Firebase AdminSDK对我的Fi恢复数据库拥有完全权限,我如何确保不会有任何安全问题。目前,我只是在验证发送到我后端的请求中的访问令牌,但是…有些事情让我觉得不对劲!
代码:
在客户端:
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
});
如您所见,一旦我验证了访问令牌并检索了uid,我就可以在我的数据库上做任何事情。
参考文献
谢谢你的帮助!
管理员SDK将始终拥有对数据库的完全访问权限。
由于客户端永远不会直接访问Firebase,您应该完全禁用对所有文档的访问。您的API仍然有权访问
match /{document=**} {
allow read, write: if false;
}
我认为在从客户端验证访问令牌后,您可以在fireport-admin的资源中发送uid,firesion-admin规则如下所示:
allow read, write: if request.resource.data.uid == userId;