我们正在从我们的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。)
答案 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();
}