从Java以数据存储模式连接到云Firestore

从Java以数据存储模式连接到云Firestore,java,google-cloud-platform,google-cloud-firestore,Java,Google Cloud Platform,Google Cloud Firestore,我正在以数据存储模式将运行在App Engine上的Java微服务从数据存储迁移到云Firestore,并且在连接到新数据库时遇到问题。我发现文档令人困惑,但我是在以下基础上工作的(引自) 设置数据库权限 默认情况下,你的应用程序拥有读取和写入谷歌云项目中的数据存储模式和Firestore数据库所需的所有权限 为了管理这些权限,每个应用程序引擎应用程序都使用一个默认服务帐户,该帐户提供对应用程序所在项目中的数据存储模式和Firestore数据库的完全读写访问权限。您可以更改默认服务帐户的权限,但

我正在以数据存储模式将运行在App Engine上的Java微服务从数据存储迁移到云Firestore,并且在连接到新数据库时遇到问题。我发现文档令人困惑,但我是在以下基础上工作的(引自)

设置数据库权限 默认情况下,你的应用程序拥有读取和写入谷歌云项目中的数据存储模式和Firestore数据库所需的所有权限

为了管理这些权限,每个应用程序引擎应用程序都使用一个默认服务帐户,该帐户提供对应用程序所在项目中的数据存储模式和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
我正在使用的服务帐户具有以下权限

  • 云数据存储所有者
  • 云数据存储用户
  • 编辑

非常感谢您提供的任何帮助。

默认的App Engine标准服务帐户为:

gcloud iam service-accounts list | grep appspot.gserviceaccount.com
App Engine default service account   your-project@appspot.gserviceaccount.com 
此服务帐户已具有编辑器角色,并且
您的应用程序具有读取和写入Google Cloud项目中的数据存储模式和Firestore数据库所需的所有权限。

因此,您不需要创建key.json文件,并从该文件初始化凭据

为了

如果应用程序在App Engine标准环境下运行,则可以 使用应用程序引擎应用程序标识API获取凭据

设置服务帐户后,ADC可以隐式查找您的帐户 无需更改代码的凭据,如中所述 上面的部分。如果您想专门使用应用程序引擎凭据, 您可以显式地这样做,如下面的代码示例所示

编辑 如果您的代码在Firebase应用程序上运行,而不是应用程序引擎标准版,我认为您不应该使用默认的应用程序引擎服务帐户。您应该使用
Editor
角色创建一个新的服务帐户,并生成key.json文件