【问题标题】:Get GoogleCredentials from localhost (without specifiying serviceAccount/privateKey)从 localhost 获取 GoogleCredentials(不指定服务帐户/私钥)
【发布时间】:2019-01-16 12:13:49
【问题描述】:

我既在本地,也在我们的 Kubernetes pod 中,通过了 Google 云的身份验证。在这两种情况下,我都可以通过gcloud info 得到正确的回复。

但是,当我想访问 GoogleDrive 时,我需要使用 GoogleCredential,如下所示:

        GoogleCredential.Builder()
                .setTransport(transport)
                .setJsonFactory(jsonFactory)
                .setServiceAccountPrivateKey(privateKey)
                .setServiceAccountId(serviceAccount)
                .setServiceAccountScopes(scopes.toList()).build()

含义——我需要专门设置privateKey和serviceAccount。有没有办法强制它使用本地认证的账号?

使用 Google 存储桶时,这很容易做到:

StorageOptions.getDefaultInstance().service.options.credentials

我无法为 Google Drive 找到相同的方法。

【问题讨论】:

  • 我认为不是,有点遗憾。您喜欢 GCS 的功能称为应用程序默认凭据,但据我所知,仅限于 Google Cloud Platform 库(因此不包括 Google Drive)。

标签: java google-drive-api gcloud google-kubernetes-engine


【解决方案1】:

正如@DazWilkin 所指出的,许多 GCP 客户端库(例如您的 GCS)知道如何自动检测可用的“应用程序默认凭据”。

这些 ADC 凭据目前仅适用于 Google Cloud Platform API(Google Drive 早于该 API)。您可以阅读 Google Drive Java 快速入门以了解如何检索凭据:https://developers.google.com/drive/api/v3/quickstart/java

作为参考,GCP 客户端库将通过以下方式查找 ADC:

  1. GOOGLE_APPLICATION_CREDENTIALS 环境变量,如果设置,则指向服务帐户的 JSON 密钥文件。
  2. 如果用户执行了gcloud auth application-default login 命令,则查找%APPDATA%/gcloud/application_default_credentials.json(Windows)或$HOME/.config/gcloud/application_default_credentials.json(其他)。
  3. 在 Google App Engine 第 1 代(非 GAE Flex)上使用 appengine.AccessToken API。
  4. 在 GCE、GKE 或 GAE 第二代环境中,它调用 GCE Metadata API(类似 http://metadata.google.internalhttp://169.254.169.254 的 URL)来检索短暂的 access_token。

在您的情况下,您的 GKE pod 正在使用方法 #4 来检索 GCS 存储桶操作的令牌;但不适用于 Drive API。

【讨论】:

  • 使用 GOOGLE_APPLICATION_CREDENTIALS 存储 json 密钥文件是我的解决方案,我在 node.js 上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
相关资源
最近更新 更多