同一个密钥签出来的 token 交给服务端解析,直接抛 SignatureException 并提示 JWT signature does not match locally computed signature,换另一个库解析反而能过,只能怀疑密钥处理方式不一样。乍看像缓存或者权限的锅,追下去往往不是。
echo -n '$JWT_SECRET' | base64 -d | wc -c echo -n '$JWT_SECRET' | wc -c # 两个数不一样就说明多做了一次解码
追下去是这么回事:密钥在配置里存的是 base64 字符串,签发端按字符串直接取字节,校验端先解码再取,两边参与运算的长度和内容都不一样,签名当然对不上。
碰到「JWT 签名校验失败」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
具体做法是,确认签发和校验两端用的是同一种取字节方式;统一成 base64 解码之后的原始字节,两端都不要再传字符串;用同一个密钥跑一遍签发加解析的最小例子,先排除库的问题。
验收就看一点,两端解出来的密钥字节长度完全一致,同一个 token 解析不再抛签名异常。
