0%

SeaweedFS 3.96 S3 预签名 Post 上传 501 错误定位

问题描述

使用 SeaweedFS S3 接口进行预签名 Post 上传时,客户端收到 501 错误: “A header you provided implies functionality that is not implemented”。

测试发现,当请求头中携带 Bearer Token 时必定报错, 移除 Bearer Token 后上传成功

定位过程

查看 SeaweedFS 源码 的认证处理流程,发现问题在于两个关键函数的逻辑交互

  1. 认证类型判断函数(位于 weed/s3api/s3api_auth.go)
1
2
3
4
5
6
7
8
func getRequestAuthType(r *http.Request) authType {
// ...其他认证类型判断
else if isRequestJWT(r) { // JWT认证判断
return authTypeJWT
} else if isRequestPostPolicySignatureV4(r) { // PostPolicy认证判断
return authTypePostPolicy
// ...
}
  1. 认证请求处理函数(位于 weed/s3api/auth_credentials.go)
1
2
3
4
5
6
7
8
9
10
11
12
func (iam *IdentityAccessManagement) authRequest(r *http.Request, action Action) (*Identity, s3err.ErrorCode) {
// ...
switch getRequestAuthType(r) {
// ...
case authTypeJWT:
glog.V(3).Infof("jwt auth type")
r.Header.Set(s3_constants.AmzAuthType, "Jwt")
return identity, s3err.ErrNotImplemented // JWT认证返回未实现错误
// ...
}
// ...
}

原因分析:

  • getRequestAuthType 函数中,JWT 认证的判断逻辑位于 PostPolicy 之前
  • 当请求头存在 Bearer Token 时,系统优先将预签名 Post 上传识别为 JWT 认证(authTypeJWT)
  • JWT 认证分支直接返回 s3err.ErrNotImplemented,最终转换为 501 响应
  • 本应触发的 PostPolicy 认证(authTypePostPolicy)因优先级低而未被执行

解决方案

客户端移除请求头中的 Bearer Token即可

总结

该问题本质是多认证机制的优先级设计导致的冲突。SeaweedFS 3.96 中,JWT 认证的判断优先级高于 PostPolicy,使得携带 Bearer Token 的预签名上传请求被错误路由至未实现的 JWT 认证流程。

解决关键:预签名 URL 本身已包含完整的认证信息,无需额外携带 Bearer Token。移除该令牌后,请求会正确触发 PostPolicy 认证流程,从而避免 501 错误。