【发布时间】: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 ...
标签: node.js firebase authentication google-cloud-firestore firebase-admin