【发布时间】:2019-10-11 10:29:01
【问题描述】:
我正在使用 在我的服务器上生成一个 AWS S3 预签名的帖子对象。然后,我尝试使用 fetch 使用预签名的 post url 和字段将文件从客户端直接上传到 S3 存储桶,但我得到了一个 s3.createPresignedPost()403 Forbidden。
我尝试手动将表单字段添加到我的 FormData 对象以直接匹配此示例:https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html,但继续收到 403 错误。
用于生成帖子对象的服务器端函数
const AWS = require("aws-sdk/global"); const S3 = require("aws-sdk/clients/s3"); 常量 uuidv4 = 要求(“uuid/v4”); AWS.config.update({ accessKeyId:process.env.S3_KEY_ID, secretAccessKey:process.env.S3_SECRET_KEY, 地区:“us-east-1” }); 常量 s3 = 新 S3(); const getPresignedPostData = (bucket, directory) => { 常量键 = `${directory}/${uuidv4()}`; 常量 postData = s3.createPresignedPost({ 桶:桶, 字段:{键:键,success_action_status:“201”}, 条件:[{ acl: "public-read" }], 内容类型:“图像/*”, 过期:300 }); 返回后数据; };返回类似于:
{ 字段:{ 密钥:“5cd880a7f8b0480b11b9940c/86d5552b-b713-4023-9363-a9b36130a03f” 政策:{Base64 编码的政策字符串} X-Amz 算法:“AWS-HMAC-SHA256” X-Amz 凭据:“AKIAI4ELUSI2XMHFKZOQ/20190524/us-east-1/s3/aws4_request” X-Amz-日期:“20190524T200217Z” X-Amz 签名:“2931634e9afd76d0a50908538798b9c103e6adf067ba4e60b5b54f90cda49ce3” 桶:“图片完美照片” 成功动作状态:“201” }, 网址:“https://s3.amazonaws.com/picture-perfect-photos” }我的客户端函数如下所示:
const uploadToS3 = async ({ fields, url }, file) => { 常量 formData = new FormData(); Object.keys(fields).forEach(key => formData.append(key, fields[key])); formData.append("文件", 文件); 尝试 { 常量配置 = { 方法:“POST”, 正文:表格数据 }; 常量响应 = 等待获取(网址,配置); 如果(!response.ok){ 抛出新错误(response.statusText); } 常量数据 = 等待 response.json(); 返回数据; } 捕捉(错误){ 控制台.log(err.message); } };而我的 S3 存储桶 CORS 配置如下:
我希望获得在设置success_action_status: "201" 时发送的 XML 文档,但我不断收到403 Forbidden
【问题讨论】:
-
用户是否有权访问存储桶? s3 策略有什么限制吗?
-
服务器端认证的用户有访问权限。我能够正确地从服务器发布文件。有关详细信息,公共访问如下: 阻止所有公共访问:关闭 阻止对通过新访问控制列表 (ACL) 授予的存储桶和对象的公共访问:关闭 阻止通过任何访问控制列表 (ACL) 授予的对存储桶和对象的公共访问权限:Off 阻止对通过新的公共存储桶策略授予的存储桶和对象的公共访问权限:On 阻止公共和交叉-帐户通过任何公共存储桶策略访问存储桶和对象:开启
-
@Jonathan 你解决了吗?