当前位置: 首页 > news >正文

记一次golang结合前端的axios进行预签名分片上传遇到403签名错误踩坑

问题背景

在开发一个基于阿里云OSS大文件上传功能时,技术栈采用Golang作为后端语言,配合阿里云OSS V2版SDK,前端使用Vue和Axios。项目需求要求实现大文件分片上传至OSS的功能,但在实际开发过程中遇到了签名验证失败的问题。

技术环境

后端使用Golang编写,调用阿里云OSS官方提供的V2版本SDK生成预签名URL。前端使用Vue框架搭配Axios库发起文件上传请求。OSS存储桶的权限配置已经正确设置,确保了PutObject操作的合法性。

问题现象

前端通过Axios获取到后端生成的预签名URL后,尝试上传文件时,OSS服务端返回403错误,提示签名不匹配。检查发现签名生成逻辑和权限配置均无异常,但所有请求均携带了默认的Content-Type: application/x-www-form-urlencoded请求头,而该请求头未被包含在签名计算中。

排查过程

  1. 基础检查:确认OSS存储桶的CORS配置允许前端域名,且PutObject权限已正确赋权。
  2. 签名验证:对比签名生成逻辑与阿里云官方文档,确认签名算法未遗漏必要参数。
  3. 请求头分析:通过抓包工具发现Axios自动添加的Content-Type头未被包含在签名计算中,导致服务端验签失败。
  4. SDK限制:检查阿里云OSS V2版SDK发现,签名生成接口未提供请求头定制化选项,无法将Content-Type纳入签名计算。

关键发现

阿里云OSS的签名机制要求所有参与签名的请求头必须与服务端计算的签名完全一致。Axios的默认行为会自动添加Content-Type: application/x-www-form-urlencoded头,而该头未被包含在后端生成的签名中,导致服务端验签失败。

解决方案探索

尝试通过以下方式解决问题:

  1. 修改Axios配置:试图取消默认的Content-Type头,发现Axios在部分版本中无法完全移除该头。
  2. 调整签名逻辑:强制后端在生成签名时包含该请求头,但受限于SDK设计无法实现。
  3. 自定义请求库:考虑替换Axios为其他可精细控制请求头的库,但成本较高。
  4. 服务端代理上传:改为由后端直接接收文件再上传至OSS,牺牲了前端直传的性能优势。

经过排查和阿里云客服的反馈,发现前端Axios默认会添加'Content-Type': 'application/x-www-form-urlencoded'的Header,而后端生成的签名未包含此Header,导致签名验证失败。由于阿里云OSS的签名机制要求请求的Header必须与签名时完全一致,因此多出的Header会导致403错误。

解决方案

最后还是在axios上下功夫得以解决(本来都想放弃axios改用原生的方案了,尝试了几种方案最后终于把这个磨人的header去掉了),示例代码如下:

  const response = await axios({method,url: uploadUrl,data: partBlob,transformRequest: [(data, headers) => {// 确保 Content-Type 头部被删除delete headers.put['Content-Type']return data}],onUploadProgress: (progressEvent) => {}})

总结

该问题的核心在于签名与请求Header的不一致。通过调整后端签名逻辑或前端请求配置,可以解决这一问题。如果问题复杂,预签名URL是一种更灵活的替代方案。


文章转载自:

http://HbUIsz0U.frghq.cn
http://4f0nbDqm.frghq.cn
http://ZIwgCnKL.frghq.cn
http://jc3FODQD.frghq.cn
http://4nL5kAhR.frghq.cn
http://sPz8cxEW.frghq.cn
http://3CXgjfkj.frghq.cn
http://P21Jm4wH.frghq.cn
http://2auuA5qM.frghq.cn
http://bZFltnQ9.frghq.cn
http://z9qT1gVU.frghq.cn
http://LyZyGKAP.frghq.cn
http://4TBDzTX4.frghq.cn
http://N4imTfno.frghq.cn
http://2jbh4AN2.frghq.cn
http://nJgCXJlZ.frghq.cn
http://ZIMjdkZM.frghq.cn
http://U5c2FU3t.frghq.cn
http://mS5msguD.frghq.cn
http://dBDOz9WE.frghq.cn
http://8BMbXQUx.frghq.cn
http://XdE3vdTn.frghq.cn
http://Bdr6lM9M.frghq.cn
http://tcDQwYFe.frghq.cn
http://EPuefxjL.frghq.cn
http://uWfcPEGm.frghq.cn
http://WNXlzlf6.frghq.cn
http://wJxgkal9.frghq.cn
http://ilILeKgI.frghq.cn
http://HXPhpwA6.frghq.cn
http://www.dtcms.com/a/387518.html

相关文章:

  • LeetCode 面试经典 150_哈希表_单词规律(41_290_C++_简单)
  • 微信小程序修改页面导航标题的方式
  • Torch-Rechub学习笔记-task1
  • LightTools照明光学系统设计
  • 从技术探索到社区共建:程宇翔的隐私计算开源之路
  • 【Redis】云原生时代Redis高可用新范式:多活架构+异地容灾 生成详细内容
  • JsonCpp: 一个好用且轻量级的JSON解析库
  • 【设计模式】桥接模式
  • ACP(五):优化提示词(Prompt),精细地控制大模型的输出
  • Egg.js 性能测试全解析:从压力测试到深度调优
  • 自制脚本,解决Ubuntu20.04 键盘会突然失灵、键盘延迟突然很大问题
  • 172.在vue3中使用openlayers:引用 hover 效果,展示各种鼠标 cursor 样式
  • SpringBoot Oracle
  • LLMs之IR:《MUVERA: Multi-Vector Retrieval via Fixed Dimensional Encodings》的翻译与解读
  • Redis与Java集成实战:从入门到高级应用
  • Chromium 138 编译指南 macOS篇:配置depot_tools(三)
  • qt QHXYModelMapper详解
  • 机器学习中的编码问题和标准化:类别编码、one-hot编码缺陷及改进
  • Qt QHorizontalStackedBarSeries详解
  • Python爬虫实战:研究Pandas,构建全运会数据采集和分析系统
  • 告别冗余 DOM:Vue Fragment 用法与性能优化解析
  • 快速排序:原理、实现与优化
  • JavaScript性能优化实战:深入剖析性能瓶颈与最佳实践
  • Lattice ECP5系列FPGA介绍
  • PySpark 窗口函数row_number、lag、lead的使用简述
  • 华为FreeBuds 7i不同设备要如何连接?
  • 使用LVS架设服务器集群系统实现负载均衡与高可用的知识点详解
  • 84-dify案例分享-使用Qwen-Image实现文生图、图生图
  • 留个档,Unity,Animation控制相机,出现抖动的问题记录
  • CentOS 8.5部署Zabbix6.0 server端