使用 IntelliJ IDEA 进行调试时如何将服务帐户凭据添加到 Google App Engine?

Sum*_*uma 2 java google-app-engine google-cloud-platform google-cloud-iam

我正在开发一个使用 Google Cloud Storage 的 Google App Engine(标准环境)应用程序。到目前为止,我一直将App Engine API 用于 Cloud Storage,它使用 Datastore 为 Cloud Storage 提供本地模拟。由于这些 API 现在已经过时,我决定使用推荐的 API,但是我在本地服务器上运行时遇到了凭据问题(我已经在使用新的Cloud Code 插件,而不是旧的App Engine插件)。

我创建了一个服务帐户,并为其创建并下载了密钥。如果我将运行一个普通的 Java 应用程序,我将能够为 VM 指定环境变量,并且我可以提供必要的-DGOOGLE_APPLICATION_CREDENTIALS=xxxxx.json参数。云码提供的服务器好像没有办法提供环境变量,我只能提供VM选项,所以不知道怎么给它提供必要的环境,也不知道怎么把凭证传给它以其他方式。我让它工作的唯一方法是使用

gcloud auth application-default login

已将凭据保存在D:\Users\xxxx\AppData\Roaming\gcloud\application_default_credentials.json. 这有效,但任何时候我调试我的应用程序时,我都会收到以下警告:

com.google.auth.oauth2.DefaultCredentialsProvider warnAboutProblematicCredentials

警告:您的应用程序已使用来自 Google Cloud SDK 的最终用户凭据进行身份验证。我们建议大多数服务器应用程序改用服务帐户。如果您的应用程序继续使用来自 Cloud SDK 的最终用户凭据,您可能会收到“超出配额”或“API 未启用”错误。

我不确定这个警告有多严重,但对我来说听起来确实很可怕。

在我的应用程序中,我使用此代码(Scala,Java 将非常相似)使用凭据创建服务:

  val credentials = GoogleCredentials.getApplicationDefault
  val storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService
Run Code Online (Sandbox Code Playgroud)

在本地 Google App Engine 服务器上运行时传递服务帐户凭据的正确方法是什么?

Joh*_*ley 5

大警告的问题是 Google 不希望您使用用户凭据代替服务帐户凭据。Google 正在锁定(限制)第三方服务(您)可以请求的范围/数据。我的建议是不要再使用用户凭据,因为它们最终将不再有效。

有几种方法可以解决这个问题。

方法 1:设置 CLI 以使用服务帐户:

gcloud auth activate-service-account test@development.iam.gserviceaccount.com --key-file=test_google_account.json
Run Code Online (Sandbox Code Playgroud)

为服务帐户使用正确的电子邮件地址。这可以在 Google Cloud 控制台和 JSON 文件中找到。Google 图书馆会找到这些凭据。在我的网站上,我写了几篇关于服务帐户详细信息、应用程序默认凭据 (ADC) 等的文章。

方法 2:在代码中指定服务帐户

credentials = GoogleCredentials.fromStream(new FileInputStream(service_account_filename))
Run Code Online (Sandbox Code Playgroud)

创建一个标志或环境变量,以便您的代码可以 if-else 决定何时在您的桌面上运行以处理凭据。

方法三:

如果设置了系统(不是 VM 命令行)环境变量GOOGLE_APPLICATION_CREDENTIALS,库将使用该变量指向的文件名作为服务帐户凭据。此文件是 JSON 格式的 Google 云服务帐户凭据文件。

在启动 IntelliJ 之前设置此环境变量。

我的文档链接: