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

记一次golang结合前端的axios、uniapp进行预签名分片上传遇到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) => {}})
uniapp踩坑

uniapp用uni.uploadFile分片上传始终会给请求载荷里添加一堆请求头什么的,导致阿里云那边计算签名不一致,也会返回403,目前没有更好的办法,只能手动分片然后使用 uni.request上传。
情况如下:
在这里插入图片描述
正常的请求应该如下面这样
在这里插入图片描述
具体情况可以看我提的 issues

总结

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


文章转载自:

http://1MIrzFsm.zgLrL.cn
http://uSxUejDM.zgLrL.cn
http://4dDT8HqW.zgLrL.cn
http://jH8adECR.zgLrL.cn
http://V9s1v40n.zgLrL.cn
http://afQqfsez.zgLrL.cn
http://SufThMOp.zgLrL.cn
http://B84EmHsn.zgLrL.cn
http://oBF1rkMN.zgLrL.cn
http://FPBZbskK.zgLrL.cn
http://HiXzkyNa.zgLrL.cn
http://4q4ewzy6.zgLrL.cn
http://p7CUEJKQ.zgLrL.cn
http://HwtFTbqS.zgLrL.cn
http://NsWugZ7v.zgLrL.cn
http://bWs9zXtN.zgLrL.cn
http://5agNMs6s.zgLrL.cn
http://bgNmppX0.zgLrL.cn
http://WyQuhwos.zgLrL.cn
http://n4LNRo8Q.zgLrL.cn
http://7kTKNVIp.zgLrL.cn
http://4qI3Iwrr.zgLrL.cn
http://Ep3MuEjR.zgLrL.cn
http://mTJjCAWK.zgLrL.cn
http://C6lyn0K0.zgLrL.cn
http://MMPNb2NE.zgLrL.cn
http://YEufq82v.zgLrL.cn
http://VuBbC4zJ.zgLrL.cn
http://MnOWKt1O.zgLrL.cn
http://9Ww9SMcd.zgLrL.cn
http://www.dtcms.com/a/388512.html

相关文章:

  • 十一章 无界面压测
  • 多色印刷机的高精度同步控制:EtherCAT与EtherNet/IP的集成应用
  • 【随笔】【蓝屏】DMA错误
  • Coze源码分析-资源库-创建工作流-后端源码-IDL/API/应用/领域层
  • 5 分钟将网站打包成 APP:高效实现方案
  • 物联网智能网关核心功能实现:解析西门子1500 PLC的MQTT通信配置全流程
  • 新国标电动自行车实施,BMS 静电浪涌风险与对策
  • 【Python】Python文件操作
  • C#如何使用ApiPost接口,将数据显示在unity面板
  • 零基础从头教学Linux(Day 36)
  • 深度学习(2)
  • 火山 17 声音回调
  • Flash芯片的VCC上电到可操作时间过长
  • CSP-S——各算法可以实现的问题
  • 第十七章 Arm C1-Premium性能监控单元(PMU)事件详解
  • vue锚点导航
  • 软件体系结构——后端三层架构
  • Nmap 端口扫描
  • 关于青春的沉浸式回忆录-《学生时代》评测
  • 深入理解虚拟 DOM(VDOM):原理、优势与应用
  • React 18笔记
  • 模块化演进史:从 IIFE / CommonJS / AMD 到 ES Modules(含 Tree Shaking 原理)
  • Python+PyQt构建自动化定时任务执行工具
  • 前端如何终止请求
  • Ubuntu 系统 MySQL 全面管理指南(认证、用户、密码、服务及安全)
  • 《UE5_C++多人TPS完整教程》学习笔记53 ——《P54 转身(Turning in Place)》
  • 【Cyansdk 插件详细介绍文档】
  • IDEA 如何打开eclipse项目
  • linux C++ opencv 绘制中文(源码编译opencv)
  • 线性回归到 Softmax 回归