基于浏览器的上传使用POST

我正在尝试使用带有AWS签名版本4的POST创建客户端上传。 根据文件

当我在服务器端生成签名时,我得到与此示例页面中提到的AWS签名完全匹配。

但是,当我使用它上传页面时,我收到此错误:

SignatureDoesNotMatch我们计算的请求签名与您提供的签名不匹配。 检查您的密钥和签名方法

这是我用过的代码:

OpenSSL::HMAC.hexdigest('sha256', signing_key(string_to_sign), string_to_sign) # step 2 in the aws documentation def signing_key(encoded_policy) # generate the correct date date = extract_encoded_policy_date(encoded_policy) date = time_adjust(date) # encode all the fields by the algorithm date_key = OpenSSL::HMAC.digest('sha256',"AWS4#{@secret_access_key}", date.strftime("%Y%m%d")) date_region_key = OpenSSL::HMAC.digest('sha256',date_key, @region) date_region_service_key = OpenSSL::HMAC.digest('sha256',date_region_key, @service) signing_key = OpenSSL::HMAC.digest('sha256',date_region_service_key, 'aws4_request') signing_key end def time_adjust(date) time = Time.parse(date) time += time.utc_offset time.utc end 

在网上搜索一下后,我遇到了这篇文章 。 我实现了这段代码,上传成功了。

 signature = OpenSSL::HMAC.digest( OpenSSL::Digest::Digest.new('sha1'), @secret_access_key, string_to_sign) Base64.encode64(signature).gsub("\n","")``` 

这是客户端代码的一个小型演示 。

这里有一些我发现有用的文献:
一般说明
来自AWS的一些代码片段

两者有什么不同?
如何获得第一个工作和上传文件的选项? AWS页面中的示例是否不再有效?

经过研究和比较AWS post示例后,我发现表单中有一些冗余字段使AWS认为我正在使用SHA1。

从表单中删除AWSAccessKeyId字段并重命名其他一些字段后,我设法使AWS4工作。

这是更新的演示