node.js - Amazon S3 - 无法加载资源 : the server responded with a status of 403 (Forbidden)

标签 node.js reactjs amazon-s3

这是我第一次使用 Amazon S3。我已阅读问题和答案。它们看起来都与这个问题相似,但没有一个答案为我解决了这个问题。

我可以成功上传图片,但我可以让它们显示它们(403禁止状态)。

这是存储桶的策略:

{
"Version": "2012-10-17",
"Id": "Policy1475848347662",
"Statement": [
    {
        "Sid": "Stmt1475848335256",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::235314345576:user/userx"
        },
        "Action": [
            "s3:*"
        ],
        "Resource": "arn:aws:s3:::bucketdev/*"
    }
]}

这是 CORS 配置:

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

这是用户的政策:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:ListAllMyBuckets",
            "s3:ListBucket",
            "s3:ListBucketVersions",
            "s3:GetObject",
            "s3:ListBucketMultipartUploads"
        ],
        "Resource": [
            "arn:aws:s3:::*"
        ]
    }
]}

使用此组件:https://www.npmjs.com/package/react-dropzone-s3-uploader .

有人可以帮忙吗?

谢谢。

最佳答案

有两点需要注意:

  • 在哪里分配访问 Amazon S3 的权限
  • 要分配哪些权限

在哪里分配访问 Amazon S3 的权限

Amazon S3 中的对象默认情况下是私有(private)的。可以通过三种方式分配访问对象的权限:

  • 对象 ACL(访问控制列表):这些是对象本身的权限
  • 存储桶策略:这是一组应用于整个存储桶的规则,但它也可以指定与存储桶的子集相关的权限(例如存储桶内的特定路径)
  • 应用于 IAM 用户、组或角色的 IAM 策略:这些权限专门应用于这些实体

如果您的目的是保持 S3 存储桶内容的私密性,但允许特定用户访问,那么您应该向 IAM 用户 分配权限(正如您所做的那样)。这也意味着您不需要存储桶策略,因为通过上述任何一种方法授予访问权限就足够了。

参见文档:Guidelines for Using the Available Access Policy Options

此外,仅当从一个域提供的 HTML 页面引用来自另一域的内容时,才需要 CORS 策略。您很可能不需要 CORS 策略 - 进行一些测试以确认情况是否如此。

分配哪些权限

这总是令人困惑...有些权限与存储桶关联,而有些权限与存储桶的内容关联。

您的策略中的以下权限应位于存储桶级别 ( arn:aws:s3:::MyBucket ):

  • s3:创建桶
  • s3:删除桶
  • s3:删除桶策略
  • s3:GetBucketPolicy
  • s3:GetLifecycleConfiguration
  • s3:ListBucket
  • s3:ListBucketMultipartUploads
  • s3:PutBucketPolicy
  • s3:PutLifecycleConfiguration

其他 API 调用(例如 GetObject )应在对象级别(例如 arn:aws:s3:::MyBucket/* )。

参见:Specifying Permissions in a Policy

因此,与您的 IAM 用户关联的策略应如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1",
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:ListBucket",
                "s3:ListBucketVersions",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "arn:aws:s3:::MY-BUCKET"
            ]
        },
        {
            "Sid": "Stmt2",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::MY-BUCKET/*"
            ]
        }
    ]
}

这授予 GetObject对存储桶内的对象(而不是存储桶本身)的权限。

关于node.js - Amazon S3 - 无法加载资源 : the server responded with a status of 403 (Forbidden),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39922179/

相关文章:

amazon-s3 - CloudFormation 脚本陷入 UPDATE_ROLLBACK_FAILED,AWSLambdaInternal 需要 GetObject 权限。如何解决?

javascript - 使用 CORS 请求设置 Cookie

node.js - Node Red 不会自动加载流

javascript - 沿 Promise 链传递值

javascript - React Router 匹配对象空响应问题

reactjs - Navigator Pop 上的 React Native 组件生命周期

apache-spark - Amazon EMR 和 S3,org.apache.spark.sql.AnalysisException : path s3://. .../var/table 已存在

amazon-web-services - "The specified key does not exist"用于部署在使用 CloudFront 部署在 S3 上的 VueJS 应用程序

javascript - Node : RegExp returns nothing

javascript - ES6 导入/导出未按预期运行