跳到正文
OpsKit

JWT 解码器

粘贴 JWT 即可查看它的头部和声明。过期与签发时间会被转成可读日期,标准声明也附有说明。令牌始终留在你的浏览器里。

全部在浏览器内完成. 这个页面是静态文件。你输入的内容只留在标签页里,不会发送到服务器,关闭即消失。所以粘贴真实的令牌或配置是安全的。

什么时候用得上

  • 请求返回 401,需要判断是令牌过期还是 audience 不对。
  • 在指责 API 之前,先确认访问令牌实际携带了哪些 scope 或角色。
  • 调试 OIDC 集成时确认签发方和密钥 ID。

实际示例

一个普通的访问令牌

输入
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NSIsIm5hbWUiOiJKYW5lIiwiaWF0IjoxNzAwMDAwMDAwLCJleHAiOjE3MDAwMDM2MDB9.signature
结果
sub: 12345 · exp: 2023-11-14 23:13 UTC

头部、载荷和签名,用点分隔。

读取过期时间

输入
"exp": 1700003600
结果
2023-11-14 23:13 UTC

exp 的单位是秒而不是毫秒。填成毫秒会落到公元 55000 年,这是个常见 bug。

危险的头部

输入
{"alg":"none"}
结果
未签名令牌

接受 alg: none 的库会放行伪造令牌。请在服务端固定期望的算法。

容易出错的地方

以为载荷是私密的

JWT 是被签名而不是被加密。任何拿到令牌的人都能像这个页面一样读出全部声明,所以不要往里面放机密信息。

相信解码器给出的有效标记

能解码并不能证明真实性。一个令牌可以完全可读同时完全伪造,只有服务端的签名验证才能下结论。

把过期问题误当成时钟偏差之外的原因

如果令牌一签发就过期,请比较 iat 声明和服务器时钟。机器之间几分钟的偏差就足以让正常令牌被拒。

常见问题

我的令牌会被发送到哪里吗?

不会。这个页面是静态文件,解码只用到浏览器里的 Base64 与 JSON 解析,不记录也不发送,你可以在网络面板中确认。

为什么这个工具不能告诉我签名是否有效?

验证需要签名密钥或签发方的公钥。把生产环境的签名密钥粘贴到网页里,其风险远大于它带来的便利。

exp 和 nbf 有什么区别?

exp 是令牌不再被接受的时刻,nbf 是开始被接受的时刻。提前签发的令牌 nbf 可能在未来,在那之前都会被拒绝。

相关工具