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.
我有一个使用 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.