【问题标题】:Accessing objects in google cloud storage bucket via API key通过 API 密钥访问谷歌云存储桶中的对象
【发布时间】:2018-05-11 01:06:11
【问题描述】:

我正在尝试通过在网络浏览器中运行的 Javascript 访问谷歌云存储桶中的内容。到目前为止,我已经使用服务帐户凭据在服务器上创建了签名的 url,并在 REST 调用期间将它们传递给客户端。我这样做的唯一原因是因为我之前试图解决这个问题,然后放弃并选择了签名的 url。现在我需要让它工作。

到目前为止,我已经尝试使用服务帐户凭据在服务器上创建访问令牌,如下所示:

    credential = GoogleCredential.fromStream(this.getClass().getResourceAsStream("/serviceaccount.json"));
    LinkedList<String> list = new LinkedList<String>();
    list.add("https://www.googleapis.com/auth/devstorage.read_only");
    credential = credential.createScoped(list);
    credential.refreshToken();

然后我将“access_token”返回表单 credential.getAccessToken() 传递给客户端,并在 XmlHttpRequest 中使用它,如下所示:

    var xhr = new XMLHttpRequest();
    xhr.open('GET', "https://storage.googleapis.com/....." true);
    xhr.responseType = 'arraybuffer';
    xhr.setRequestHeader('Authorization', 'Bearer ' + access_token);

这会导致 chrome 产生以下错误。

“对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。”

桶上的Cors是

[{"maxAgeSeconds": 3600, "method": ["GET", "HEAD", "DELETE"], "origin": ["http://www.voxxlr.com"], "responseHeader": ["O rigin", "Content-Type", "Content-Length"]},{"maxAgeSeconds": 3600, "method": ["GET", "HEAD", "DELETE"], "origin": ["http ://voxxlr.com"], "responseHeader": ["Origin", "Content-Type", "Content-Length"]}]

接下来我尝试使用如下 API 密钥:

    var xhr = new XMLHttpRequest();
    xhr.open('GET', "https://storage.googleapis.com/....?KEY=...." true);
    xhr.responseType = 'arraybuffer';

这产生了以下错误:

拒绝访问 匿名用户没有 storage.objects.get 对 voxxlr/1511465797269/n.bin 的访问权限。

API 密钥不应该像那样提供访问权限吗?我并不是真的在寻找包含 google/javascript 客户端的解决方案,因为唯一需要的操作就是读取存储桶内容。不需要管理或删除功能。我基本上只是在寻找一个解决方案,让我域中的所有 html/javascript 都可以读取存储桶。

任何帮助将不胜感激...这已经占用了很多时间,但似乎应该有一个简单的解决方案。

【问题讨论】:

    标签: google-cloud-storage


    【解决方案1】:

    API 密钥不是身份验证机制。它们提供了一种机制来指示您的请求与哪个项目相关联(用于多种目的,特别是未经身份验证请求的配额和计费),但成功使用该机制不会将您的请求与任何特定帐户或权限相关联。

    您的 CORS 问题可能是多种多样的。我注意到您指定的O rigin 标头和http ://voxx 中有一个空格。这是复制到 SO 的产物还是真正的政策是这样的?此外,起源需要非常具体;你在使用 HTTPS 吗?如果是这样,您将需要包含它。此外,将预检请求本身 (OPTIONS) 作为允许的方法之一包含在内可能是个好主意。

    最后,您很可能不想将访问令牌传递给客户端。访问令牌仅在几分钟内有效,但它可用于执行令牌创建者可以执行的任何操作(在其声明的范围内)。这可能是你真的不想要的东西。签名 URL 是一个更安全的主意。

    【讨论】:

    • 感谢您澄清 API 密钥。目前我刚刚公开了整个存储桶,但这不是一个永久的解决方案。我正在寻找一种允许从“Origin”www.voxxlr.com 对存储桶进行完全读取访问的解决方案。那可能吗 ?签名 URL 也不是一个选项,因为它们必须在服务器上生成。
    猜你喜欢
    • 2019-08-24
    • 2022-01-15
    • 2019-10-06
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    相关资源
    最近更新 更多