AWS S3-从getSignedUrl()输入URL会返回403 SignatureDoesNotMatch错误

时间:2018-11-27 21:47:57

标签: node.js amazon-s3 aws-lambda serverless

这个问题已经让我发疯了两天。

目标:通过AWS Javascript SDK中的getSignedUrl函数提供的预签名URL将图像直接从浏览器直接上传到S3。

我使用getSignedUrl生成URL没有任何问题。以下代码...

const params = {
  Key:         key,
  Bucket:      process.env.S3_BUCKET,
  ContentType: "image/jpeg"
};

S3.getSignedUrl("putObject", params, callback);

...产生如下内容:

https://s3.amazonaws.com/foobar-bucket/someImage.jpeg?AWSAccessKeyId=ACCESSKEY123&Content-Type=image%2Fjpeg&Expires=1543357053&Signature=3fgjyj7gpJiQvbIGhqWXSY40JUU%3D&x-amz-acl=private&x-amz-security-token=FQoGZXIvYXdzEDYaDPzeqKMbfgetCcZBaCL0AWftL%2BIT%2BP3tqTDVtNU1G8eC9sjl9unhwknrYvnEcrztfR9%2FO9AGD6VDiDDKfTQ9SmQpfXmiyTKDwAcevTwxeRnj6hGwnHgvzFVBzoslrB8MxrxjUpiI7NQW3oRMunbLskZ4LgvQYs8Rh%2FDjat4H%2F%2BvfPxDSQUSa41%2BFKcoySUHGh2xqfBFGCkHlIqVgk1KELDHmTaNckkvc9B4cgEXmAd3u1f1KC9mbobYcLLRPIzMj9bLJH%2BIlINylzubao1pCQ7m%2BWdX5xAZDhTSNwQfo4ywSWV7kUpbq2dgEriOiKAReEjmFQtuGqYBi3t2dhrasptOlXFXUozdz23wU%3D

但是通过PUT请求将图像上传到所提供的URL总是会从S3返回403 SignatureDoesNotMatch错误。

什么起作用:

  • 从AWS Lambda的本地实例调用getSignedUrl()(通过serverless-offline)。

什么不起作用:

  • 将查询字符串变量设置为标题(Content-Type,x-amz- *等)
  • 删除所有标题
  • 获取URL(私有,公共读写,无ACL等)时更改ACL
  • 在节点中更改aws-sdk的区域
  • 尝试POST而不是PUT(值得一试)

在此问题上的任何帮助将不胜感激。如果这仍然是一个问题,我将把计算机扔出窗户,然后沮丧地跳出来,因为它根本不想工作!

2 个答案:

答案 0 :(得分:0)

我知道了。调用getSignedUrl()的Lambda函数没有正确的IAM角色权限来访问有问题的S3存储桶。在serverless.yml中...

iamRoleStatements:
    - Effect: Allow
      Action:
        - s3:*
      Resource: "arn:aws:s3:::foobar-bucket/*"

我实际上不会在这里使用通配符,但是您会看到图片。即使由于缺少权限注定URL失败,getSignedUrl()仍会成功并返回URL的事实极具误导性。

我希望这个答案将来能帮助一些困惑的人。

答案 1 :(得分:0)

它对我来说是一种守旧的工作方式:(axios一直在给“ 403禁忌”)

{
  path: '/editor',
  name: 'editor',
  meta: {
    requiresAuth: true,
    requiresAdmin: true,
    requiresEditor: true,
  },
  children: [{
    path: ':appSlug/layout-editor/:pageSlug',
    name: 'layout-editor',
    component: () => import('./views/editor/Index.vue'),      
  }]
},

请注意,这需要从客户端运行,因此您需要在存储桶中配置“跨源警察”。

enter image description here