JWT 生成
自定义 payload 在线生成 JWT:自研 base64url 编解码与 iat / exp / nbf 快捷项,用浏览器 WebCrypto 计算 HS256 / HS384 / HS512 签名,输出完整 token、解码后的头部与载荷、签名段以及过期时间预览(RS256 / ES256 / none 明确标注不支持)。
浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。
载荷与密钥
base64url 编解码、声明组装与签名段拼接都是自研实现;HMAC 签名由浏览器 WebCrypto 的 crypto.subtle 在点击后完成,全程离线,token 不会上传。
结果
填写 payload 与密钥后点击「生成 Token」。
这个工具能做什么
- 联调时手边没有签发服务,先在这里按同样的 payload 和密钥生成一个 token,粘到接口调试工具里验证鉴权逻辑。
- 复现线上问题:把出问题的 token 的 payload 抄进来(去掉 iat / exp 快捷项),确认签名段与线上是否一致,从而判断是签名密钥变了还是载荷被改了。
- 给前端或文档写示例:生成一个带 `exp` 的短期 token,顺便看一眼剩余时长,避免示例 token 过期后没法用。
- 学习 JWT 结构:勾选 / 取消 iat、修改 `kid`,观察三段内容怎么变,比只看文档更直观。
示例
输入
Payload {"sub":"1234567890","name":"John Doe"},密钥 your-256-bit-secret,算法 HS256,不勾选 iat、有效期留空输出
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.Gfx6VO9tcxwk6xqx9yYzSfebfeakZp5JYIgP_edcw_A
这就是 jwt.io 首页那个经典示例(只少了 iat 声明),签名段与 `node -e` 里的 createHmac("sha256", …) 结果逐字节一致。
常见问题
为什么不支持 RS256 / ES256?
非对称签名需要一份私钥(PEM/JWK),用它签名等于把私钥交给网页,风险远大于收益,而且真正需要的场景几乎都是服务端签发。所以这里只做 HMAC 系列:密钥就是共享的 secret,谁都能签发,也谁都能伪造——它本来就只适合内部服务之间使用。
签名是怎么算的,安全吗?
签名输入是 `base64url(header) + "." + base64url(payload)`,算法为 HMAC-SHA256 / 384 / 512,由浏览器 WebCrypto 的 crypto.subtle 在点击按钮后计算(RFC 7515 §5.1 的定义)。整个过程离线完成,密钥不出页面,但请记住:本页是在线工具,不要在不可信的设备上粘贴生产密钥。
iat、exp、nbf 分别是什么?
iat 是签发时间,exp 是过期时间,nbf 是「在此时间之前无效」,三者都是秒级 Unix 时间戳(RFC 7519 §4.1)。勾选或填写快捷项后,工具会用当前时间加上你给的时长写入声明,并在结果区显示过期时刻与剩余时长,省得自己换算。
为什么生成的 token 每次都不一样?
因为勾选了 iat 或填写了有效期时,声明的值取决于当前时间,时间变了 token 自然不同(签名也跟着变)。需要可复现的 token(例如写进测试夹具)时,取消勾选 iat、把有效期留空,只保留固定 payload,结果就完全确定了。
有效期写法有哪些?
支持 `30m`、`1h`、`7d`、`2w`、`45s`,也可以组合成 `1h30m`,或者直接写秒数(例如 `900`)。`nbf` 用的是同一种写法,表示「从现在起多久之后才生效」。
关键词:jwtjson web tokenhs256hmactoken generatorjwt.ioJWT 生成令牌生成载荷签名base64url过期时间