开发认证流程需要测试 token?写 API 文档需要示例 JWT?对接第三方系统想验证 claims 格式是否正确?在线 JWT 生成器不需要启动后端服务,直接在浏览器里签名。

立即生成 JWT token →

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 是否被篡改。

使用方法

  1. 打开 JWT 生成器
  2. 选择签名算法(HS256 / HS384 / HS512)
  3. 编辑 Payload JSON,填入你需要的 claims
  4. 输入 secret 密钥
  5. 复制生成的 token

切换算法时 header 自动更新,编辑内容时 token 实时刷新。

三种 HMAC 算法对比

三种算法都是对称算法——同一个 secret 用于签名和验证。

算法Hash签名长度适用场景
HS256SHA-256256 位默认选择,适合绝大多数场景
HS384SHA-384384 位需要更大安全裕量时
HS512SHA-512512 位合规要求强制使用时

大多数情况选 HS256 即可。 HS256 已经是密码学意义上的强算法,与 HS512 的实际安全差异可以忽略不计。

标准 Claim 字段

Payload 是普通 JSON 对象,可以放任何字段。RFC 定义的标准字段(均可选):

字段全名含义
issIssuertoken 签发方
subSubjecttoken 所代表的实体(通常是用户 ID)
audAudiencetoken 的接收方
expExpiration过期时间(Unix 时间戳)
nbfNot Before生效时间(Unix 时间戳)
iatIssued At签发时间(Unix 时间戳)
jtiJWT ID唯一标识(用于防止重放攻击)

典型的认证 payload:

{
  "sub": "user_123",
  "iss": "https://api.example.com",
  "aud": "https://app.example.com",
  "role": "admin",
  "permissions": ["read", "write"],
  "iat": 1713456789,
  "exp": 1713460389
}

roleemailpermissions 等自定义字段可以自由添加。

主要使用场景

本地开发调试

最常见的用途。后端验证 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 签发。

相关工具


无需启动服务,秒级生成签名 token。打开 JWT 生成器 →