使用Authorization Signature Ver 4从浏览器直接上传到S3
我需要直接从浏览器上传文件到S3。 在开始时,我创建了一个正在工作的脚本,但要授权我需要将我的凭证accessKeyId和secretAccessKey,它不安全。
我发现我可以使用授权的“授权签名”
这似乎很好,但我无法找到我可以将这个授权头放在upload()方法的请求中。
我的授权标题示例:
授权:AWS4-HMAC-SHA256凭证= / 20151016 // s3 / aws4_request,SignedHeaders =内容类型;主机; x-amz-date,签名= 4eee344a71a58623febc4079024a27cb62f3d26546695422244fcefe50d0168d
谢谢你的建议。
我找到了解决这个问题的方法。 我的解决方案基于本网站的示例。
在最终的解决方案中,我不使用JavaScript SDK,它使用带有授权输入的邮件表单发送邮件参数。
您可以使用您的POST请求附带已签署的策略文档,以便使用AWS Signature Version 4安全地进行身份验证。
如果您使用的是Node,则可以使用服务器上的aws-s3-form软件包生成您的客户需要的必要表单数据,以便向S3发送成功的请求。
您可能想阅读我关于此主题的博客文章以获得全面的了解。
服务器端代码示例(节点)
let AwsS3Form = require('aws-s3-form')
[...]
// A hapi.js server route
server.route({
method: ['GET',],
path: '/api/s3Settings',
config: {
auth: 'session',
handler: (request, reply) => {
let {key,} = request.query
let keyPrefix = `u/${request.auth.credentials.username}/`
let region = process.env.S3_REGION
let s3Form = new AwsS3Form({
accessKeyId: process.env.AWS_ACCESS_KEY,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
region,
bucket,
keyPrefix,
successActionStatus: 200,
})
let url = `https://s3.${region}.amazonaws.com/${bucket}/${keyPrefix}${key}`
let formData = s3Form.create(key)
reply({
bucket,
region,
url,
fields: formData.fields,
})
},
},
})
示例客户端代码
let R = require('ramda')
let ajax = require('./ajax')
class S3Uploader {
constructor({folder,}) {
this.folder = folder
}
send(file) {
let key = `${this.folder}/${file.name}`
return ajax.getJson(`s3Settings`, {key,})
.then((s3Settings) => {
let formData = new FormData()
R.forEach(([key, value,]) => {
formData.append(key, value)
}, R.toPairs(s3Settings.fields))
formData.append('file', file)
return new Promise((resolve, reject) => {
let request = new XMLHttpRequest()
request.onreadystatechange = () => {
if (request.readyState === XMLHttpRequest.DONE) {
if (request.status === 200) {
resolve(s3Settings.url)
} else {
reject(request.responseText)
}
}
}
let url = `https://s3.${s3Settings.region}.amazonaws.com/${s3Settings.bucket}`
request.open('POST', url, true)
request.send(formData)
})
}, (error) => {
throw new Error(`Failed to receive S3 settings from server`)
})
}
}
链接地址: http://www.djcxy.com/p/39035.html
上一篇: Direct Upload to S3 from the browser with Authorization Signature Ver 4
下一篇: SignatureDoesNotMatch error while amazon web service SES through HTTP