在 Flask 中,可以使用 itsdangerous
库或 pyjwt
(即 jwt
)库来生成和验证基于 Secret Key 的 Token。下面介绍几种方式来生成 Token:
方式 1:使用 itsdangerous
生成 Token
itsdangerous
是 Flask 内部使用的一个安全 Token 生成和验证工具。
安装
pip install itsdangerous
代码示例
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
SECRET_KEY = "your-secret-key"
def generate_token(data, expires_in=3600):
"""生成 Token,有效期默认 1 小时"""
s = Serializer(SECRET_KEY, expires_in)
return s.dumps(data).decode("utf-8")
def verify_token(token):
"""验证 Token"""
s = Serializer(SECRET_KEY)
try:
data = s.loads(token)
return data # 返回解码后的数据
except Exception as e:
return None # Token 无效
# 生成 Token
token = generate_token({"user_id": 123})
print("Token:", token)
# 验证 Token
data = verify_token(token)
print("解码数据:", data)
输出示例
Token: eyJhbGciOiJIUzI1NiIsImV4cCI6MTcwMDEwMTY1NiwiaWF0IjoxNzAwMTAxMDU2fQ.eyJ1c2VyX2lkIjoxMjN9.dCZ_bgr9U4V5_3cQhMvoFj5HzEqVbRuN8cC0L13l2M0
解码数据: {'user_id': 123}
特点
✅ 具有 有效期(默认为 1 小时)
✅ Token 可解码,适合存储用户 ID 等信息
✅ 轻量级,适用于 Flask 内部认证
方式 2:使用 PyJWT
生成 JWT(推荐)
JWT(JSON Web Token)是更标准化的 Token 方案,适用于 REST API。
安装
pip install pyjwt
代码示例
import jwt
import datetime
SECRET_KEY = "your-secret-key"
def generate_jwt(data, expires_in=3600):
"""生成 JWT Token"""
expire_time = datetime.datetime.utcnow() + datetime.timedelta(seconds=expires_in)
data["exp"] = expire_time # 过期时间
token = jwt.encode(data, SECRET_KEY, algorithm="HS256")
return token
def verify_jwt(token):
"""验证 JWT Token"""
try:
decoded_data = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
return decoded_data # 返回解码数据
except jwt.ExpiredSignatureError:
return None # Token 过期
except jwt.InvalidTokenError:
return None # Token 无效
# 生成 JWT Token
jwt_token = generate_jwt({"user_id": 456})
print("JWT Token:", jwt_token)
# 验证 JWT Token
data = verify_jwt(jwt_token)
print("解码数据:", data)
特点
✅ 适用于 RESTful API 认证
✅ 支持 Token 过期时间
✅ 不可解码(Base64 但不能篡改)
✅ 比 itsdangerous
更标准
方式 3:使用 secrets
生成简单 Token
如果只是生成一个唯一的 Token(比如 API Key),可以使用 secrets
生成随机 Token。
代码示例
import secrets
def generate_simple_token():
"""生成随机 Token"""
return secrets.token_hex(32) # 64 字符的十六进制字符串
# 生成 Token
simple_token = generate_simple_token()
print("Simple Token:", simple_token)
特点
✅ 适用于 API Key 或 Session Token
✅ Token 不能解码,不存储数据
✅ 更适合随机 Token 需求(如 CSRF 保护)
选择哪种方式?
方式 | 适用场景 | 是否可解码 | 是否支持过期 |
---|---|---|---|
itsdangerous | Flask 内部 Token | ✅ | ✅ |
pyjwt (JWT) | 标准化 API Token | ❌(Base64) | ✅ |
secrets | API Key / CSRF | ❌ | ❌ |
推荐:
- Web API 认证 →
pyjwt
- 内部 Token 认证 →
itsdangerous
- 随机 Token(如 API Key) →
secrets
你可以根据需求选择合适的方案。🚀