如何通过 Java Admin SDK 从 Google Cloud Storage 下载对象?

问题描述 投票:0回答:1

我目前正在开发一个 Java 应用程序,该应用程序使用 Admin SDK 来存储和检索 Google Firestore 中的数据,但我也想将该用途扩展到 Google Cloud Storage。当谈到 Firestore 时,它非常明确地指出,通过 Admin SDK 进行访问会忽略所有 Firebase 安全规则,因此,使用我的服务帐户凭据创建 Firebase 应用程序足以授予对所有操作的访问权限(如果我理解正确的话)到目前为止)。

但是,当我尝试下载通过 Admin SDK 上传到 Cloud Storage 的 .png 文件时,出现以下错误。

{
  "code" : 401,
  "errors" : [ {
    "domain" : "global",
    "location" : "Authorization",
    "locationType" : "header",
    "message" : "Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object. Permission 'storage.objects.get' denied on resource (or it may not exist).",
    "reason" : "required"
  } ],
  "message" : "Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object. Permission 'storage.objects.get' denied on resource (or it may not exist)."
}

这是产生此错误的代码。

public void downloadImage() {
        
        firebase.initializeFirebase();

        Storage storage = StorageOptions.newBuilder()
                                  .setProjectId(MY_FIREBASE_ID).build()
                                  .getService();
        
        Blob blob = storage.get(BlobId.of(STORAGE_ID, OBJECT_NAME));
        blob.downloadTo(Paths.get(PATH));
    }

服务帐户的角色包括管理员、存储管理员、存储对象查看者、存储对象管理员等。 Firebase 应用程序使用我上面提到的凭据在

firebase.initializeFirebase()
方法中初始化。

我认为 Admin SDK 仅通过适当的 IAM 角色即可完全访问 Firebase 应用程序。在搜索此错误时,我遇到了几种可以正确进行身份验证并允许访问的方法,但它们都使用 Firebase CLI。但我怎样才能仅使用 Admin SDK 和 Java 代码来完成相同的操作呢?

如上所述,我尝试将任何与存储相关的角色赋予我的服务帐户,并使用我的凭据生成一个新的 JSON 文件。然后,我使用上面的代码尝试从云存储下载图像,但无济于事。我什至允许任何人公开访问云存储。我转到云存储规则并无条件启用读取、写入访问。但仍然没有任何进展。我搜索了我现在要问的这个具体问题,但结果对我没有帮助。也许我错过了一些东西,在这种情况下,我很抱歉。

firebase google-cloud-storage firebase-admin google-admin-sdk
1个回答
0
投票

该错误表明您没有在请求中使用任何凭据。你需要这样的东西:

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

让存储服务发现凭证(在 Google 云实例之外)

并将权限添加到存储桶(或项目),其中包含应用程序所需的最小角色和主体作为服务帐户电子邮件(或 Firebase 凭据电子邮件)。

© www.soinside.com 2019 - 2024. All rights reserved.