编程进阶网 编程进阶网
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • ScriptHub 脚本工具箱
  • Python

  • Shell-Bash

  • 工具脚本

    • 工具脚本速查
    • 哈希校验
    • Base64编码
    • AES加解密
    • RSA签名验签
    • JWT令牌
      • 一、JWT 结构解析
      • 二、Python — PyJWT
        • 2.1 生成 Token(签名)
        • 2.2 验证与解析 Token
        • 2.3 RS256 签名(非对称,推荐生产用)
        • 2.4 不验证签名的情况下解码(调试用)
      • 三、Shell 解码 JWT
      • 四、实战:JWT 认证中间件
    • JSON与YAML
    • XML与CSV
    • 编码转义
    • 图片转换
    • 文档转换
    • 批量重命名
    • 分割合并
    • 目录同步
    • 文件监控
    • 压缩归档
    • 文件去重
    • cURL速查
    • HTTP调试
    • 端口DNS
    • 抓包代理
  • ScriptHub
  • 工具脚本
杨充
2017-10-26
目录

JWT令牌

# JWT令牌

JSON Web Token——无状态认证标准。生成/验证/刷新 Token,API 认证、单点登录(SSO)、OAuth 2.0。

# 一、JWT 结构解析

JWT = Header.Payload.Signature
      Base64  Base64  HMAC/RSA 签名

示例 Token(三个点分隔):
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhbGljZSJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
|_______header______|_____payload_____|______________signature_______________|
1
2
3
4
5
6

# 二、Python — PyJWT

pip install pyjwt
# 如需 RS256:pip install pyjwt[crypto]
1
2

# 2.1 生成 Token(签名)

#!/usr/bin/env python3
"""JWT 生成——编码 + 签名"""
import jwt, time

SECRET = "my-secret-key-for-hs256"

# ---- 生成 Token ----
payload = {
    "sub": "user_12345",          # subject——用户标识
    "name": "Alice",
    "role": "admin",
    "iat": int(time.time()),      # issued at——签发时间
    "exp": int(time.time()) + 3600  # 过期时间(1 小时后)
}

token = jwt.encode(payload, SECRET, algorithm="HS256")
print(f"Token:\n{token}")

# 如果是字符串类型——直接用(PyJWT 2.x 返回字符串)
# 如果是 bytes——.decode()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 2.2 验证与解析 Token

#!/usr/bin/env python3
import jwt, time

SECRET = "my-secret-key-for-hs256"
token = "..."     # 上面生成的 token

try:
    # 验证 + 解码——一步完成
    decoded = jwt.decode(
        token,
        SECRET,
        algorithms=["HS256"],
        options={"require": ["exp", "sub"]}    # 要求必须有 exp 和 sub
    )
    print(f"✅ Token 有效")
    print(f"   用户: {decoded['sub']}")
    print(f"   角色: {decoded['role']}")
    print(f"   过期: {time.ctime(decoded['exp'])}")
except jwt.ExpiredSignatureError:
    print("❌ Token 已过期")
except jwt.InvalidTokenError as e:
    print(f"❌ Token 无效: {e}")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 2.3 RS256 签名(非对称,推荐生产用)

#!/usr/bin/env python3
"""JWT RS256——用 RSA 签名,服务只需公钥即可验证"""
import jwt, time
from cryptography.hazmat.primitives import serialization

# ---- 生成 Token(持有私钥的认证服务)----
with open('private.pem', 'rb') as f:
    private_key = f.read()

payload = {"sub": "user_12345", "role": "admin",
           "iat": int(time.time()), "exp": int(time.time()) + 3600}

token = jwt.encode(payload, private_key, algorithm="RS256")
print(f"RS256 Token: {token[:50]}...")

# ---- 验证 Token(任何服务只需公钥)----
with open('public.pem', 'rb') as f:
    public_key = f.read()

try:
    decoded = jwt.decode(token, public_key, algorithms=["RS256"])
    print(f"✅ 验证通过: {decoded['sub']}")
