基于浏览器的上传使用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工作。
这是更新的演示