Javascript 获取403访问拒绝仅在使用公共读取ACL时将文件上载到S3

Javascript 获取403访问拒绝仅在使用公共读取ACL时将文件上载到S3,javascript,amazon-s3,Javascript,Amazon S3,我正在尝试发布图像数据(直接从浏览器使用JavaScript)。如果我使用privateACL,一切正常,但如果我将其更改为public read我会得到403响应,消息是AccessDenied 我的策略中的acl属性与我要发送的acl表单参数匹配 我肯定已经过了身份验证阶段,就好像我故意搞砸了签名一样,我得到了signaturedesnotmatch响应 正如我所说,使用不同的ACL时,上传工作正常 你知道这是什么原因吗 根据要求,以下是我正在使用的代码(在我工作后需要进行一些整理):

我正在尝试发布图像数据(直接从浏览器使用JavaScript)。如果我使用
private
ACL,一切正常,但如果我将其更改为
public read
我会得到403响应,消息是
AccessDenied

  • 我的策略中的
    acl
    属性与我要发送的
    acl
    表单参数匹配
  • 我肯定已经过了身份验证阶段,就好像我故意搞砸了签名一样,我得到了
    signaturedesnotmatch
    响应
  • 正如我所说,使用不同的ACL时,上传工作正常
你知道这是什么原因吗

根据要求,以下是我正在使用的代码(在我工作后需要进行一些整理):

.directive's3ImageUploader',['$http','$filter',($http,$filter)->
替换:正确
限制:“E”
范围:真
模板:“”
链接:($scope$element)->
awsAccessKeyId=“…”
秘密=“…”
bucket='…'
文件夹=“…”
政策=
有效期:“2020-12-01T12:00:00.000Z”
条件:[
{bucket:bucket}
['starts-with','$key','']
{acl:'公共读取'}
['starts-with'、'$Content-Type'、'image/']
]
policyBase64=$filter('base64')策略
签名=$filter('hmacSha1')policyBase64,secret
$element.on“更改”,->
file=$element.get(0).files[0]
key=“#{folder}/#{new Date().getTime()}-#{file.name}”
formData=新的formData()
formData.append'key',key
formData.append'acl','public read'
formData.append“内容类型”,file.Type
formData.append'AWSAccessKeyId',AWSAccessKeyId
formData.append“policy”,policyBase64
formData.append“签名”,签名
formData.append“file”,file
$http.post“https://{bucket}.s3.amazonaws.com/”,formData,
标题:
“内容类型”:“未定义”`
transformRequest:(数据)->数据
]

事实证明,我正在使用其凭据的用户需要设置一个策略,以使我能够使用
公共读取

您可以发布您的ACL吗?这是一个用CoffeeScript编写的角度指令(抱歉)附加到上面的问题。我已经用我自己的AWS帐户设置的新bucket测试了相同的代码,它运行良好,因此这与我尝试使用的bucket的配置有关。Rob,我认为你遇到的问题与我遇到的问题相同。您能详细解释一下该用户的凭据策略吗?提前谢谢。
.directive 's3ImageUploader', ['$http', '$filter', ($http, $filter) ->
  replace: true
  restrict: 'E'
  scope: true
  template: '<input type="file" name="image" class="form-control input-lg">'
  link: ($scope, $element) ->
    awsAccessKeyId = '...'
    secret = '...'
    bucket = '...'
    folder = '...'
    policy =
      expiration: '2020-12-01T12:00:00.000Z'
      conditions: [
        {bucket: bucket}
        ['starts-with', '$key', '']
        {acl: 'public-read'}
        ['starts-with', '$Content-Type', 'image/']
      ]
    policyBase64 = $filter('base64') policy
    signature = $filter('hmacSha1') policyBase64, secret

    $element.on 'change', ->
      file = $element.get(0).files[0]
      key = "#{folder}/#{new Date().getTime()}-#{file.name}"

      formData = new FormData()
      formData.append 'key', key
      formData.append 'acl', 'public-read'
      formData.append 'Content-Type', file.type
      formData.append 'AWSAccessKeyId', awsAccessKeyId
      formData.append 'policy', policyBase64
      formData.append 'signature', signature
      formData.append 'file', file

      $http.post "https://#{bucket}.s3.amazonaws.com/", formData,
        headers:
          'Content-Type': `undefined`
        transformRequest: (data) -> data
]