限制对Firestore的访问权限只给管理员SDK

22

我正在设计一个应用程序(我们称其为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,我就可以对我的数据库进行任何操作。

参考资料

感谢您的帮助!


2
在这种情况下,为什么要经过自定义后端?为什么不让客户端直接访问Firestore?在那种情况下,规则将得到充分执行。 - Hiranya Jayathilaka
我需要对从Firestore检索到的数据执行一些计算。因此,我更喜欢有一个后端来完成这项艰巨的工作 :) - m.lapeyre
我注意到了 https://firebase.google.com/docs/database/admin/start#authenticate-with-limited-privileges。我可以找到一种方法通过我的后端传递用户的ID,以便与安全规则匹配(例如,如果我的客户端直接访问firestore)。 - m.lapeyre
1
嗯,那么没有办法通过后端服务来模拟用户以限制对服务器进程的访问,是吗?一种(不好的)想法是在每个客户端请求我的后端之前,使用“databaseAuthVariableOverride: {uid:“user-uid”}” 初始化firebaseApp,然后请求数据库... - m.lapeyre
当涉及到服务器端的Firestore时,Admin SDK == Firestore Node.js SDK。目前还没有办法将Firestore限定在单个用户的服务器端范围内。databaseAuthVariableOverride仅适用于实时数据库。这个需求已经在Firebase/Firestore路线图中了。只是目前还不支持。 - Hiranya Jayathilaka
显示剩余5条评论
2个回答

27

管理 SDK 将始终完全访问数据库。

由于客户端从未直接访问 Firebase,因此您应完全禁用对所有文档的访问。您的 API 仍将具有访问权限。

match /{document=**} {
  allow read, write: if false;
}

已测试:除非将安全规则全部设置为true,否则Admin SDK无法在Firestore模拟器上运行:https://github.com/firebase/firebase-tools/issues/1363#issuecomment-635834971 - Antonio Ooi
@AntonioOoi 你确定吗?我没有在模拟器上测试,但是实际版本在我的电脑上运行良好。 - MSaudi
最近版本的Firestore模拟器在正确设置后允许管理员sdk完全访问。 - ThdK

0

我认为在客户端验证访问令牌后,您可以将uid发送到firestore-admin的资源中,然后firestore规则会像这样:

allow read, write: if request.resource.data.uid == userId;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接