Java 为什么谷歌云存储不是';不接受我的GOOGLE应用程序凭据环境变量[HEROKU]?

Java 为什么谷歌云存储不是';不接受我的GOOGLE应用程序凭据环境变量[HEROKU]?,java,spring,spring-boot,heroku,google-cloud-storage,Java,Spring,Spring Boot,Heroku,Google Cloud Storage,我正在用Spring Boot开发一个POC网站,以了解特定Google云存储中的GCP产品。上下文是当用户注册时,我试图保存一个配置文件图片 从谷歌文档中,我可以使用 StorageOptions.getDefaultInstance().getService(); 如果我在环境变量上有GOOGLE_应用程序_凭据,则验证我的凭据。事实上,我确实有GOOGLE_APPLICATION_凭证作为指向.json文件的环境变量(我使用的是Linux Mint)(这是有效的,因为它使用的是path方

我正在用Spring Boot开发一个POC网站,以了解特定Google云存储中的GCP产品。上下文是当用户注册时,我试图保存一个配置文件图片

从谷歌文档中,我可以使用

StorageOptions.getDefaultInstance().getService();
如果我在环境变量上有GOOGLE_应用程序_凭据,则验证我的凭据。事实上,我确实有GOOGLE_APPLICATION_凭证作为指向.json文件的环境变量(我使用的是Linux Mint)(这是有效的,因为它使用的是path方法),但它总是从GCP lib返回401

花费数小时搜索后,为了确保在终端上运行此命令:

gcloud auth application-default login
此命令的响应为:

The environment variable [GOOGLE_APPLICATION_CREDENTIALS] is set to:
  [/home/<myuser>/<some_folder>/<myapplication>-<id>.json]
Credentials will still be generated to the default location:
  [/home/<myuser>/.config/gcloud/application_default_credentials.json]
To use these credentials, unset this environment variable before
running your application.

Do you want to continue (Y/n)?

但在Heroku云上时,我无法让它工作。有人知道我可以使用规则进行此运行的方法吗?

为了传递您可以通过的凭据,事实上这就是您提到的方法。要在Linux中执行此操作,应使用以下命令

export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"
但是,需要记住的是,该变量仅适用于当前shell会话,因此如果打开新会话,请再次设置该变量

另一方面,执行此任务的另一个选项是传递凭据,正如您在共享链接中看到的,您应该使用下面的内容

GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(jsonPath))
        .createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));
  Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();

最后,如果不希望将凭据指向应用程序代码内部,可以使用。我认为KMS对于您的案例来说是一个很好的选择,但最后,您应该做出决定。

我尝试使用命令export GOOGLE_APPLICATION_CREDENTIALS,我还将其放在bashrc和zshrc配置文件上。事实上,当在终端上使用“printenv”时,我可以看到我的env变量,但当json路径在环境变量上时,GCP会给我401个未经授权的值。我能让它工作的唯一方法是使用login命令,但我不能在云中使用login命令。。。在我的Heroku环境变量上,我也添加了这些凭据,但出现了相同的错误。我没有使用GoogleCredentials.fromStream(),只是因为我在Heroku上没有json文件,只有env变量。我想使用环境变量,因为它使代码看起来更干净、更可调整,并且更易于使用不同的环境和分支。我不知道这个云密钥管理服务,我会看看它是否适合这个项目。谢谢你的帮助。我只想说更多的细节,我尝试了每一个命令,让它与环境变量一起工作,导出时使用双引号,导出时不使用双引号,将它放在bash profile,zsh profile,任何东西上。唯一能使它在本地环境中工作的是gcloud login命令。我想知道的是,我如何使用环境变量使它在Heroku上工作(无需将credentials.json直接放在github上,因为这将是一个公共存储库),这似乎与Heroku有关。我发现了一些类似的案例(和)。此外,这另一个可能有助于执行您想要的任务。希望这些信息能帮助你。非常感谢你,塞缪尔!我已经访问了这些链接(在特定的一个链接中,但只尝试了一些方法。有效的方法来自Chrisjan。创建两个heroku变量和一个.profile,在每次登录(部署)时在运行时创建一个.json。如果有人需要,我将用更多细节回答这个问题。再次感谢你,Samuel!
GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(jsonPath))
        .createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));
  Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();