Firestore - 如何在没有 Auth 的情况下设置安全规则,但基于 Android client/request 数据

Firestore - How to setup security rule without Auth, but based on Android client/request data

在我的例子中,Firestore 数据库如下所示,其中每个 Android 客户端将有一个文档映射到 his/her 设备 Document_sdfljkhsdio ( specific to Android User 1 )

FireStoreCollection
     Document_sdfljkhsdio  ( specific to Android User 1 ) 
            Collection_xyz 
                  Document_xyz                      
     Document_kjjkssefd  ( specific to Android User 2 ) 
            Collection_xyz 
                  Document_xyz                      
     Document_sqdfwdfsme  ( specific to Android User 3 ) 
            Collection_xyz 
                  Document_xyz  

我没有实施 Google 身份验证,而是想将文档名称 Document_sdfljkhsdio 作为请求数据发送,并在 Firebase 控制台

中将其与某些规则匹配
service cloud.firestore {
  match /databases/{database}/documents {
    match /document/{document_sent_from_client}/ {
      allow read, write: if request.document_sent_from_client == document_sent_from_client;
    }
  }
} 

我不确定是否可以从 Android 设备发送文档名称,如果可以,请建议。

并且还建议它是否是正确的方法,建议您是否有更好的方法?

提前感谢您的帮助。

听起来完全可行。要从 Android 客户端传递 document_sent_from_client,只需构建一个带有 /document/document_sent_from_client 路径的 DocumentReference。修改自 the documentation:

DocumentReference docRef = db.collection("document").document("document_sent_from_client");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document != null) {
                Log.d(TAG, "DocumentSnapshot data: " + task.getResult().getData());
            } else {
                Log.d(TAG, "No such document");
            }
        } else {
            Log.d(TAG, "get failed with ", task.getException());
        }
    }
});

但是安全规则在这里没有帮助:如果客户端请求现有文档(即,如果他们知道文档的路径),他们将得到结果。如果他们请求一个不存在的文档(即如果他们不知道文档的路径),任务将失败。

你基本上依赖于 document_sent_from_client 中的密钥是合理不可猜测的。这种 "security by obscurity" 在没有经过身份验证的用户的情况下相当常见。