我正在设计一个基于 VueJs (用于UI)的应用程序(我们称之为TodoList应用程序) NodeJs (用于后端,将在Google Cloud Platform中运行) Firestore (用于auth数据库) .
我已经浏览了Google的大量文档(有时是多余的!)来实现应该工作的东西,但我不确定它是否符合 生产环境 要求 .
Situation:
-
由于基于密码的Firebase身份验证(以及用户的凭据,包括他的accessToken,存储在我的Vuex商店中),用户已在我的VueJs应用程序上登录 .
-
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;
}
}
}
所以我不希望任何记录的用户访问其他用户的数据 .
Question:
由于Firebase Admin SDK对我的Firestore数据库具有完全权限,因此如何确保不会出现任何安全问题 . 现在,我只是验证请求中发送的accessToken到我的后端,但......有些东西让我觉得这个错了!
Code:
在客户端:
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,我就可以对我的数据库执行任何操作 .
References
-
https://firebase.google.com/docs/auth/admin/verify-id-tokens
-
https://firebase.google.com/docs/reference/admin/node/admin.firestore
谢谢你的帮助!
1 回答
我认为在从客户端验证访问令牌后,您可以在firestore-admin的资源中发送uid,并且firestore规则会这样: