使用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