我有一个使用firebase-admin的Java应用程序,试图观察Firestore中的集合并对其进行修改。
我有以下代码:
final GoogleCredentials credentials = GoogleCredentials
.getApplicationDefault();
final FirebaseOptions options = new FirebaseOptions.Builder()
.setCredentials(credentials).setProjectId("XXX")
.build();
FirebaseApp.initializeApp(options);
Firestore db = FirestoreClient.getFirestore();
其中“ XXX”是我的项目的三重检查ID。
稍后,它是这样的:
final ApiFuture<QuerySnapshot> future = db.collection("YYY").get();
final List<QueryDocumentSnapshot> documents = future.get().getDocuments();
其中“ YYY”是集合的名称(我尝试在空集合和非空集合上运行它)。
构建应用程序后,我会将其上传到Google Compute Engine实例。当我运行它时,最后一行会导致以下错误:
java.util.concurrent.ExecutionException: com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Request had insufficient authentication scopes.
at com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:500)
at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:479)
at com.google.api.core.AbstractApiFuture.get(AbstractApiFuture.java:56)
at com.dammitchat.App.main(App.java:55)
我已经在虚拟机上运行了以下内容:
~$ gcloud auth list
Credentialed Accounts
ACTIVE ACCOUNT
* XXXXXXXXXXXX-compute@developer.gserviceaccount.com
我检查了IAM,并且此服务帐户具有“编辑者”角色(以防万一,我也尝试添加“ Cloud Datastore Owner”),因此我可以想象它可以绕过我为集合设置的任何规则。实际上,此集合有一条规则指出:
match /YYY/{y} {
allow read: if false;
}
但是即使我将其更改为true
,结果也是一样。
现在,奇怪的是,当我使用另一个“ Cloud Datastore Owner”服务帐户在本地运行该应用程序时,效果很好。
我在做什么错了?
答案 0 :(得分:2)
它显示为:
需要为请求的身份验证范围不足。
RPC
的一个这些oAuth2范围:
服务帐户身份验证的说明here(这是错误消息所提示的内容)。
有关安全规则(不是该错误消息的原因),请参见here。
另请参阅Cloud Firestore API和Java example。