使用预先签名的 url 将 PUT 到 S3 会出现 403 错误

2024-02-15

我正在使用 Node 获取 S3 的 presignedRUL,以便将图像放入 S3 存储桶。

var aws = require('aws-sdk');
// Request presigned URL from S3
exports.S3presignedURL = function (req, res) {
  var s3 = new aws.S3();
  var params = {
    Bucket: process.env.S3_BUCKET, 
    Key: '123456', //TODO: creat unique S3 key
    //ACL:'public-read',
    ContentType: req.body['Content-Type'], //'image/jpg'
  };
  s3.getSignedUrl('putObject', params, function(err, url) {
      if(err) console.log(err);
      res.json({url: url});
  });
};

这成功检索了表单的预签名 URL...

(我必须包含过期标头吗?)

回到客户端(Web 应用程序),我使用 Angular 生成 HTTP 请求。我使用过 $http 和 ngFileUpload,但都没有成功。这是我的 ngFileUpload 代码。

Upload.upload({
    url: responce.data.url, //S3 upload url including bucket name
    method: 'PUT',
    'Content-Type': file.type, //I have tried putting the ContentTyep header all over
    headers: { 
        //'x-amz-acl':'public-read',
        'Content-Type': file.type, 
    }, 
    data: { 
        file: file,
        headers:{'Content-Type': file.type,}
    },                         
})

然而,似乎无论我如何格式化标头,我总是收到 403 错误。在错误的 XML 中,它说:

SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.

我不认为 CORS 是一个问题。最初我遇到了一些 CORS 错误,但它们看起来不同,我通过对 S3 存储桶 CORS 设置进行一些更改来消除它们。我已经尝试了对 presignedURL 的请求和对 S3 的 PUT 请求的标头的大量试验和错误设置,但我似乎找不到正确的组合。

我确实注意到,当我 console.log 403 响应错误时,该字段

config.headers:{Content-Type: undefined, __setXHR_: ƒ, Accept: "application/json, text/plain, */*"}

这是说Content-Type头没有设置吗?当我在我能想到的所有地方都设置了该标头时,怎么可能呢?无论如何,我已经把头撞在墙上了一会儿......


编辑:根据要求,我当前的 CORS。 (我把所有东西都投入其中,以摆脱之前的 CORS 警告。只有在上传工作正常后,我才会将其精简到必需的部分。)

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedOrigin>http://localhost:9500</AllowedOrigin>
    <AllowedOrigin>https://localhost:9500</AllowedOrigin>
    <AllowedOrigin>http://www.example.com</AllowedOrigin>
    <AllowedOrigin>https://www.example.com</AllowedOrigin>
    <AllowedOrigin>http://lvh.me:9500</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <ExposeHeader>ETag</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
    <AllowedHeader>Content-Type</AllowedHeader>
    <AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>

面临同样的问题。发现我用来创建预签名 URL 的内容类型与我发送到 S3 的对象的内容类型不匹配。我建议您在创建预签名 URL 时添加 Expiration 标头(我也这样做了),并在控制台中检查当您向 S3 执行 put 操作时发送的内容类型到底是什么。此外,数据只需是文件,而不是您在其中创建的结构。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用预先签名的 url 将 PUT 到 S3 会出现 403 错误 的相关文章

