栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用Java-403呼叫者服务帐户的Google Cloud Storage没有存储桶的storage.objects.list访问权限

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Java-403呼叫者服务帐户的Google Cloud Storage没有存储桶的storage.objects.list访问权限

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文件的路径。

  1. 如果您在计算机上安装了Google Cloud SDK并运行了命令

    gcloud auth application-defaultlogin
    ,则您的身份可以用作代理来测试从该计算机调用API的代码。

  2. 如果您正在Google App Engine生产中运行,则将使用与该应用程序关联的内置服务帐户。

  3. 如果您正在Google Compute Engine产品中运行,则将使用与虚拟机实例关联的内置服务帐户。

  4. 如果这些条件都不成立,则将发生错误。

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
    到服务帐户。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/414159.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号