Firestore:拒绝权限的交易

时间:2017-10-23 13:37:52

标签: java firebase google-cloud-firestore gcp

我们正在从我们的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;
        }
    }
}

根据我的阅读,允许写入也应该允许事务更新工作,但是他们和sime 获取调用都不起作用。

有人知道我是否缺少步骤/设置了错误的权限?

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

1 个答案:

答案 0 :(得分: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();
}