【问题标题】:Restrict firestore access to admin-sdk限制对 admin-sdk 的 firestore 访问
【发布时间】: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,我就可以对我的数据库执行任何操作。

参考文献

感谢您的帮助!

【问题讨论】:

  • 在这种情况下通过自定义后端的原因是什么?为什么不让您的客户直接访问 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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 已测试:除非安全规则全部设置为 true,否则 Admin SDK 无法在 Firestore Emulator 上运行:github.com/firebase/firebase-tools/issues/…
    • @AntonioOoi 你确定吗?我没有在模拟器上测试,但实时版本对我来说很好
    • 在正确设置的情况下,至少最新版本的 Firestore Emulator 允许对 admin sdk 进行完全访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 2019-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多