📝 Python

JWT токены с python-jose

P
Автор
Pyland
📅
Опубликовано
30.06.2026
⏱️
Время чтения
1 мин
👁️
Просмотров
104
📊
Уровень
Статья
🐦 💼 ✈️

python-jose — библиотека для работы с JSON Web Tokens (JWT).

Установка

pip install python-jose[cryptography]

Создание токена

from jose import jwt
from datetime import datetime, timedelta

SECRET_KEY = "your-secret-key-min-32-chars"
ALGORITHM = "HS256"

def create_access_token(data: dict, expires_minutes: int = 30) -> str:
    payload = data.copy()
    expire = datetime.utcnow() + timedelta(minutes=expires_minutes)
    payload["exp"] = expire
    payload["iat"] = datetime.utcnow()  # время создания
    return jwt.encode(payload, SECRET_KEY, algorithm=ALGORITHM)

Декодирование токена

from jose import JWTError, jwt

def decode_token(token: str) -> dict:
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        return payload
    except JWTError:
        return None

# Использование
token = create_access_token({"sub": "user_id_42", "role": "admin"})
payload = decode_token(token)
# {'sub': 'user_id_42', 'role': 'admin', 'exp': 1234567890, 'iat': ...}

Access и Refresh токены

def create_tokens(user_id: int) -> dict:
    access_token = create_access_token(
        data={"sub": str(user_id), "type": "access"},
        expires_minutes=30,
    )
    refresh_token = create_access_token(
        data={"sub": str(user_id), "type": "refresh"},
        expires_minutes=60 * 24 * 7,  # 7 дней
    )
    return {
        "access_token": access_token,
        "refresh_token": refresh_token,
        "token_type": "bearer",
    }

def refresh_access_token(refresh_token: str) -> str | None:
    payload = decode_token(refresh_token)
    if not payload or payload.get("type") != "refresh":
        return None
    return create_access_token({"sub": payload["sub"], "type": "access"})

RS256 (асимметричная криптография)

from jose import jwt

# Генерация ключей:
# openssl genrsa -out private.pem 2048
# openssl rsa -in private.pem -pubout -out public.pem

with open("private.pem") as f:
    private_key = f.read()
with open("public.pem") as f:
    public_key = f.read()

# Подпись приватным ключом
token = jwt.encode({"sub": "1"}, private_key, algorithm="RS256")

# Верификация публичным ключом
payload = jwt.decode(token, public_key, algorithms=["RS256"])

Структура JWT

eyJhbGciOiJIUzI1NiJ9  ← Header (base64)
.eyJzdWIiOiIxIn0       ← Payload (base64)
.abc123signature        ← Signature (HMAC)

JWT не шифруется — только подписывается. Не храни секреты в payload!

Ваша реакция на статью

💬 Комментарии (0)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

Event loop в Python: как asyncio делает «параллел…

Event loop — сердце asyncio. Он не запускает код параллельно в нескольких потоках. Он переключается...

📅 30.06.2026 👁️ 120
📝

pytest-django: тестирование Django

Охватываемые темы: Установка, @pytest.mark.djangodb, Фикстуры, Тестирование views.

📅 30.06.2026 👁️ 130
📝

pip: менеджер пакетов Python

Охватываемые темы: Установка пакетов, Обновление и удаление, requirements.txt, Виртуальное окружение.

📅 30.06.2026 👁️ 117

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!