JWT 生成:自己签一个测试 Token
联调时经常需要一个「指定用户、指定过期时间」的 Token,但登录接口不一定给得出来。自己签一个是最快的办法:把 Header 与 Payload 写成 JSON,填入密钥,算出签名拼成三段。
签名的计算过程
signingInput = base64url(header) + "." + base64url(payload)
signature = base64url( SIGN(signingInput, key) )
token = signingInput + "." + signature
注意签名算的是编码后的字符串,不是原始 JSON。所以 JSON 里多一个空格、键的顺序不同,都会算出完全不同的签名——这是「同一个 Payload 两次签名结果不同」的正常原因。
签名算法由 Header 里的 alg 决定,必须与实际使用的密钥类型匹配。HS 用字符串密钥,RS/PS/ES 用私钥。
造一个测试 Token 该填什么
最小可用 Payload:
{
"sub": "10001",
"role": "admin",
"iat": 1762300000,
"exp": 1762303600
}
sub 填用户 ID、role 填要测的角色、iat 填当前时间、exp 填一小时后。需要测「过期」分支时把 exp 设成过去的时间即可。
时间用秒,别用毫秒。需要当前时间戳可以在同门的时间戳工具里取。
密钥从哪来
HS 系列:与你的服务端配置的 JWT_SECRET 完全一致。差一个字符就验不过,注意首尾空格与换行。
RS/PS/ES 系列:用服务端的私钥,或者自己生成一对密钥并让服务端临时信任(这需要改服务端配置,只适合本地环境)。
生成测试密钥对:
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out private.pem
openssl pkey -in private.pem -pubout -out public.pem
得到的 private.pem 是 PKCS#8,public.pem 是 SPKI,正好对应工具要求的两种格式。
安全边界
签名与校验全部调用浏览器内置的 Web Crypto,不引入第三方库、不依赖 CDN,页面没有任何接口。Token 与密钥不上传、不写 localStorage、不进 URL、不进日志,刷新即消失。
但仍然建议:生产密钥不要贴进任何网页工具,包括这个。测试 Token 用测试密钥,生产 Token 用登录流程拿。工具再安全,也挡不住浏览器插件、系统输入法、录屏这些外围。
上面这些都不用装软件,也不用注册:打开页面就能用。
打开 JWT 在线解析与签名验证生成 →常见问题
生成的 Token 为什么服务端验不过?
九成是密钥不一致(多空格、换行、复制时截断)或算法不匹配。其次检查 Payload 里的 exp 是否已过期、iss/aud 是否符合服务端期望。
能用它生成 JWE(加密 JWT)吗?
不能。这个工具只做 JWS(签名),不做 JWE(加密)。JWE 是五段结构,需要另一套实现。
签名能自定义吗?
不能。签名必须按规范计算,任何偏差都会导致验证失败。可自定义的只有 Header 与 Payload 的内容。