开发认证流程需要测试 token?写 API 文档需要示例 JWT?对接第三方系统想验证 claims 格式是否正确?在线 JWT 生成器不需要启动后端服务,直接在浏览器里签名。
JWT 结构解析
JWT(JSON Web Token)是 RFC 7519 定义的紧凑型令牌格式,三段内容用点号分隔:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyXzEyMyIsInJvbGUiOiJhZG1pbiIsImlhdCI6MTcxMzQ1Njc4OX0.xK8vP2mQ4nR7sT1uVwXyZa3bCdEfGhIjKlMnOpQrStU
- Header(第一段):算法和 token 类型,Base64URL 编码
- Payload(第二段):携带的声明(claims),Base64URL 编码
- Signature(第三段):对 header + payload 用 secret 做 HMAC,确保不被篡改
Signature 是 JWT 可信任的核心——持有相同 secret 的任何一方都能验证 token 是否被篡改。
使用方法
- 打开 JWT 生成器
- 选择签名算法(HS256 / HS384 / HS512)
- 编辑 Payload JSON,填入你需要的 claims
- 输入 secret 密钥
- 复制生成的 token
切换算法时 header 自动更新,编辑内容时 token 实时刷新。
三种 HMAC 算法对比
三种算法都是对称算法——同一个 secret 用于签名和验证。
| 算法 | Hash | 签名长度 | 适用场景 |
|---|---|---|---|
| HS256 | SHA-256 | 256 位 | 默认选择,适合绝大多数场景 |
| HS384 | SHA-384 | 384 位 | 需要更大安全裕量时 |
| HS512 | SHA-512 | 512 位 | 合规要求强制使用时 |
大多数情况选 HS256 即可。 HS256 已经是密码学意义上的强算法,与 HS512 的实际安全差异可以忽略不计。
标准 Claim 字段
Payload 是普通 JSON 对象,可以放任何字段。RFC 定义的标准字段(均可选):
| 字段 | 全名 | 含义 |
|---|---|---|
iss | Issuer | token 签发方 |
sub | Subject | token 所代表的实体(通常是用户 ID) |
aud | Audience | token 的接收方 |
exp | Expiration | 过期时间(Unix 时间戳) |
nbf | Not Before | 生效时间(Unix 时间戳) |
iat | Issued At | 签发时间(Unix 时间戳) |
jti | JWT ID | 唯一标识(用于防止重放攻击) |
典型的认证 payload:
{
"sub": "user_123",
"iss": "https://api.example.com",
"aud": "https://app.example.com",
"role": "admin",
"permissions": ["read", "write"],
"iat": 1713456789,
"exp": 1713460389
}
role、email、permissions 等自定义字段可以自由添加。
主要使用场景
本地开发调试
最常见的用途。后端验证 JWT,但每次测试 API 都要走完整登录流程太低效——直接生成带有指定 claims 的 token 更快:
# 用生成的 token 测试 API
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...." \
http://localhost:8000/api/admin/users
API 文档示例
文档里放真实格式的 token,读者一眼就能看出 claims 结构,比描述更直观:
# OpenAPI 文档
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
# 示例 token
# eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
集成测试
为自动化测试准备带有特定 claims 的 token:
def test_admin_endpoint_rejects_user_role():
# 普通用户 token,应被拒绝
user_token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
resp = client.get('/admin/config', headers={
'Authorization': f'Bearer {user_token}'
})
assert resp.status_code == 403
def test_admin_endpoint_accepts_admin_role():
# 管理员 token,应被接受
admin_token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
resp = client.get('/admin/config', headers={
'Authorization': f'Bearer {admin_token}'
})
assert resp.status_code == 200
学习 JWT 原理
直接操作 header、payload、secret,观察 token 如何变化,是理解 JWT 结构最直观的方式。改一个 claims 字段,整个 signature 段就不同了——这体现了 HMAC 的雪崩效应。
Base64 密钥选项
部分 IdP(身份提供商)给出的 secret 已经是 Base64 或 Base64URL 编码格式(看起来像 c2VjcmV0a2V5,而不是 secretkey)。这时需要勾选 Base64 选项——工具会先解码再用于签名,确保与服务端使用相同的密钥字节签名。
不勾选时,工具把 secret 当作 UTF-8 字符串直接使用:
secretkey(不勾选)→ 用secretkey的 UTF-8 字节签名c2VjcmV0a2V5(勾选 Base64)→ 解码为secretkey后签名 → 结果相同
验证生成的 Token
把生成的 token 粘贴到 JWT Decoder,输入相同的 secret 和算法,即可确认签名是否有效、查看解码后的 claims。
安全性:为什么客户端签名更安全
zerotool.dev 的 JWT 生成器使用浏览器内置的 Web Crypto API(SubtleCrypto)做所有签名运算。你的 header、payload 和 secret 全程不离开浏览器。
可以自行验证:打开 DevTools → Network 标签 → 生成 token,观察是否有出站请求。没有。相比之下,服务端 JWT 生成器每次请求都会把你的 secret 发送到外部服务器。
对于生产环境的 secret,客户端签名是在线工具中唯一安全的方案。
不适合的场景
不要在应用程序里用在线工具生成生产 token。 应用的 token 签发应该在后端代码中完成:
// Node.js
import jwt from 'jsonwebtoken'
const token = jwt.sign(
{ sub: userId, role: 'user' },
process.env.JWT_SECRET,
{ expiresIn: '1h', issuer: 'https://api.example.com' }
)
# Python
import jwt
token = jwt.encode(
{'sub': user_id, 'role': 'user', 'exp': datetime.utcnow() + timedelta(hours=1)},
settings.SECRET_KEY,
algorithm='HS256'
)
在线生成器适合开发调试、文档示例和学习——不适合生产 token 签发。
相关工具
- JWT Decoder → — 解码和验证现有 JWT token
- HMAC Generator → — 直接计算 HMAC 签名
- Hash Generator → — 生成 SHA-256 等哈希值
无需启动服务,秒级生成签名 token。打开 JWT 生成器 →