Python 之 jwt 令牌生成和校验

JWT的生成与校验,核心是一个无状态的交互流程。服务器生成令牌后,客户端在后续请求中携带它,服务器只需验证令牌本身即可,无需保存会话状态。jwt 的交互流程如下。

Python 生成和校验 jwt 的常用方式有下面这几种。

itsdangerous

可以生成包含时间戳、对 URL 安全的签名令牌。一般用于生成轻量的非标准的 API 认证令牌。

python 复制代码
import uuid
import secrets
from itsdangerous.url_safe import URLSafeTimedSerializer as Serializer


def generate_secret_key():
    secret_key = secrets.token_hex(32)
    print(f"secret_key: {secret_key}")
    return secret_key


def generate_access_token():
    access_token = uuid.uuid1().hex
    print(f"access_token: {access_token}")
    return access_token


SECRET_KEY = generate_secret_key()
ACCESS_TOKEN = generate_access_token()


def encode_jwt(access_token):
    jwt = Serializer(secret_key=SECRET_KEY)
    return jwt.dumps(access_token)


def decode_jwt(jwt_token):
    jwt = Serializer(secret_key=SECRET_KEY)
    payload = jwt.loads(jwt_token)
    return payload


if __name__ == '__main__':
    payload = {"user_id": ACCESS_TOKEN, "username": "Looking"}
    auth_token = encode_jwt(payload)
    print(f"auth_token: {auth_token}")

    payload = decode_jwt(auth_token)
    print(f"payload: {payload}")
python 复制代码
secret_key: 2bcc46556f275ef90edf09104829aef4c2a8fd1c0f4d0c83d34e96b552518295
access_token: b6065d22a51711f1bbc2489ebd2d776f
auth_token: eyJ1c2VyX2lkIjoiYjYwNjVkMjJhNTE3MTFmMWJiYzI0ODllYmQyZDc3NmYiLCJ1c2VybmFtZSI6Ikxvb2tpbmcifQ.apU-JA.gjI87rWbCsIlQ2R-goAZOdDhJ5o
payload: {'user_id': 'b6065d22a51711f1bbc2489ebd2d776f', 'username': 'Looking'}

PYJWT

目前最核心、最流行的 JWT 库,它提供了最基础的生成与验证功能,是其他许多库的底层依赖。

python 复制代码
import jwt
import uuid
import secrets



def generate_secret_key():
    secret_key = secrets.token_hex(32)
    print(f"secret_key: {secret_key}")
    return secret_key


def generate_access_token():
    access_token = uuid.uuid1().hex
    print(f"access_token: {access_token}")
    return access_token


SECRET_KEY = generate_secret_key()
ACCESS_TOKEN = generate_access_token()


def encode_jwt(payload):
    token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
    return token


def decode_jwt(jwt_token):
    payload = jwt.decode(jwt_token, SECRET_KEY, algorithms=["HS256"])
    return payload


if __name__ == '__main__':
    payload = {"user_id": ACCESS_TOKEN, "username": "Looking"}
    auth_token = encode_jwt(payload)
    print(f"auth_token: {auth_token}")

    payload = decode_jwt(auth_token)
    print(f"payload: {payload}")
python 复制代码
secret_key: b56c0da985b4b5f0cecda3dce931ea1bec0340c6e0494cd280f20076acd91695
access_token: 52776fe6a51311f195a1489ebd2d776f
auth_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiNTI3NzZmZTZhNTEzMTFmMTk1YTE0ODllYmQyZDc3NmYiLCJ1c2VybmFtZSI6Ikxvb2tpbmcifQ.ycHmDEYoXbIIZIwFXasVMTDW2ELzcp118YMJvW6xKao
payload: {'user_id': '52776fe6a51311f195a1489ebd2d776f', 'username': 'Looking'}
相关推荐
破茧蝴蝶4 小时前
Python分布式爬虫完整教程
开发语言·python
benchmark_cc4 小时前
量化系统架构设计:为什么应该将数据获取与策略逻辑解耦?
python·数据分析·pandas·量化交易·股票数据·quantdash
凤山老林5 小时前
Spring Boot 启动冲刺:耗时剖析、懒加载策略与事件驱动初始化优化
spring boot·后端·python
小白快快跑哦5 小时前
python-字符串全解(六):正则表达式-逻辑运算或
python·正则表达式·字符串·逻辑运算
Thinker QAQ5 小时前
并发编程(九):BlockingQueue 与 Channel——语言层的原子性、可见性与有序性
java·python·go·并发编程·channel·blockingqueue·message passing
道满科技5 小时前
Function Calling 参数总出错?只修参数就行
linux·windows·python
霸道流氓气质6 小时前
RAG 可观测性与生产监控实战:四层遥测模型、五大仪表盘与 OpenTelemetry 全链路追踪的 Java 生产级实现
java·人工智能·python
ch6238 小时前
《AI 辅助编程实战:从零跑通一个 Excel 报表生成脚本的踩坑与复盘》
人工智能·python
import_random9 小时前
[python]conda和pip(区别和联系2)
python
Aurorar0rua9 小时前
CS50 x 2024 Notes Python - 01
开发语言·python·学习方法