Flask中基于Secret Key生成Token的方式

在 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 保护)


选择哪种方式?

方式适用场景是否可解码是否支持过期
itsdangerousFlask 内部 Token
pyjwt(JWT)标准化 API Token❌(Base64)
secretsAPI Key / CSRF

推荐

  • Web API 认证pyjwt
  • 内部 Token 认证itsdangerous
  • 随机 Token(如 API Key)secrets

你可以根据需求选择合适的方案。🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BirdMan98

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值