gpt4 book ai didi

rest - S3 REST API HEAD 请求上的 403 禁止错误

转载 作者:行者123 更新时间:2023-12-04 11:23:40 24 4
gpt4 key购买 nike

我正在尝试对 S3 REST API 执行 HEAD 对象请求,但我不断收到 403 Forbidden 错误,即使我在 S3 上设置了具有必要权限的策略。响应正文是空的,所以我认为它不是签名问题。我已尝试对该政策进行多次更改,但似乎没有任何效果。我可以正常放置对象和删除对象,只是 HEAD 不起作用。

这是我的存储桶策略:

{
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam:: 999999999999:user/User"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::my-bucket"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::999999999999:user/User"
},
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:DeleteObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}

有任何想法吗?

更新:

正如迈克尔指出的那样,我的签名似乎有问题,尽管我没看到是什么。
def generate_url options={}
options[:action] = options[:action].to_s.upcase
options[:expires] ||= Time.now.to_i + 100
file_path = "/" + @bucket_name + "/" + options[:file_name]

string_to_sign = ""
string_to_sign += options[:action]
string_to_sign += "\n\n#{options[:mime_type]}\n"
string_to_sign += options[:expires].to_s
string_to_sign += "\n"
string_to_sign += file_path

signature = CGI::escape(
Base64.strict_encode64(
OpenSSL::HMAC.digest('sha1', SECRET_KEY, string_to_sign)
)
)

url = "https://s3.amazonaws.com"
url += file_path
url += "?AWSAccessKeyId=#{ACCESS_KEY}"
url += "&Expires=#{options[:expires]}"
url += "&Signature=#{signature}"
url
end

生成的要签名的字符串如下所示:
HEAD\n\n\n1418590715\n/video-thumbnails/1234.jpg"

解决方案:

似乎在开发文件 PUT 部分时,我实际上已经破坏了 GET 和 HEAD。我传递了一个空字符串作为请求的主体,而不是什么都不传递,使签名中需要 mime 类型并破坏它,因为我没有提供 mime 类型。我只是删除了空的请求正文,它工作得很好。感谢迈克尔指出我错误的方向(我浪费了很多时间来更改存储桶策略)。

最佳答案

它仍然可能是您的签名,我怀疑它是,原因如下:
你对消息体的观察是一个很好的观察;然而,这并不意味着你得出的结论它意味着什么。
在这种情况下,响应正文的缺失根本不会为您提供有关错误性质的任何信息,因为 Web 服务器不应该返回正文以及 HEAD。回应,无论如何:

The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html (RFC-2616)


在我这边进行测试,我已经确认 S3 对未签名的 HEAD 的响应请求并发送到签名错误的 HEAD请求也不异常(exception):它总是 HTTP/1.1 403 Forbidden没有消息正文。
另请注意, GET 的签名 URL对 HEAD 无效,反之亦然。
在 S3 Signature Version 2 中和 S3 Signature Version 4 ,“要签名的字符串”包括“HTTP 动词”,即 GETHEAD ,表示对 GET 有效的签名对 HEAD 无效,反之亦然......请求方法必须在签名时知道,因为它是签名过程中使用的元素。 s3:GetObject权限是唯一的 documented使用需要许可 HEAD ,这似乎消除了权限问题,如果 GET正在工作,这表明签名是潜在问题。

关于rest - S3 REST API HEAD 请求上的 403 禁止错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27469801/

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