问题描述
使用 SeaweedFS S3 接口进行预签名 Post 上传时,客户端收到 501 错误: “A header you provided implies functionality that is not implemented”。
测试发现,当请求头中携带 Bearer Token 时必定报错, 移除 Bearer Token 后上传成功
定位过程
查看 SeaweedFS 源码 的认证处理流程,发现问题在于两个关键函数的逻辑交互
- 认证类型判断函数(位于 weed/s3api/s3api_auth.go)
1 | func getRequestAuthType(r *http.Request) authType { |
- 认证请求处理函数(位于 weed/s3api/auth_credentials.go)
1 | func (iam *IdentityAccessManagement) authRequest(r *http.Request, action Action) (*Identity, s3err.ErrorCode) { |
原因分析:
- 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 错误。