通过在 application.properties 文件中指定文件位置来传递服务帐户密钥文件(从 GCP 控制台生成)似乎很简单。但是,我尝试了以下所有选项:
1. spring.cloud.gcp.credentials.location=file:/home/my_user_id/mp6key.json
2. spring.cloud.gcp.credentials.location=file:src/main/resources/mp6key.json
3. spring.cloud.gcp.credentials.location=file:./main/resources/mp6key.json
4. spring.cloud.gcp.credentials.location=file:/src/main/resources/mp6key.json
这一切都以同样的错误结束:
java.io.FileNotFoundException: /home/my_user_id/mp6key.json (No such file or directory)
谁能建议我应该把密钥文件放在哪里,然后我应该如何正确指定文件的路径?
相同的程序在 Ecplise 中成功运行,使用来自 GCP 的 Pub/Sub 处理发布和订阅消息(使用 GCP 中生成的项目 ID/服务帐户密钥),但现在在部署到 GCP 上运行后仍然存在上述问题。
如官方文档中所述,凭证文件可以从许多不同的位置获取,例如文件系统、类路径、URL 等
例如,如果服务帐户密钥文件作为
src/main/resources/key.json
存储在类路径中,则传递以下属性
spring.cloud.gcp.credentials.location=classpath:key.json
如果密钥文件存储在本地文件系统的其他地方,请在属性值中使用
file
前缀
spring.cloud.gcp.credentials.location=file:<path to key file>
我的台词是这样的:
spring.cloud.gcp.credentials.location=file:src/main/resources/[my_json_file]
这行得通。
如果我将它放在项目目录的根目录下,以下内容也有效:
spring.cloud.gcp.credentials.location=file:./[my_json_file]
您是否尝试过遵循此quickstart?请尝试认真地遵循它,如果您在完成快速入门时遇到任何错误,请解释一下。
无论如何,在运行 Java 脚本之前,请尝试在控制台上运行以下命令(请修改为您存储密钥的确切路径):
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/mp6key.json"
您如何在 Java 脚本中验证您的凭据?
我的回答很简单:如果你在 GCP 上运行你的代码,你不必使用服务帐户密钥文件。问题消除,问题解决!
更严重的是,看看服务身份。我不知道你现在的服务是什么(Compute?Function?Cloud Run?)。无论如何,您可以在 GCP 组件上附加任何服务帐户。然后,当您编写代码时,只需使用默认凭证即可。自动加载组件标识。 无需管理钥匙,无需安全存储钥匙,无需轮换钥匙!
如果您提供有关目标平台的更多详细信息,我可以为您提供一些指导来实现这一目标。
请记住,服务帐户密钥文件旨在 由 GCP 外部托管的自动应用程序(不涉及用户帐户)使用(本地、其他云提供商、CI/CD、Apigee 等)
更新
您在使用个人账户时,也可以使用默认凭证。
gcloud SDK
gcloud auth application-default login
如果不行,获取登录命令后显示的
<path>
,在名为GOOGLE_APPLICATION_CREDENTIALS
的环境变量中设置这个值。
如果您明确想要使用服务帐户密钥文件(由于之前的原因这是一个安全问题,但是......),您可以在本地使用它
GOOGLE_APPLICATION_CREDENTIALS
环境变量gcloud auth activate-service-account --key-file=<path to your json key file>
前提是你的文件在resources文件夹下try
file://mp6key.json
使用
file://
而不是 file:/
至少对我有用
对于使用 Spring Cloud 的 Pub/Sub 凭证,请使用此属性。
spring.cloud.gcp.pubsub.credentials.location=file:/someLocation/keyFileName.json