从本地主机获取GoogleCredentials(未指定serviceAccount / privateKey)

时间:2019-01-16 12:13:49

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

我既在本地,也在我们的Kubernetes吊舱内,均已通过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云端硬盘相同的方式。

1 个答案:

答案 0 :(得分:0)

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

这些ADC凭据当前仅在Google Cloud Platform API上起作用(Google Drive早于此)。您可以阅读Google云端硬盘Java快速入门,以了解如何检索凭据:https://developers.google.com/drive/api/v3/quickstart/java

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

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

在您的情况下,您的GKE吊舱正在使用方法#4检索GCS存储区操作的令牌;但不适用于云端硬盘API。