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,验证会失败。
设置过期时间
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