s3预签名POST

时间:2018-08-20 17:24:36

标签: post amazon-s3 aws-sdk pre-signed-url

我当前正在使用AWS javascript SDK创建预签名的POST。 (请注意,这个问题不是关于预签名的PUT / URL,这是s3的另一个功能)

https://github.com/aws/aws-sdk-js/

尝试创建预签名帖子时,我会执行以下操作:

const params = {
  Bucket: 'myuniques3bucket',
  Fields: {
    Key: 'key1.png',
    'Content-Type': 'image/png'
  },
  conditions: [
    {bucket: 'myuniques3bucket'},
    {key: 'key1.png'},
    {'Content-Type': 'image/png'},
    ['content-length-range', 1024, 1048576], // 1KB to 10MB
    {'x-amz-date': amzDate},
    {'x-amz-algorithm': 'AWS4-HMAC-SHA256'},
    {'x-amz-credential': `${process.env.AWS_ACCESS_KEY_ID}/20180820/us-east-2/s3/aws4_request`}
  ],
  Expires: 300  // 300 seconds
}

s3.createPresignedPost(params, (err, data) => {
  console.log(data);
});

我正在围绕无法正常进行的上传过程进行测试。我发现此处没有强制使用内容类型,因为我可以使用其他内容类型的发布参数上传其他文件类型。

我不清楚JS SDK是否为用户管理签名过程,还是我需要做一些特殊的事情来获取签名中的各种密钥。

很明显,我可以做一些这样的事情,不清楚是否需要这样做。不知道图书馆是否应该为我处理。

TLDR; 我需要怎么做才能使用js sdk通过s3预签名POST激活内容类型验证?

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

策略文档仅指定表单字段必须包含的内容,以便S3接受已签名的请求为有效-在这种情况下,表单必须声明,内容类型为image/png,以便S3将对象与Content-Type: image/png存储在一起。该机制实际上并不验证对象本身的内容类型。 S3没有做到这一点的方法,JS SDK也没有。

您可以在浏览器的JS中执行此操作,也可以在上传后执行此操作,使用S3事件通知后台进程需要验证上传的内容。无论如何,对图像进行后处理可能是一个好习惯,因为您经常想去除任何不适当的元数据,例如某些图像中包含的数据,这些图像标识了照片的拍摄位置。

答案 1 :(得分:0)

您可以将S3存储设备设置为仅接受某些类型的文件。 看一下文档: https://aws.amazon.com/premiumsupport/knowledge-center/s3-allow-certain-file-types/