限制对admin-sdk的firestore访问

Bik*_*mat 7 authentication node.js firebase firebase-admin google-cloud-firestore

我正在设计一个基于VueJs(用于UI)+ NodeJs(用于后端,将在Google Cloud Platform中运行)+ Firestore(用于auth +数据库)的应用程序(我们称之为TodoList应用程序).

我已经浏览了Google的大量文档(有时是多余的!)来实现应该有用的东西,但我不确定它是否符合生产要求.

情况:

  • 由于基于密码的Firebase身份验证(以及用户的凭据,包括他的accessToken,存储在我的Vuex商店中),用户已在我的VueJs应用程序上登录.
  • 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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这样我就不希望任何记录的用户访问其他用户的数据.

题:

由于Firebase Admin SDK对我的Firestore数据库具有完全权限,因此如何确保不会出现任何安全问题.现在,我只是验证请求中发送的accessToken到我的后端,但......有些东西让我觉得这个错了!

码:

在客户端:

auth.onAuthStateChanged((user) => {
  if (user) {
    // Save the user credentials
  }
}
Run Code Online (Sandbox Code Playgroud)

在服务器端:

// 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
  });
Run Code Online (Sandbox Code Playgroud)

如您所见,一旦我验证了accessToken并检索了uid,我就可以对我的数据库执行任何操作.

参考

谢谢你的帮助!

Lan*_*ane 13

管理 SDK 将始终拥有对数据库的完全访问权限。

由于客户端从不直接访问 Firebase,因此您应该完全禁用对所有文档的访问。您的 API 仍然可以访问

match /{document=**} {
  allow read, write: if false;
}
Run Code Online (Sandbox Code Playgroud)


小智 0

我认为从客户端验证访问令牌后,您可以在 firestore-admin 资源中发送 uid,并且 firestore 规则如下所示:

allow read, write: if request.resource.data.uid == userId;
Run Code Online (Sandbox Code Playgroud)