限制对 admin-sdk 的 firestore 访问

Posted

技术标签:

【中文标题】限制对 admin-sdk 的 firestore 访问【英文标题】:Restrict firestore access to admin-sdk 【发布时间】: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 ... 【参考方案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 进行完全访问。

以上是关于限制对 admin-sdk 的 firestore 访问的主要内容,如果未能解决你的问题,请参考以下文章

限制通过VPC网络访问Google Cloud Firestore。

Firebase Firestore 中一个集合下的文档数量限制

使用 CollectionGroupQuery 的子集合中的 Firestore 写入限制

使用 Firestore 限制项目时出错

Cloud Firestore 事务的限制

我可以在 Firestore 中重复使用现有字段作为分片时间戳吗?