【问题标题】:403 error on upload to S3 private bucket using pre-signed URL使用预签名 URL 上传到 S3 私有存储桶时出现 403 错误
【发布时间】:2021-07-07 20:08:18
【问题描述】:

我有一个使用 Amplify 的 React 应用程序,其中每个用户在 S3 存储桶中都有一个私有文件夹。用户只能将文件上传和下载到他们的私有存储桶。我希望某些用户能够使用 S3 预签名 URL 将文件上传到其他用户的私人文件夹。

我在后端创建了一个生成预签名 URL 的 Lambda 函数:

// do some authorization checks...
let key = uuidv4() + '.pdf'
let params = {
   Bucket: config.bucket,
   Key: key,
   ContentType: 'application/pdf',
   Expires: config.signedUrlExpirySeconds,
}
const url = await s3.getSignedUrl('putObject', params)
return url

现在我的前端中有 URL,在哪里


const [ file, setFile ] = useState(null)

const handleChange = async (e) => {
   const { target: { value, files }} = e
   setFile(files[0])
}

const getURL = async () => {
   // get the pre-signed URL...
}

const upload = async (url, type) => {
  try {
    const result = await axios.put(url, file, {
      headers: {
        'Content-Type': type
      }
    })
  }
  catch (err) {
    console.log(err)
  }
}

const handleUpload = async () => {
   const url = await getURL()
   await upload(url, 'application/pdf')
}

return (
   <div>
      <input type="file" accept=".pdf" onChange={handleChange} />
      <button onClick={handleUpload}>Upload</button>
   </div>
)

但是,这会返回 403 错误:

Error: Request failed with status code 403
    at createError (createError.js:16)
    at settle (settle.js:17)
    at XMLHttpRequest.handleLoad (xhr.js:62)

我有什么遗漏吗?

也许使用存储桶策略或 CORS 或者我是否使用 useState 来存储上传的文件(或者我是否需要将其转换为某些东西)?

如果有帮助,我的存储桶策略是:

{
    "Version": "2012-10-17",
    "Id": "Policy1624459513917",
    "Statement": [
        {
            "Sid": "Stmt1624459491997",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::##########/public/images/*"
        },
        {
            "Sid": "Stmt1624459491997b",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::##########/protected/*/images/*"
        }
    ]
}

【问题讨论】:

  • lambda 是否有s3:PutObject 权限?
  • 这行得通。非常感谢!我没有考虑检查生成预签名 URL 的 Lambda 的权限,因为它正在生成 URL 字符串,但生成的字符串似乎包含从 Lambda 函数继承的权限。
  • Np,我很高兴它有帮助 :) 请考虑在下面接受我的回答。

标签: amazon-s3 axios aws-amplify


【解决方案1】:

根据 OP 的评论,将 s3:PutObject 添加到 lambda 角色有效。

【讨论】:

    猜你喜欢
    • 2020-05-15
    • 2021-09-09
    • 1970-01-01
    • 2021-05-22
    • 2019-01-30
    • 1970-01-01
    • 2018-07-06
    • 2022-01-26
    • 2019-01-27
    相关资源
    最近更新 更多