随机推荐

  • 使用 Unirest C# 将 http 响应正文转换为 JSON 格式

    我正在使用 mashape api https market mashape com montanaflynn dictionary https market mashape com montanaflynn dictionary 这是我的
  • Clojure 中函数的类型提示

    我正在尝试解决 Clojure 中的反射警告 该警告似乎是由于对作为普通 Java 对象的函数返回值缺乏类型推断而导致的 演示该问题的简单示例代码 set warn on reflection true defn foo Integer x
  • Ruby 如何处理字节/二进制?

    我正在尝试通过套接字发送一系列二进制字节 以满足我公司使用的特定标准 我公司中没有人以前使用过 Ruby 来实现这一点 但在其他语言中 他们一次发送一个字节的数据 通常使用某种 打包 方法 无论如何 我找不到动态创建二进制文件 或者根本无法
  • Flexslider 手动控件不起作用

    我已经使用 Flexslider 创建了一个滑块 并且尝试使用 manualControls 创建导航菜单 但链接不起作用 以下是 flexslider 和滑块 导航本身的代码 柔性滑块 滑块和
  • os.system 中的变量

    我在用os systemPython 中的方法在 Linux 中打开文件 但我不知道如何在 os system 命令内传递变量 a import os a 4 os system gedit a test txt 如何在命令中将变量作为整数
  • C++ 中的整数字节交换

    我正在为我的 C 课程做家庭作业 我正在研究的问题如下 编写一个函数 它接受一个无符号短整型 2 个字节 并交换字节 例如 如果交换后 x 258 00000001 00000010 则 x 将为 513 00000010 00000001
  • AngularJS 应用程序:从 JSON 加载数据一次并在多个控制器中使用它

    我正在开发一个使用 AngularJS 作为框架的移动应用程序 目前我有一个与此类似的结构 app config routeProvider function routeProvider routeProvider when templat
  • 我无法在 TextView 中显示计时器

    我创建了一个带有倒计时器的列表视图 下面是代码 public class TicketAdapter extends ArrayAdapter
  • 如何避免详细日志记录的影响?

    如何缓冲详细的日志记录语句 即logging debug 直到Python进程结束 这需要自定义记录器吗 我当前的设置使用类似于的配置文件Scott s https stackoverflow com questions 4441842 p
  • Hibernate 中 SchemaUpdate 和 SchemaExport 的区别

    Hibernate 中的 SchemaUpdate 和 SchemaExport 有什么区别 架构更新 http docs jboss org hibernate orm 3 3 api org hibernate tool hbm2ddl
  • 正则表达式匹配后面没有某个字符串的字符串

    我有一个字符串块 如下所示 1 While EngineSpeed b4tgup 2 While AcceleratorPedal desddd lt 2 3 While AcceleratorPeda desddd lt 2 4 Whil
  • Mac El Capitan 中忽略 /etc/hosts (10.11.5)

    我正在尝试将现有网址重定向到我的子网上的远程计算机 为此 我将以下内容放入 etc hosts 192 168 1 249 holub com 并刷新 DNS 缓存 sudo dscacheutil flushcache sudo Kill
  • 如何防止模糊过渡时图像闪烁?

    如何防止滤镜过渡结束时出现闪光 模糊效果 我使用的是铬 下面的片段显示了问题 window on load function event setTimeout function sec addClass active 1000 sec ma
  • 还可以调试GWT吗?

    只有我一个人这样吗 或者甚至可以再运行 调试 GWT 应用程序吗 全新安装 Google Plugin for Eclipse Juno 使用 GWT GAE 创建新的 Web 应用程序 运行 调试 失败 这是在 Mac 上运行的 带有 C
  • 以弹簧形式绑定一组

    我正在尝试将弹簧表单与命令对象中的集合绑定 在我的指挥课上实例我将集合定义为 private Set
  • 如何以ls格式显示文件和文件夹大小

    ls l 将显示所有文件和文件夹的详细信息 但文件夹大小不正确 始终显示 4 0k 那么如何将文件 文件夹显示为ls l除了具有正确大小的文件夹之外的格式 谢谢 ls l 格式 drwxr xr x 9 jerry jerry XXX 0K
  • 为什么 KNN 使用自定义指标会很慢?

    我使用的数据集包含大约 200k 对象 每个对象都有 4 个特征 我通过 K 最近邻 KNN 和欧几里德度量对它们进行分类 过程大约在 20 秒内完成 最近我有一个使用自定义指标的理由 也许会取得更好的结果 我已经实现了自定义指标 并且 K
  • Flex 中的异步函数调用

    Flex 中可以异步调用函数吗 我想定期解析文件而不阻塞应用程序的其余部分 建议的方法是什么 Actionscript 不支持多线程 我认为这才是您真正要问的问题 虽然该功能不是 ActionScript 或 Flex 固有的 但您可以使用
  • 这种类型的内存是在堆还是堆栈上分配的?

    在 C 上下文中 这并不重要 class Foo private int x 100 public Foo 我所学到的告诉我 如果您像这样创建 Foo 的实例 Foo bar new Foo 然后数组 x 被分配在堆上 但是如果您像这样创建
  • 使用预先签名的 url 将 PUT 到 S3 会出现 403 错误

    我正在使用 Node 获取 S3 的 presignedRUL 以便将图像放入 S3 存储桶 var aws require aws sdk Request presigned URL from S3 exports S3presigned