【问题标题】:Connect to Cloud Firestore in DataStore mode from Java从 Java 以 DataStore 模式连接到 Cloud Firestore
【发布时间】: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


    【解决方案1】:

    默认的 App Engine 标准服务帐号是:

    gcloud iam service-accounts list | grep appspot.gserviceaccount.com
    App Engine default service account   your-project@appspot.gserviceaccount.com 
    

    此服务帐号已经拥有编辑角色,并且your app has all the permissions required to read and write to Datastore mode and Firestore databases in your Google Cloud project.

    因此,您无需创建 key.json 文件,并从此文件初始化您的凭据。

    对于App Engine Standard

    如果您的应用程序在 App Engine 标准环境中运行,您可以 使用 App Engine App Identity API 获取凭据。

    设置服务帐号后,ADC 可以隐式找到您的 无需更改您的代码的凭据,如 以上部分。如果您想专门使用 App Engine 凭据, 您可以明确地这样做,如以下代码示例所示。

    编辑

    如果您的代码在 Firebase App 而不是 App Engine Standard 上运行,我认为您不应使用默认的 App Engine 服务帐户。您应该创建一个具有Editor 角色的新服务帐户并生成 key.json 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 2019-08-09
      • 2019-03-17
      • 1970-01-01
      • 2020-03-22
      • 2018-08-06
      • 2019-06-25
      相关资源
      最近更新 更多