except jwt.InvalidTokenError:
    print("❌ 验证失败")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 2.4 不验证签名的情况下解码(调试用)

#!/usr/bin/env python3
"""仅解码 Header 和 Payload——不验证签名,只看内容"""
import jwt

token = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NSJ9.xxx"

# 不验证——直接解码(调试/检查过期时间用)
decoded = jwt.decode(token, options={"verify_signature": False})
print(decoded)  # {'sub': '12345'}

# 或者只读 Header
header = jwt.get_unverified_header(token)
print(header)   # {'alg': 'HS256', 'typ': 'JWT'}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 三、Shell 解码 JWT

#!/bin/bash

# ===== 一行解码 JWT Payload(不验证签名)=====
jwt_decode() {
    local token="$1"
    # 取 Payload 部分(第二个 . 段)
    local payload_b64=$(echo "$token" | cut -d. -f2)
    # Base64 解码(处理 URL 安全 Base64 和可能的填充缺失)
    echo "$payload_b64" \
        | tr '_-' '/+' \
        | awk '{print $0 "=="}' \
        | base64 -d 2>/dev/null \
        | python3 -m json.tool 2>/dev/null || echo "解码失败"
}

# 使用
jwt_decode "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NSJ9.xxx"

# ===== 检查 Token 过期时间 =====
check_jwt_expiry() {
    local token="$1"
    local exp=$(echo "$token" | cut -d. -f2 \
        | tr '_-' '/+' \
        | base64 -d 2>/dev/null \
        | python3 -c "import sys,json; print(json.load(sys.stdin).get('exp',0))")
    local now=$(date +%s)
    if [[ "$exp" -gt "$now" ]]; then
        echo "✅ Token 有效,剩余 $(( (exp - now) / 60 )) 分钟"
    else
        echo "❌ Token 已过期"
    fi
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# 四、实战:JWT 认证中间件

#!/usr/bin/env python3
"""
Flask / FastAPI 风格 JWT 认证装饰器——可直接集成到 Web 应用
"""
import jwt, time, functools
from flask import request, jsonify

SECRET = "your-secret-key"

def create_token(user_id: str, role: str = "user", expire_minutes: int = 60) -> str:
    """生成 JWT"""
    return jwt.encode({
        "sub": user_id,
        "role": role,
        "iat": int(time.time()),
        "exp": int(time.time()) + expire_minutes * 60
    }, SECRET, algorithm="HS256")

def refresh_token(token: str, extend_minutes: int = 60) -> str:
    """刷新 Token——重新生成但保留原用户信息"""
    try:
        old = jwt.decode(token, SECRET, algorithms=["HS256"],
                         options={"verify_exp": False})  # 允许过期 Token
        return create_token(old["sub"], old.get("role", "user"), extend_minutes)
    except jwt.InvalidTokenError:
        raise ValueError("无效的 Token,无法刷新")

def login_required(f):
    """装饰器——自动从 Authorization Header 提取并验证 JWT"""
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        auth = request.headers.get("Authorization", "")
        if not auth.startswith("Bearer "):
            return jsonify({"error": "Missing token"}), 401
        token = auth[7:]
        try:
            payload = jwt.decode(token, SECRET, algorithms=["HS256"])
            request.current_user = payload  # 注入用户信息
            return f(*args, **kwargs)
        except jwt.ExpiredSignatureError:
            return jsonify({"error": "Token expired"}), 401
        except jwt.InvalidTokenError:
            return jsonify({"error": "Invalid token"}), 401
    return wrapper

# ---- 使用示例 ----
# @app.route("/api/me")
# @login_required
# def me():
#     return jsonify({"user": request.current_user["sub"]})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

⚠️ 安全提醒:密钥绝不能硬编码!用环境变量 os.getenv("JWT_SECRET") 或 Vault。

#工具#加密
上次更新: 2026/06/17, 12:47:39
RSA签名验签
JSON与YAML

← RSA签名验签 JSON与YAML→

最近更新
01
信号崩溃快速排查
06-15
02
CoreDump破案
06-15
03
perf火焰图实战
06-15
更多文章>
Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式