TL; DR- 如果正在使用
Application DefaultCredentials(使用时是BTW
StorageOptions.getDefaultInstance().getService();),并且需要使用服务帐户中的凭据,则
无需更改代码即可
。您需要做的就是将
GOOGLE_APPLICATION_CREDENTIALS环境变量设置为服务帐户json文件的完整路径,一切就绪。
较长版本的解决方案使用 [`Application Default
Credentials`](https://developers.google.com/identity/protocols/application-
default-credentials)
照原样使用原始代码
Storage storage = StorageOptions.getDefaultInstance().getService();
Bucket b = storage.get( “mybucketname” );
将环境变量设置为
GOOGLE_APPLICATION_CREDENTIALS
包含服务帐户凭据的json文件的完整路径。export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service_account_credentials.json
再次运行您的Java应用程序以验证它是否按预期工作。
使用硬编码的服务帐户凭据的替代解决方案
ServiceAccountCredentials乍一看,您发布的用于初始化的代码示例对我来说是有效的。我尝试了以下代码段,并且按预期运行。
String SERVICE_ACCOUNT_JSON_PATH = "/path/to/service_account_credentials.json";Storage storage = StorageOptions.newBuilder() .setCredentials( ServiceAccountCredentials.fromStream( new FileInputStream(SERVICE_ACCOUNT_JSON_PATH))) .build() .getService();Bucket b = storage.get("mybucketname");指定服务帐户凭据时,将从json文件中提供的信息中自动提取项目ID。因此,您不必再次指定它。我不确定是否与您观察到的问题有关。
应用程序默认凭证
这里是有关
Application DefaultCredentials解释根据您的环境选择哪些凭据的完整文档。
应用程序默认凭据如何工作
您可以通过单个客户端库调用来获取应用程序默认凭据。返回的凭据取决于代码在其中运行的环境。按以下顺序检查条件:
1.
GOOGLE_APPLICATION_CREDENTIALS检查环境变量。如果指定了此变量,则它应指向定义凭据的文件。为此目的获得证书的最简单方法是在Google
API控制台中创建服务帐户密钥:一个。转到“
API控制台凭据”页面。b。从项目下拉列表中,选择您的项目。
C。在“凭据”页面上,选择“创建凭据”下拉菜单,然后选择“服务帐户密钥”。
d。从“服务帐户”下拉列表中,选择一个现有的服务帐户或创建一个新的服务帐户。
e。对于“密钥类型”,选择“ JSON密钥”选项,然后选择“创建”。该文件将自动下载到您的计算机。
F。将刚刚下载的* .json文件放在您选择的目录中。该目录必须是私有的(您不能让任何人访问此目录),但是您的Web服务器代码可以访问。
G。将环境变量设置为
GOOGLE_APPLICATION_CREDENTIALS下载的JSON文件的路径。
如果您在计算机上安装了Google Cloud SDK并运行了命令
gcloud auth application-defaultlogin,则您的身份可以用作代理来测试从该计算机调用API的代码。如果您正在Google App Engine生产中运行,则将使用与该应用程序关联的内置服务帐户。
如果您正在Google Compute Engine产品中运行,则将使用与虚拟机实例关联的内置服务帐户。
如果这些条件都不成立,则将发生错误。
IAM角色
我建议您仔细阅读
IAM permissions和
IAMroles可用于Cloud
Storage。这些在项目和存储桶级别提供控制。此外,您可以使用ACL在bucket中的对象级别上控制权限。
如果您的用例仅涉及调用
storage.get(bucketName)
。此操作将只需要storage.buckets.get
权限,而仅此权限的最佳IAM角色是roles/storage.legacyObjectReader
。如果您还想授予服务帐户获取(
storage.objects.get
)和列出(storage.objects.list
)单个对象的权限,则还要将该角色添加roles/storage.objectViewer
到服务帐户。



