【问题标题】:401 unauthorised while creating google storage bucket using Micronaut java使用 Micronaut java 创建 google 存储桶时出现 401 未授权
【发布时间】:2021-06-01 15:41:05
【问题描述】:

谷歌云的 Micronaut 文档支持https://micronaut-projects.github.io/micronaut-gcp/2.0.x/guide/

设置 GCP 支持

implementation("io.micronaut.gcp:micronaut-gcp-common:2.0.2")

application.yml中设置凭证

gcp:
  credentials:
    location: classpath:googleStorageKey.json

googleStorageKey.jsonapplication.yml文件位于同一目录

google 服务帐户文件包含以下数据

{
  "type": "service_account",
  "project_id": "fetebird",
  "private_key_id": "cf93ffffffjjhjyyuyu144842f20dc055763aa665",
  "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEv--REDACTED--4XOs=\n-----END PRIVATE KEY-----\n",
  "client_email": "fetebirdstorage@fetebird.iam.gserviceaccount.com",
  "client_id": "106425305070351254286",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/fetebirdstorage%40fetebird.iam.gserviceaccount.com"
}

这是我用来创建带有选项的存储桶的代码

public Observable<Void> createBucketWithStorageClassAndLocation() {
        Storage storage = StorageOptions.newBuilder().setProjectId(googleUploadObjectConfiguration.projectId()).build().getService();
        StorageClass storageClass = StorageClass.COLDLINE;
        try {
            Bucket bucket =
                    storage.create(
                            BucketInfo.newBuilder(googleUploadObjectConfiguration.bucketName())
                                    .setStorageClass(storageClass)
                                    .setLocation(googleUploadObjectConfiguration.locationName())
                                    .build());
            LOG.info(String.format("Created bucket %s in %s with storage class %s", bucket.getName(), bucket.getLocation(), bucket.getStorageClass()));
        } catch (Exception ex) {
            LOG.error(ex.getMessage());
        }
        return Observable.empty();
    }

参考 - https://cloud.google.com/storage/docs/samples/storage-create-bucket-clss-location

例外

401 Unauthorized
POST https://storage.googleapis.com/storage/v1/b?project=fetebird&projection=full

Storage.options 内,凭据为空,这就是我收到 401 的原因。它应该从 application.yml 文件位置选择凭据。

我哪里出错了?

按照此处https://cloud.google.com/docs/authentication/production#automatically的说明进行操作

暴露此命令后

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/my-key.json"

仍然无法进行身份验证,我想我遗漏了一些东西。

服务帐号权限

gcloud projects add-iam-policy-binding --member=serviceAccount:fetebird-storage@fetebird.iam.gserviceaccount.com --role=roles/storage.admin fetebird

【问题讨论】:

  • 您能否添加此行以检查您的 env var 是否在运行时上下文中正确注入:System.out.println(System.getenv("GOOGLE_APPLICATION_CREDENTIALS"));
  • 另外,服务账号的权限是什么?而bucket Fine Grained or Uniform的模式是什么?
  • @guillaumeblaquiere 环境变量为空,服务帐户的权限为 storage admin
  • @guillaumeblaquiere - 还有一个与此stackoverflow.com/questions/66452523/… 相关的问题,请您看看
  • 你如何运行你的代码?在终端中或使用您的 IDE(intelliJ?)?

标签: java google-cloud-platform google-cloud-storage micronaut micronautgcp


【解决方案1】:

尝试正确配置你的IDE运行环境

  • 编辑您的运行时配置

  • 然后在专用字段中添加您的环境变量

  • 并验证。

再试一次,告诉我!

【讨论】:

  • 我现在确实从这个代码 System.out.println(System.getenv("GOOGLE_APPLICATION_CREDENTIALS"));但凭据在存储中仍然为空并获得 401
  • 来自gcp doc 环境变量只适用于你当前的shell会话,所以如果你打开一个新会话,再次设置变量,这对IDE意味着什么?
  • 使用 gcloud auth application-default login 命令有效,但这不是推荐的方式
  • gcloud auth application-default login 是,IMO,比拥有服务帐户密钥文件更值得推荐的方式!只有我的意见;)
  • 如果您有 401,这不是因为您没有凭据,而是因为您的凭据无效或未授权。您可以尝试使用服务帐户模拟进行呼叫吗? gsutil -i &lt;service account email&gt; ls
【解决方案2】:

注入 GoogleCredentials 并将其设置在存储对象上

【讨论】:

  • 环境变量怎么样,我在本地机器上设置环境变量并导出命令,它应该会选择那个 .json 文件?
  • 我不知道,那是 GCP 特有的。 micronaut 集成创建了一个您可以使用的凭据对象
【解决方案3】:

Community Wiki 将 cmets 中讨论的内容添加到 @GuillaumeBlaqueire 的正确和单独答案的答案中。

如果您的状态为 401,这不是因为您没有凭据,而是因为您的凭据无效或未授权。您使用gsutil -i &lt;service account email&gt; ls 命令进行的测试证明了这一点。

因此,要解决此问题,您需要添加角色,如 here 所述,该角色最适合您的服务帐户所需的权限。这将是Storage Admin 角色。

【讨论】:

  • 感谢您的输入,但是,我已经拥有存储管理员权限,如上面的屏幕截图所示,并且应用@GuillaumeBlaqueire 提供的所有 cmets 仍然面临 401 异常。但是,使用gcloud auth application-default login 命令我可以创建存储桶
【解决方案4】:

任何在这个问题上苦苦挣扎的人也许这会有所帮助,路径应该是不带引号的。如果您在 MAC 机器上,请使用键盘上的选项键复制路径并将其粘贴到此处

【讨论】:

    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多