python jwt

作者admin

7月 2, 2025

jwt.encode() 生成 JWT Token

jwt.encode(payload, key, algorithm=”HS256″)

它的作用是把载荷(payload)和加密密钥结合,通过指定算法加密签名,最终生成一个安全的、不可篡改的 Token 字符串。

参数 类型 作用
payload dict Token 的载荷数据,包含用户信息、过期时间(exp)、签发时间等
key str 加密签名使用的密钥,必须保密(通常放在环境变量)
algorithm str 定义加密算法,如 HS256、RS256

函数处理明细

函数内部会进行 三步处理,最终生成一个三段式字符串:

header.payload.signature

1、生成 Header(头部)

头部是一个 JSON,声明使用的算法和类型:

{
“alg”: “HS256”,
“typ”: “JWT”
}

然后它会被 Base64URL 编码(注意不是普通 Base64),得到第一段:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

2、生成 Payload(载荷数据)

你传入的 payload 字典,比如:

{
“user_id”: “123”,
“exp”: 1707032270
}

这部分会存储信息,比如:

字段 含义
user_id 用户ID
exp Token 过期时间(Unix时间戳)
iat 签发时间
sub Token 主题
iss 签发者

它也会被 Base64URL 编码,得到第二段:

eyJ1c2VyX2lkIjoiMTIzIiwiZXhwIjoxNzA3MDMyMjcwfQ

3、生成 Signature(签名)

签名是防篡改的核心。

签名内容 =Base64(Header) + “.” + Base64(Payload)
然后使用 SECRET_KEY 和加密算法(如 HS256)进行 HMAC SHA256 签名。
最终再 Base64URL 编码得到第三段:
A6Wz2xkcZI9OdlvgrQ_7VNaWQIePNa95YzbgmH7bjmA
最终生成的 JWT Token,把三部分拼起来:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VyX2lkIjoiMTIzIiwiZXhwIjoxNzA3MDMyMjcwfQ.
A6Wz2xkcZI9OdlvgrQ_7VNaWQIePNa95YzbgmH7bjmA

这就是 jwt.encode() 的最终结果,一个字符串。

安全性说明

  • payload 虽然 Base64 编码,但 不是加密,数据能被解码看到。
  • signature 部分才是加密的,保证数据不被篡改。
  • 如果有人修改 payload,但没有正确的 secret_key,就无法生成匹配的 signature,验证会失败。

设置过期时间

def create_jwt_token(data: dict) -> str:
    to_encode = data.copy()
    # 分钟
    expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
    to_encode.update({“exp”: expire})
    return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)

jwt.decode() 默认会自动校验 exp(过期时间),如果 token 过期,会抛出 ExpiredSignatureError,而你用 except JWTError: 已经把它捕获并统一返回 “Invalid token”。

jwt.decode() 验证 Token

payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])

参数 类型 作用
token str 客户端携带的 JWT 字符串
SECRET_KEY str 与 encode 时使用的密钥必须一致
algorithms list 解码支持的算法,比如 ["HS256"]

核心验证内容

验证内容 是否自动验证
签名是否正确 ✔ 自动
Token 是否过期 (exp) ✔ 自动
解析 payload 内容 ✔ 自动
生效时间 (nbf) ✔ 自动
签发时间 (iat) ✔ 可选
签发者(iss ❌ 需手动指定
使用者(aud ❌ 需手动指定

常见错误类型

错误类型 情况
jwt.ExpiredSignatureError token 已过期
jwt.JWTError token 无效 或 被篡改
ValueError token 解码成功,但缺少关键字段(如 user_id)

https://www.49855.net/fastapi-oauth2passwordbearer

https://www.49855.net/app-request-python-with-token

作者 admin

百度广告效果展示