我正在设计一个应用程序(我们称其为TodoList应用程序),基于VueJs(用于UI)+ NodeJs (用于后端,在Google Cloud Platform上运行)+ Firestore (用于身份验证 + 数据库)。
我已经浏览了谷歌的大量文档(有时是冗余的!),以实现一些可能有效但我不确定是否适用于生产环境的东西。
情况:
- 用户通过Firebase基于密码的身份验证在我的VueJs应用程序上进行了登录(用户凭据,包括他的accessToken,存储在我的Vuex store中)。
- Firebase Admin SDK在我的后端上运行。
- 我的VueJs应用程序正在请求我的后端。
- 后端验证客户端请求中发送的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
感谢您的帮助!
Admin SDK == Firestore Node.js SDK
。目前还没有办法将Firestore限定在单个用户的服务器端范围内。databaseAuthVariableOverride
仅适用于实时数据库。这个需求已经在Firebase/Firestore路线图中了。只是目前还不支持。 - Hiranya Jayathilaka