【问题标题】:Browser-Based Uploads Using POST使用 POST 的基于浏览器的上传
【发布时间】:2015-03-16 16:18:36
【问题描述】:

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

当我在服务器端生成签名时,我得到与 this example page. 中提到的 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

在网上搜索了一下,我遇到了这个article。我已经实现了这段代码,上传成功了。

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

这是客户端代码的小Demo

这里有一些我发现有用的文献:
General description
Some code snippets from AWS

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

【问题讨论】:

  • 您似乎正在多次签署数据。您需要做的就是编译字符串并签名一次。
  • 正如您在docs.aws.amazon.com/AmazonS3/latest/API/… 中看到的,AWS4 授权需要一系列编码。第二个代码部分是一个不同的尝试,而不是第一个。

标签: ruby amazon-web-services amazon-s3


【解决方案1】:

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

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

这是更新后的Demo

 <form id="myForm" action="http://yourbucket.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
      <input type="hidden" id="key" name="key" value="uploads/${filename}"/>
      <input type="hidden" id="acl" name="acl" value="YOUR_ACL_OPTION"/>
      <input type="hidden" name="success_action_redirect" value="http://google.com" />

      <input type="hidden" id="type" name="Content-Type" value="MIME_TYPE"/>
      <input type="hidden" name="x-amz-meta-uuid" value="14365123651274" />
      <input type="hidden"   name="X-Amz-Credential" value="YOUR_CREDENTIALS" />
      <input type="hidden"   name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256" />
      <input type="hidden" id="date" name="X-Amz-Date" value="" />

      <input type="hidden"  name="x-amz-meta-tag" value="" />
      <input type="hidden" id="policy" name="Policy" value="YOUR_POLICY_DOCUMENT_BASE64_ENCODED"/>
      <input type="hidden" id="signature" name="X-Amz-Signature" value="YOUR_CALCULATED_SIGNATURE"/>

      <input name="file" id="file" type="file"/> 
      <input id="btn_submit" class="btn btn-warning" type="submit" value="Upload File to S3"> 
 </form>

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    相关资源
    最近更新 更多