接口突然返回 401 Unauthorized,日志里只有一串 eyJhbGci... 的 Base64 字符。
这是新手最常卡住的地方:JWT 到底长什么样?里面藏了什么?为什么昨天还能登录,今天就失效了?
别慌。JWT 其实没有想象中神秘,拆开看只有 3 部分。3 分钟就能看懂,再也不会对着报错干瞪眼。
JWT 长什么样
JWT 是三段用 . 分隔的字符串:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 . eyJ1c2VyIjoiemhhbmcifQ . c9c0c0a...
└──────── Header ───────────────┘ └──── Payload ────┘ └ Signature ┘
三段分别是:
- Header:算法类型(HS256/RS256)和 Token 类型
- Payload:真正的业务数据,比如用户 ID、权限、过期时间
- Signature:用密钥对前两段做签名,防止篡改
重点说一个误区:Payload 只是 Base64 编码,不是加密。任何人拿到 Token 都能直接解码看内容。所以密码、身份证这类敏感信息,永远不要塞进 Payload。
3步解码:不用装任何东西
第 1 步:复制 Token
从请求头 Authorization: Bearer <token> 里复制,注意去掉 Bearer 前缀。
第 2 步:在线解码
把 Token 粘贴到 navbox JWT 解码器,Header 和 Payload 立刻变成可读的 JSON:
{
"sub": "10086",
"roles": ["editor"],
"exp": 1795555200,
"iat": 1795468800
}
第 3 步:把 exp 时间戳转成人话
Payload 里的 exp(过期时间)是 Unix 时间戳,直接看是个大数字没意义。用 时间戳转换工具 一查:
1795555200 → 2026-11-24 08:00:00 UTC
对比当前时间,是不是过期了,一目了然。
常见报错对照表
| 报错 | 大概率原因 | 排查动作 |
|---|---|---|
401 Token expired | exp 早于当前时间 | 转时间戳确认,检查签发逻辑 |
401 Invalid signature | 密钥不匹配 | 确认服务端和校验端用的 secret 一致 |
403 Forbidden | Token 有效但权限不够 | 看 Payload 里的 roles/permissions 字段 |
400 Malformed token | Token 被截断或多了空格 | 复制时小心,别带换行 |
注意一个细节:JWT 解码器只能解码,不能验签。Signature 对不对,要看服务端的密钥。所以"解出来内容正常"≠“这个 Token 一定合法”,两件事要分清。
排查登录失效的标准流程
- 拿最新请求的 Token,先解码看
exp exp没过期却 401 → 去查iat(签发时间),对比密钥是否最近改过- 403 而不是 401 → 权限问题,看 Payload 的角色字段
- 所有 Token 都失效 → 多半是服务端密钥轮转或时钟不同步
把 token 发我看看,基本 30 秒定位问题。你先试一次,把解码后的 Payload 截图存下来,下次报错直接对照,比翻代码快多了。