Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 限制firestore对管理员sdk的访问_Node.js_Firebase_Authentication_Google Cloud Firestore_Firebase Admin - Fatal编程技术网

Node.js 限制firestore对管理员sdk的访问

Node.js 限制firestore对管理员sdk的访问,node.js,firebase,authentication,google-cloud-firestore,firebase-admin,Node.js,Firebase,Authentication,Google Cloud Firestore,Firebase Admin,我正在设计一个基于VueJs(用于UI)+NodeJs(用于后端,将在谷歌云平台上运行)+Firestore(用于auth+数据库)的应用程序(我们称之为TodoList应用程序) 我浏览了谷歌的大量文档(有时是多余的!)以获得一些本应有效的东西,但我不确定它是否符合生产要求 情况: 由于Firebase基于密码的身份验证,用户已登录我的VueJs应用程序(用户的凭据,包括他的accessToken,存储在我的Vuex存储中) Firebase管理SDK正在我的后端上运行 我的VueJs应用程

我正在设计一个基于VueJs(用于UI)+NodeJs(用于后端,将在谷歌云平台上运行)+Firestore(用于auth+数据库)的应用程序(我们称之为TodoList应用程序)

我浏览了谷歌的大量文档(有时是多余的!)以获得一些本应有效的东西,但我不确定它是否符合生产要求

情况:

  • 由于Firebase基于密码的身份验证,用户已登录我的VueJs应用程序(用户的凭据,包括他的accessToken,存储在我的Vuex存储中)
  • Firebase管理SDK正在我的后端上运行
  • 我的VueJs应用程序正在请求我的后端
  • 在客户端请求中发送的后端
  • 感谢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 admin的资源中发送uid,firestore规则如下所示:

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

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

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

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

在这种情况下,使用自定义后端的原因是什么?为什么不让您的客户直接访问Firestore?在这种情况下,规则将被完全执行。我需要对从Firestore检索到的数据执行一些计算。因此,我更喜欢有一个后端,将做艰苦的工作:)我注意到。我可能会找到一种方法,通过我的后端将用户id传递给只适用于实时数据库的安全规则(如我的客户端直接访问firestore)。Admin SDK中的Firestore API目前不强制执行规则。哼,所以没有办法让后端服务模拟用户来限制对服务器进程的访问,不是吗?一个(坏)主意是在请求数据库之前,使用
databaseAuthVariableOverride:{uid:“user uid”}
为每个客户端请求初始化firebaseApp到我的后端…测试:除非安全规则都设置为true,否则Admin SDK在Firestore Emulator上不工作:@Antoniooi你确定吗?我没有在emulator上进行测试,但实时版本可以正常工作