amazon-s3 - 通过表单 POST 将文件直接上传到 S3 时出现 AWS 策略错误 - 简单条件无效

标签 amazon-s3 amazon-iam

尝试使用 aws sdk 中的预先身份验证 token 将文件从浏览器直接 POST 到 S3 时,出现以下错误

Invalid Policy: Invalid Simple-Condition: Simple-Conditions must have exactly one property specified.

我有一个 Angular 应用程序,我希望用户直接将文件上传到 S3,而不需要由我的服务器处理。我用这个作为指南 https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html

我使用 aws sdk 生成凭证并最终得到如下所示的内容,我将其附加到我的 formData 并发布到 s3

Key: "e1ace7-d3c-9846-87b9-48beed3768"
Policy: "eyJleHUsoiF0aW9uIjoiMjAyMC0wNy0yOFQxNTozMzoxMFoiLCJjb25kaXRpb25zIjpbeyJLZXkiOiJlMTcxYWNlNy1kM2NjLTQ4NTgtOiOS00OGJlZWQifSx7ImJ1Y2tldCI6Imxvd3kudGVt12cG9yYXJ5LnVwbG9hEFVtcWEifSx7IlgtQW16LUFsZ29yaXRobSI6IkFXE1BQy1TSEEyNTYddifSx7IlgtEG16LUNyZc4WRlbnRWwiOiJBS0lBUlFMSFlHU01XM1QyVlJNVC8yMDIwMDcyOC91cy1lYXbN0LTEvczMvYXdzNF9yZXF1ZXN0In0seyJYLUFtIjoiMjAyMDA3MjhaeUMTQzMzEwWiJ9XX0="
X-Amz-Algorithm: "AWS4-HMAC-SHA256"
X-Amz-Credential: "AKIOWEI78EVR/20200728/us-east-2/s3/aws4_request"
X-Amz-Date: "20200228T112310Z"
X-Amz-Signature: "25069f754c94b5f62fd1d2e632459asd1e62a3a8430b3ef952dde64d9cb8"
bucket: "mybucketname"

然后将其发布到 https://mybucketname.s3.amazonaws.com/ 并收到以下错误:(

Invalid Policy: Invalid Simple-Condition: Simple-Conditions must have exactly one property specified.

我的 S3 存储桶根据此政策打开了 CORS

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

我授权的 IAM 账户具有以下政策

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:Put*"
            ],
            "Resource": [
                "arn:aws:s3:::mybucketname/*"
            ]
        }
    ]
}

基于简单条件必须指定一个属性的错误消息我认为我只需要更改我的 iam 策略即可遵守,但我不确定如何操作? Web 用户应该能够将任何文件直接上传到相关的 S3 存储桶...

我无法在 IAM 文档中找到有关此错误的确切含义或如何指定一个属性或位置的任何内容。我确信这是一个小修复,我只是不确定在哪里。你猜我可以从哪里开始,简单条件必须只有一个属性?

最佳答案

结果我是如此接近,我必须在 aws javascript sdk 中的策略生成本身中指定 key ,而在我从 html post 端将其添加到表单之前

  const client = new AWS.S3(options);
  const form = await client.createPresignedPost(
  {
    Bucket: bucketname,
    Fields: {
      key: guid,
    },
  });

关于amazon-s3 - 通过表单 POST 将文件直接上传到 S3 时出现 AWS 策略错误 - 简单条件无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63156774/

相关文章:

amazon-web-services - AWS Lambda 无权执行权限中列出的操作

amazon-web-services - 身份验证后请求路由时访问被拒绝 - AWS Cloudfront 和 AWS S3

java - 构建 FAST Web 服务以使用 jersey 从 aws s3 下载图像

database - AWS Glue 缺少权限

python - 从 Python 使用 IAM 角色访问 AWS API Gateway

amazon-web-services - 将 Cognito 与 IAM 和 Amplify 结合使用进行授权

ssl - 无法选择自定义 SSL 证书(存储在 AWS IAM 中)

amazon-web-services - 复制到大目录时,AWS S3 Sync非常慢

amazon-web-services - 为什么我的终端返回这个 s3 错误?

mongodb - 如何高效地将许多大型 JSON 文件直接从 S3 导入 MongoDB