【发布时间】: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 天更合适。无论如何,值得一试。
-
我将它设置为未来几个小时。没有骰子。
-
响应正文中是否没有伴随错误的内容?
-
这是响应的正文:
AccessDeniedAccess Denied 61A311EC384705FA n3hmQu2rAJF5+tKjYdS7CtUcgQX7kpqGtfdFD1Ylma /JVhASngvET/O+r0Z528arrayWj2ddmkqY= -
我认为这是一个 IAM 问题。当我授予我的凭据时,AdministrtorAccess 策略一切都突然起作用了。我的 putObject 设置正确,我可以使用 S3 浏览器上传。
标签: javascript node.js amazon-web-services amazon-s3 cryptography