Google 云计算上的 Firestore PERMISSION_DENIED

Firestore PERMISSION_DENIED on Google Cloud Compute

我有一个使用 firebase-admin 的 Java 应用程序,我试图在 Firestore 中观察 collection 并对其进行修改。

我有以下代码:

final GoogleCredentials credentials = GoogleCredentials
            .getApplicationDefault();

final FirebaseOptions options = new FirebaseOptions.Builder()
            .setCredentials(credentials).setProjectId("XXX")
            .build();

FirebaseApp.initializeApp(options);

Firestore db = FirestoreClient.getFirestore();

其中 "XXX" 是我项目的 triple-checked ID。

稍后是这个:

final ApiFuture<QuerySnapshot> future = db.collection("YYY").get();
final List<QueryDocumentSnapshot> documents = future.get().getDocuments();

其中 "YYY" 是 collection 的名称(我在空和 non-empty collection 上都试过 运行ning 它)。

构建应用程序后,我将其上传到 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)

我在 VM 上有 运行 以下内容:

~$ gcloud auth list
                  Credentialed Accounts
ACTIVE  ACCOUNT
*       XXXXXXXXXXXX-compute@developer.gserviceaccount.com

我检查了 IAM 并且此服务帐户具有 "Editor" 角色(以防万一,我也尝试添加 "Cloud Datastore Owner"),所以我想它可以绕过我为我设置的任何规则collection。事实上,这个 collection 有一条规则规定:

match /YYY/{y} {

    allow read: if false;
}

但是即使我把它改成true,结果还是一样。

现在,奇怪的是,当我 运行 使用另一个 "Cloud Datastore Owner" 服务帐户在本地应用程序时,它工作正常。

我做错了什么?

上面写着:

Request had insufficient authentication scopes.

对于 RPC 需要请求这些 oAuth2 范围中的一个

解释了服务帐户身份验证here(这就是错误消息提示的内容)。

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

另见Cloud Firestore API and the Java example.