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 服务器上运行时传递服务帐户凭据的正确方法是什么?
大警告的问题是 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 之前设置此环境变量。
我的文档链接:
归档时间: |
|
查看次数: |
1400 次 |
最近记录: |