
JWT 无处不在——登录认证、API 鉴权、SSO 单点登录。但你真的理解它是怎么工作的吗本文从原理出发用 Rust 实现一个 JWT 解析器并展示在 WATools 中的实际应用。JWT 是什么JWTJSON Web Token是一种开放标准RFC 7519用于在各方之间安全地传输声明信息。它本质上是一个经过签名的 JSON 对象的 Base64 编码字符串。一个典型的 JWT 长这样eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5cJWT 的三段式结构JWT 由三个部分组成用.分隔Header.Payload.Signature1. Header头部包含 Token 类型和签名算法{ alg: HS256, typ: JWT }2. Payload载荷包含声明Claims即实际传输的数据{ userId: 1234567890, name: John Doe, iat: 1516239022 }标准声明字段字段全称说明issIssuer签发者subSubject主题通常为用户 IDaudAudience接收方expExpiration过期时间Unix 时间戳iatIssued At签发时间nbfNot Before生效时间3. Signature签名用于验证消息完整性防止篡改HMACSHA256( base64UrlEncode(header) . base64UrlEncode(payload), secret )为什么需要本地解析 JWT这是最关键的问题——JWT 中可能包含敏感信息。Payload 只是 Base64 编码不是加密任何人都可以解码查看内容。但问题在于当你把 JWT 粘贴到在线工具时Token 本身包括签名信息被发送到了第三方。在生产环境中一个 JWT 可能包含用户身份信息权限角色role: admin内部系统标识这些信息不应该离开你的电脑。Rust 实现 JWT 解析在 WATools 中JWT 解析由 Rust 后端完成确保高性能和安全性。核心实现use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine}; use serde_json::Value; pub struct JwtParts { pub header: Value, pub payload: Value, pub signature: String, } pub fn parse_jwt(token: str) - ResultJwtParts, String { let parts: Vecstr token.split(.).collect(); if parts.len() ! 3 { return Err(无效的 JWT 格式应包含三段以 . 分隔的内容.into()); } // 解码 Header let header_bytes URL_SAFE_NO_PAD.decode(parts[0]) .map_err(|e| format!(Header 解码失败: {}, e))?; let header: Value serde_json::from_slice(header_bytes) .map_err(|e| format!(Header JSON 解析失败: {}, e))?; // 解码 Payload let payload_bytes URL_SAFE_NO_PAD.decode(parts[1]) .map_err(|e| format!(Payload 解码失败: {}, e))?; let payload: Value serde_json::from_slice(payload_bytes) .map_err(|e| format!(Payload JSON 解析失败: {}, e))?; // Signature 保留原始字符串 let signature parts[2].to_string(); Ok(JwtParts { header, payload, signature }) }注册为 Tauri 命令#[tauri::command] pub fn jwt_parse(token: String) - ResultJwtParts, String { parse_jwt(token) }前端调用import { invoke } from tauri-apps/api/core interface JwtParts { header: Recordstring, unknown payload: Recordstring, unknown signature: string } const result await invokeJwtParts(jwt_parse, { token })前端展示设计WATools 的 JWT 解析页面采用三段式卡片布局┌─────────────────────────────────────┐ │ 输入 Token │ │ ┌─────────────────────────────────┐│ │ │ 粘贴 JWT Token 到这里... ││ │ └─────────────────────────────────┘│ │ [解析] │ ├─────────────────────────────────────┤ │ ┌─────────┐ ┌─────────┐ ┌───────┐ │ │ │ Header │ │ Payload │ │ Sign │ │ │ │ │ │ │ │ │ │ │ │ alg: │ │ sub: │ │ xxxxx │ │ │ │ HS256 │ │ 12345 │ │ │ │ │ │ typ:JWT │ │ name: │ │ │ │ │ │ │ │ John │ │ │ │ │ └─────────┘ └─────────┘ └───────┘ │ └─────────────────────────────────────┘每个字段都会被智能识别和标注——标准字段如exp、iat自动翻译为可读名称时间戳字段自动转换为日期格式。JWT 常见算法算法全称类型HS256HMAC-SHA256对称加密RS256RSA-SHA256非对称加密ES256ECDSA-SHA256椭圆曲线PS256RSA-PSS-SHA256概率签名none无签名⚠️ 不应用于生产⚠️安全提醒alg: none的 JWT 不包含签名验证任何内容都可以被伪造。如果你的系统接受这种 Token那是一个严重的安全漏洞。总结JWT 解析看似简单Base64 解码 JSON 解析但在实际开发中非常重要理解结构知道 Header、Payload、Signature 各部分的含义安全意识敏感 Token 不要发送到在线工具本地优先用 WATools 这样的本地工具数据不出你的电脑想查看完整的 JWT 解析实现源码来 GitCode Star 一下项目获取全部源码