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



我正在开发一个使用Google Cloud Storage的Google App Engine(标准环境(应用程序。到目前为止,我一直使用适用于云存储的 App Engine API,它使用数据存储为云存储提供本地仿真。由于这些 API 现在已经过时了,我决定使用推荐的 API,但是在本地服务器上运行时,我在为凭据而苦苦挣扎(我已经在使用新的云代码插件,而不是旧的 App Engine 插件(。

我创建了一个服务帐户,并为其创建并下载了密钥。如果我运行一个普通的 Java 应用程序,我将能够为 VM 指定环境变量,并且可以提供必要的-DGOOGLE_APPLICATION_CREDENTIALS=xxxxx.json参数。云代码提供的服务器似乎没有任何办法提供环境变量,我只能提供虚拟机选项,因此我不知道如何为其提供必要的环境,或者如何以其他方式将凭据传递给它。我让它工作的唯一方法是使用

gcloud auth application-default login

其中已将凭据保存在D:UsersxxxxAppDataRoaminggcloudapplication_default_credentials.json.这有效,但是每当我调试应用程序时,都会收到以下警告:

com.google.auth.oauth2.DefaultCredentialsProvider warnAboutProblemCredentials

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

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

在我的应用程序中,我使用以下代码(Scala,Java将非常相似(来创建具有凭据的服务:

val credentials = GoogleCredentials.getApplicationDefault
val storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService

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

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

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

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

gcloud auth activate-service-account test@development.iam.gserviceaccount.com --key-file=test_google_account.json

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

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

credentials = GoogleCredentials.fromStream(new FileInputStream(service_account_filename))

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

方法3:

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

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

我的文档链接:

  • https://www.jhanley.com/google-cloud-application-default-credentials/
  • https://www.jhanley.com/google-cloud-setting-up-gcloud-with-service-account-credentials/
  • https://www.jhanley.com/google-cloud-creating-and-authorizing-service-account-credentials-with-the-cli/

最新更新