Google Cloud Compute上的Firestore PERMISSION_DENIED

时间:2018-09-23 22:39:49

标签: java firebase google-cloud-platform google-cloud-firestore firebase-admin

我有一个使用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”服务帐户在本地运行该应用程序时,效果很好。

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

它显示为:

  

请求的身份验证范围不足。

需要为RPC

一个这些oAuth2范围:

服务帐户身份验证的说明here(这是错误消息所提示的内容)。

有关安全规则(不是该错误消息的原因),请参见here

另请参阅Cloud Firestore API和Java example