首页 > 其他分享 >【解决了一个小问题】aws s3 sdk 中的自定义header设置哪些不参与aws v4 签名

【解决了一个小问题】aws s3 sdk 中的自定义header设置哪些不参与aws v4 签名

时间:2024-09-25 18:46:22浏览次数:7  
标签:自定义 err s3 req aws header 签名

作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


在通过代理访问 s3 服务端的时候,s3 服务端返回类似的错误信息:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Error><Code>AuthorizationQueryParametersError</Code><RequestId>c28ddaf3c273308066f3c273-a6a4663</RequestId><HostId>RRHYUYpDsFKJfyJhAcRMVmMCHGnSHjcN</HostId><Message>no signed header: x-xxxx</Message></Error>

说明签名中使用了 header x-xxxx, 但是实际传输的过程中又没有带上对应 header。

那么,aws s3 sdk 的 client 中,如何才能让某些header参与签名计算,而不让某些header参与签名计算呢?

下面是我找到的解决办法:

	cli, err := s3Endpoint.NewClient()
	if err != nil {
		log.Fatal(err)
	}
	input := &s3.GetObjectInput{ // 从 s3 查询
		Bucket: aws.String(*bucket),
		Key:    aws.String(*file),
	}
	req, output := cli.GetObjectRequest(input)
	// 签名前移除自定义 header
	req.Handlers.Sign.PushFront(func(r *request.Request) {
		for k := range s3Endpoint.Headers {
			r.HTTPRequest.Header.Del(k)
		}
	})

	// 签名后再添加自定义 header
	req.Handlers.Send.PushFront(func(r *request.Request) {
		for k, v := range s3Endpoint.Headers {
			r.HTTPRequest.Header.Set(k, v)
		}
	})
	//
	err = req.Send()
	if err != nil {
		log.Fatalf("cfg=%+v, err=%s", s3Endpoint, err.Error())
	}
	defer output.Body.Close()
	if output.ContentLength == nil {
		output.ContentLength = aws.Int64(0)
	}
	str := strings.Builder{}
	str.Grow(1024 * 4)
	str.WriteString(fmt.Sprintf("LastModified: %s\n", output.LastModified.String()))

核心是这两行:

  • req.Handlers.Sign.PushFront() 签名之前干点啥
  • req.Handlers.Send.PushFront() 发送之前干点啥

The End. 希望对其他人有用。

标签:自定义,err,s3,req,aws,header,签名
From: https://www.cnblogs.com/ahfuzhang/p/18431963

相关文章

  • Flutter 自定义国家选择器:基于 A ~ Z字母索引的列表跳转与侧边栏导航实现
    在许多移动应用中,我们经常需要通过字母索引快速跳转到目标位置,比如通讯录、国家选择等功能。这篇博客将带大家实现一个仿照通讯录的Flutter国家选择器。通过一个字母索引的侧边栏,用户可以快速跳转到目标字母分组。效果:1.项目需求与设计思路我们需要实现一个包含多个国......
  • 自定义表格样式
     HTML:<divclass="table-container"><tablestyle="width:90%;margin-left:5%"><trclass="table-title"><thstyle="width:33%&qu......
  • AWS注册时常见错误处理
    引言创建AWS账号是使用AWS云服务的第一步,但在注册过程中可能会遇到一些常见的问题。本文中九河云将帮助您排查和解决在创建AWS账户时可能遇到的一些常见问题,包括未接到验证电话、最大失败尝试次数错误以及账户激活延迟等。常见问题及解决方法1.我没有接到AWS验证新账户的电......
  • 多用户自定义商城小程序源码系统 独立部署 到源代码包以及搭建部署教程
    系统概述随着移动互联网的迅猛发展,消费者的购物习惯逐渐向线上转移。传统电商平台虽然提供了一定的便利,但也存在一些局限性,如高昂的入驻费用、缺乏个性化定制等。为了适应市场需求,多用户自定义商城小程序源码系统应运而生。这一系统的开发旨在为企业和商家提供一个自主掌控、......
  • 自定义类型:结构体
    1.结构体类型的声明structtag{member-list;}variable-list;例如描述一个学生:structStu{charname[20];//名字intage;//年龄charsex[5];//性别charid[20];//学号};//分号不能丢structStu{charname[20];//名字intage;//年龄char......
  • 关于在vue2中自定义右键弹窗
            所需变量//右键点击的弹框对象rightDialogbox:null,//鼠标点击后获取的文本chooseText:'',//弹窗的偏移left:'',top:'',//右键点击的弹框显隐rightDialogShow:false,一、阻止原生事件......
  • PyTorch自定义学习率调度器实现指南
    在深度学习训练过程中,学习率调度器扮演着至关重要的角色。这主要是因为在训练的不同阶段,模型的学习动态会发生显著变化。在训练初期,损失函数通常呈现剧烈波动,梯度值较大且不稳定。此阶段的主要目标是在优化空间中快速接近某个局部最小值。然而,过高的学习率可能导致模型跳过潜在的......
  • helm初始化自定义应用
    使用Helm初始化一个应用(即创建一个HelmChart),可以通过Helm提供的helmcreate命令生成一个基础的HelmChart目录结构。下面是具体步骤:1.安装Helm首先确保你的环境中已经安装了Helm。如果还没有安装,可以按照Helm官方文档进行安装:Helm安装文档2.初始化HelmCh......
  • Android连接蓝牙自定义封装SDK(基于Cordova与ionic)
    今天给大家分享一款基于Cordova与ionic框架自定义封装的Android手机连接蓝牙的插件。自己公司遇到的业务需求是,与第三方公司合作,需要在项目现场打印项目物资与物料验收单,后期提供给财务核对报销等。第三方公司提供蓝牙打印机与手持机,我们需要自己结合业务开发相对应的功能。......
  • OpenCV_自定义线性滤波(filter2D)应用详解
    OpenCVfilter2D将图像与内核进行卷积,将任意线性滤波器应用于图像。支持就地操作。当孔径部分位于图像之外时,该函数根据指定的边界模式插值异常像素值。卷积核本质上是一个固定大小的系数数组,数组中的某个元素被作为锚点(一般是数组的中心)。上面讲了线性滤波的实质就是计算相......