回到笔记

MinIO 预签名上传的认证陷阱

使用 S3 预签名 URL 上传文件时,认证信息只能出现一次;如果客户端配置了全局拦截器,还需要为上传请求单独放行。

预签名 URL 已经把临时凭证、签名和过期时间编码在查询参数中。上传时如果又携带 Authorization 或其他 Token,服务端可能判断请求同时使用了两种认证方式并拒绝它。

curl -X PUT \
  -H "Content-Type: image/jpeg" \
  --upload-file ./photo.jpg \
  "https://storage.example.com/bucket/photo.jpg?X-Amz-Algorithm=..."

需要注意两点:

  • 请求方法、Content-Type 和参与签名的请求头必须与生成 URL 时一致。
  • 不要让全局网络层自动追加 Authorization

如果 iOS 客户端使用 Alamofire 的 RequestInterceptor 注入登录 Token,应当为预签名上传建立单独的 Session,或根据目标 Host 和请求类型跳过认证适配。

[!TIP] 遇到 SignatureDoesNotMatch 时,优先比较请求方法、路径、Content-Type、系统时间和参与签名的请求头,不要只检查 Access Key。