gpt4 book ai didi

google-app-engine - 尝试使用签名 URL 上传到 GCS 时收到 403 "Anonymous caller does not have storage.objects.get access"

转载 作者:行者123 更新时间:2023-12-02 02:28:32 30 4
gpt4 key购买 nike

我正在尝试使用 signed URLs 将文件直接从浏览器上传到 GCS 。我正在从 App Engine 标准 PHP 应用程序生成 v4 签名 URL,这似乎工作正常。问题是,当我尝试 PUT 到该 URL 时,我得到一个 403 ,其中包含以下 XML 响应:

<?xml version='1.0' encoding='UTF-8'?>
<Error>
<Code>AccessDenied</Code>
<Message>Access denied.</Message>
<Details>Anonymous caller does not have storage.objects.create access to <bucket-name>/some-object.txt.</Details>
</Error>

我的应用引擎服务帐户具有Service Account Token Creator,它支持创建 URL。

我已在存储桶上启用 CORS,以接受 PUT*,这使我能够到达现在的位置。

我已从 v2 网址切换到 v4,因为 Go SDK 上的问题表明这是一个问题。

我正在使用 PHP Google Cloud Library 生成签名 URL,如下所示:

$storage = new StorageClient();
$bucket = $storage->bucket('<bucket-name>');
$object = $bucket->object('some-object.txt');

$url = $object->signedUploadUrl(new \DateTime('tomorrow'), ['version' => 'v4']);

我尝试将服务帐户添加到存储桶的权限中,并添加Storage Object AdminStorage Object Creator等,但似乎没有什么可以让我克服这个403(除了向 allUsers 开放)。

this文章说的是

In addition, within Cloud Storage, you need to grant the following permissions to generate a Signed URL.

  • storage.buckets.get
  • storage.objects.create
  • storage.objects.delete

但我就是不知道需要将它们添加到哪个角色。

此时,我认为有两种可能性之一:

  1. 签名的 URL 实际上不起作用,因为它应该作为服务帐户而不是匿名进行身份验证。在这种情况下,可能是什么原因造成的?
  2. 签名 URL 作为某种类型的匿名角色进行身份验证,但该角色没有权限。在这种情况下,如何添加该角色的权限(allUsers 显然是错误的)?
<小时/>

已解决:

我的实现存在一些问题:

  1. 正如下面 Brandon 和 Charles 所建议的,signedUploadUrl 不适合直接 PUT。为了解决这个问题,我需要使用 beginSignedUploadSession
  2. 按照下面 John 的建议,我需要在服务帐户用户上添加Storage Object Creator。不过,它已添加到 GAE 默认服务帐户中,因为它是项目编辑器
  3. Service Account Token Creator 需要显式添加到服务帐户,因为 Project Editor 似乎没有涵盖它。
  4. 我使用 Twig 将 URL 嵌入到 Javascript 中,使用 const url='{{ upload_url }}';,但是 Twig 会自动对变量进行 HTML 编码,因此这会破坏 URL,相反,我需要使用{{ upload_url|raw }}。这种损坏的格式是该消息包含匿名调用者
  5. 的原因

最佳答案

signedUploadUrl 为 POST HTTP 方法创建 URL(请参阅 https://github.com/googleapis/google-cloud-php/blob/master/Storage/src/StorageObject.php 处的库源代码)。您正在使用该签名 URL 进行 PUT 请求,因此不允许该请求。错误消息并未表明这是问题所在,但我认为这就是问题所在。

您可以了解如何通过 POST 上传文件,或为 PUT 创建签名 URL。我已经用 Python 完成了后者,但我没有找到使用这个库来完成此操作的方法。我不是 PHP 程序员,所以我可能会错过它。

或者您可以创建自己的代码来为 PUT 创建签名 URL,以库代码为例。要获得完全正确的签名 URL 极其困难,并且创建自己的代码可能会令人沮丧。这是给我用 Python 编写的。

关于google-app-engine - 尝试使用签名 URL 上传到 GCS 时收到 403 "Anonymous caller does not have storage.objects.get access",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57333985/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com