【问题标题】:Access Denied when trying to do Browser-Based Upload using HTTP POST (Using AWS Signature Version 4)尝试使用 HTTP POST(使用 AWS 签名版本 4)进行基于浏览器的上传时访问被拒绝
【发布时间】:2017-03-22 09:09:41
【问题描述】:

我正在使用这些资源来尝试使其正常工作:

我正在尝试通过签署表单将文件上传到我的 s3 存储桶。根据文档,我已将我的表单和政策缩减为最基本的必需选项,但我仍然得到“AccessDenied”。目前,为了简单起见,日期是硬编码的。

我的 ExpressJS 路由器中的代码

var accessKeyID = credentials.accessKeyId;
var secretAccessKey = credentials.secretAccessKey;

var bucket = 'images.mybucket.com';
var region = 'us-east-1';
var expiration = '2016-11-28T12:00:00.000Z';
var date = '20161108';
var serviceName = 's3';
var credentialUrl = accessKeyID + '/' + date + '/' + region + '/' + serviceName + '/aws4_request';
var amazonDate = '20161108T000000Z';

var s3Policy = {
    'expiration': expiration,
    'conditions': [
        {'bucket': bucket},
        ['starts-with', '$key', 'UserUploads/'],
        {'acl': 'public-read'},
        {'x-amz-server-side-encryption': 'AES256'},
        {'x-amz-credential': credentialUrl},
        {'x-amz-algorithm': 'AWS4-HMAC-SHA256'},
        {'x-amz-date': amazonDate}
    ]
};

var base64Policy = new Buffer(JSON.stringify(s3Policy), 'utf-8').toString('base64');

var signatureKey = getSignatureKey(secretAccessKey, date, region, serviceName);

var s3Signature = CryptoJS.HmacSHA256(base64Policy, signatureKey).toString(CryptoJS.enc.Hex);

function getSignatureKey(key, dateStamp, regionName, serviceName) {        
    var kDate = CryptoJS.HmacSHA256(dateStamp, 'AWS4' + key);
    var kRegion = CryptoJS.HmacSHA256(regionName, kDate);
    var kService = CryptoJS.HmacSHA256(serviceName, kRegion);
    var kSigning = CryptoJS.HmacSHA256('aws4_request', kService);
    return kSigning;
}

HTML

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<form action="http://images.mybucket.com.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
    <p>key to upload</p>
    <input type="input" name="key" value="UserUploads/${filename}">
    <input type="hidden" name="acl" value="public-read">
    <input type="hidden" name="x-amz-server-side-encryption" value="AES256">
    <input type="text" name="X-Amz-Credential" value="REDACTED-access-key-id/20161108/us-east-1/s3/aws4_request">
    <input type="text" name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256">
    <input type="text" name="X-Amz-Date" value="20161108T000000Z">
    <p>tags for file</p>
    <input type="hidden" name="Policy" value="REDACTED-base64-encoded-policy">
    <input type="hidden" name="X-Amz-Signature" value="REDACTED-signature">
    <p>file</p>
    <input type="file" name="file"><input type="submit" value="Upload File to S3">
</form>

【问题讨论】:

  • 我可能会把你引向错误的方向,但 Signature Version 4 中有一些限制可能会阻止任何到期日期超过 7 × 24 小时的东西被认为是有效的,尽管它显然没有在表单发布上传的上下文中提及。将您的到期时间设置为仅在未来几个小时后可能比此代码中显示的 20 天更合适。无论如何,值得一试。
  • 我将它设置为未来几个小时。没有骰子。
  • 响应正文中是否没有伴随错误的内容?
  • 这是响应的正文: AccessDenied Access Denied61A311EC384705FA n3hmQu2rAJF5+tKjYdS7CtUcgQX7kpqGtfdFD1Ylma /JVhASngvET/O+r0Z528arrayWj2ddmkqY=
  • 我认为这是一个 IAM 问题。当我授予我的凭据时,AdministrtorAccess 策略一切都突然起作用了。我的 putObject 设置正确,我可以使用 S3 浏览器上传。

标签: javascript node.js amazon-web-services amazon-s3 cryptography


【解决方案1】:

s3:PutObjectAcl 权限是必需的,因为在您的存储桶策略中,您通过 "acl": "public-read" 设置 acl。

【讨论】:

    猜你喜欢
    • 2019-09-13
    • 1970-01-01
    • 2016-03-24
    • 2017-04-10
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多