【问题标题】:Firestore: Transactions giving permission deniedFirestore:授予权限的交易被拒绝
【发布时间】:2018-04-04 02:03:31
【问题描述】:

我们正在从我们的 Java 应用引擎实例访问 Firestore

非事务性请求成功,但事务失败并出现以下错误: firestore: PERMISSION_DENIED: Missing or insufficient permissions

交易示例

final long updatedValue = 15;

Firestore db = firebaseManager.getFirestore();
CollectionReference fooCollectionRef = db.collection(SOME_COLLECTION);
DocumentReference fooDocumentRef = fooCollectionRef.document(fooId);

final ApiFuture<Long> future = db.runTransaction(transaction -> {
    DocumentSnapshot snapshot = transaction.get(fooDocumentRef).get();
    transaction.update(fooDocumentRef, SOME_FIELD, updatedValue);
    return updatedValue;
});
return future.get();

据我所知,我们对开发项目的权限是完全开放的:

service cloud.firestore {
    match /databases/{database}/documents {
        match /{document=**} {
            allow read, write;
        }
    }
}

根据我的阅读,允许 writes 也应该允许事务更新工作,但它们和 sime get 调用都不起作用。

有谁知道我是否遗漏了一个步骤/是否设置了不正确的权限?

(我看到过其他类似的关于 Firestore 权限被拒绝错误的问题,但在这些情况下,规则更加具体。目前,这个项目甚至不需要 auth 来访问 Firestore。) p>

【问题讨论】:

  • 试试allow read, write: if true;
  • @Hareesh 没有改变,不能解决问题。

标签: java firebase google-cloud-firestore gcp


【解决方案1】:

我遇到了同样的问题,但我设法解决了它。设置一个服务帐户并将您的 Firestore 实例指向该帐户。您可以创建服务帐户密钥here。这是一个示例代码块,展示了如何使用服务帐户。 SERVICE_ACCOUNT_PATH 是一个包含服务帐户路径的字符串,PROJECT_ID 是一个包含您的项目 ID 的字符串。

private static void authenticate() throws Exception {
     FirestoreOptions firestoreOptions = FirestoreOptions.newBuilder()
          .setCredentials(ServiceAccountCredentials.fromStream(new FileInputStream(SERVICE_ACCOUNT_PATH)))
          .setProjectId(PROJECT_ID).build();

     database = firestoreOptions.getService();
}

【讨论】:

  • 我确实尝试过这个,但出现了其他错误。我们暂时改用单独的 get/update 调用而不是事务 - 当我再次访问此代码时,我会更新以通知您这是否解决了问题。
最近更新 更多