【发布时间】:2020-06-26 18:00:19
【问题描述】:
我正在将在 App Engine 上运行的 Java 微服务从 DataStore 迁移到 Datastore 模式下的 Cloud Firestore,并且在连接到新数据库时遇到问题。我发现文档令人困惑,但我在以下基础上工作(引用自 this)
设置数据库权限 默认情况下,您的应用拥有在您的 Google Cloud 项目中读取和写入 Datastore 模式和 Firestore 数据库所需的所有权限。
为了管理这些权限,每个 App Engine 应用都使用一个默认服务帐号,该帐号在应用所在的项目中提供对 Datastore 模式和 Firestore 数据库的完全读写访问权限。您可以更改默认服务帐号的权限,但您的应用可能会失去访问权限,除非您分配具有所需权限的 IAM 角色。
我在 IAM 中找到了默认服务帐户并生成了密钥并使用以下代码来初始化 FirebaseApp
InputStream serviceAccount = this.getClass().getResourceAsStream("/toolbox-firebase-adminsdk-jbx2a-31651a7510.json");
try {
FirebaseOptions options = new FirebaseOptions.Builder()
.setCredentials(GoogleCredentials.fromStream(serviceAccount))
.setDatabaseUrl("https://toolbox.firebaseio.com")
.build();
FirebaseApp.initializeApp(options);
} catch (IOException e) {
throw new RuntimeException(e);
}
这段代码似乎可以正常执行,但是当我尝试访问数据库时出现以下权限错误
> INFO] GCLOUD: com.google.cloud.datastore.DatastoreException: Missing
> or insufficient permissions. [INFO] GCLOUD: at
> com.google.cloud.datastore.spi.v1.HttpDatastoreRpc.translate(HttpDatastoreRpc.java:128)
> [INFO] GCLOUD: at
> com.google.cloud.datastore.spi.v1.HttpDatastoreRpc.translate(HttpDatastoreRpc.java:113)
> [INFO] GCLOUD: at
> com.google.cloud.datastore.spi.v1.HttpDatastoreRpc.lookup(HttpDatastoreRpc.java:163)
> [INFO] GCLOUD: at
> com.google.cloud.datastore.DatastoreImpl$3.call(DatastoreImpl.java:392)
> [INFO] GCLOUD: at
> com.google.cloud.datastore.DatastoreImpl$3.call(DatastoreImpl.java:389)
> [INFO] GCLOUD: at
> com.google.api.gax.retrying.DirectRetryingExecutor.submit(DirectRetryingExecutor.java:105)
> [INFO] GCLOUD: at
> com.google.cloud.RetryHelper.run(RetryHelper.java:76) [INFO
我使用的服务帐号有以下权限
- 云数据存储所有者
- 云数据存储用户
- 编辑器
非常感谢任何解决此问题的帮助。
【问题讨论】:
标签: java google-cloud-platform google-cloud-firestore