echo中401错误主因是authorization头被nginx/apache过滤导致token未送达,需配置proxy_set_header或wsgipassauthorization;签名失败常因密钥类型错、base64url编码不规范、exp时间单位错误或alg:none未拦截。

请求头根本没传到 Echo
最常见的“401”不是验签失败,而是中间件压根没拿到 token。Echo 默认只从 Authorization 请求头读取 Bearer token,但 Nginx/Apache 常会过滤掉这个头,导致 token.Raw 为空或 panic。
- 在 handler 里加
echo.Logger().Info(c.Request().Header),确认Authorization是否存在 - 若用 Nginx,必须加
proxy_set_header Authorization $http_authorization; - 若用 Apache,需开启
WSGIPassAuthorization On或改用HTTP_AUTHORIZATION环境变量(然后在 Echo 中手动提取) - 检查
TokenLookup配置是否匹配前端传法:默认是"header:Authorization",若前端走query:token却没改配置,中间件直接跳过校验
签名无效但错误信息被吞掉
echo-jwt/v4 在解析失败时默认返回 401 或 400,但底层 jwt.ParseWithClaims 的真实错误(比如 signature is invalid、keyfunc returned nil)常被忽略,导致你只能看到“token invalid”,却不知哪一步崩了。
- 务必在
Config.ErrorHandler里打印原始err.Error(),别只返回 JSON - 常见根源:密钥类型错(
[]bytevsstring)、密钥被环境变量截断(含空格或换行)、PHP/Node 签发端用了 base64 而非 base64url 编码 - 验证 base64url:把 token 第二段(payload)复制进在线 JWT debugger,看能否解出合法 JSON;若报 “illegal base64 data”,就得先做标准化替换:
strings.ReplaceAll(raw, "-", "+"); strings.ReplaceAll(raw, "_", "/")
时间字段校验失败但没提示
旧系统签发的 token 常缺 exp,或服务器时钟比签发端快几秒——echo-jwt/v4 默认不校验时间,除非你显式传 jwt.WithValidTimeFunc;而一旦启用,又会因零容差直接拒掉。
Echo框架 5.1.0 版本源码包下载,适合关注 RealIP 行为变化、StartConfig.Listener、NewDefaultFS 和观测性中间件入口的开发团队。
- 若 token 没
exp,在KeyFunc里手动补:claims["exp"] = time.Now().Add(24 * time.Hour).Unix() - 必须传
jwt.WithValidTimeFunc,否则exp字段完全被跳过,等于放弃时效控制 - 容忍时钟漂移:用
func(t time.Time) bool { return t.After(time.Now().Add(-5 * time.Second)) },别用time.Now().Before(t) - 注意单位:
exp必须是秒级int64,JS 端若用Date.now()(毫秒)直塞,token 一签发就过期
alg:none 被静默放行或 panic
某些旧 PHP 或 Python 库签发 token 时设 "alg": "none",echo-jwt/v4 默认会 panic 掉,但如果你在 KeyFunc 里没拦截,panic 可能被 recover 中间件吞掉,最终只返回空白响应或 500。
- 在
Config.KeyFunc开头加判断:if token.Header["alg"] == "none" { return nil, errors.New("alg none not allowed") } - 别依赖“不配 KeyFunc 就不会 panic”——
SigningKey非 nil 时,ParseWithClaims仍会尝试校验,alg:none 会触发底层 panic - 若业务允许临时兼容,也得显式返回错误,而不是让中间件崩溃
- 检查签发端是否真用了
none:用 jwt.io 解码 header,看alg字段值
真正卡住人的往往不是算法本身,而是 token 从签发到抵达 Echo 这条链路上某处悄悄变了形——头被过滤、base64 被重编码、时间戳单位错位、甚至密钥多了一个不可见的 BOM 字符。排查时别一上来就调算法参数,先确保原始 token 完整、未损、可解码。










