Что такое JWT и как его сгенерировать на Python

Ответ

JWT (JSON Web Token) — это открытый стандарт (RFC 7519) для создания компактных и самодостаточных токенов доступа. Они используются для безопасной передачи информации между сторонами в виде JSON-объекта.

Токен состоит из трех частей, разделенных точками: header.payload.signature.

  • Header (Заголовок): Содержит метаданные — тип токена (typ, обычно JWT) и используемый алгоритм подписи (alg, например, HS256 или RS256).
  • Payload (Полезная нагрузка): Содержит утверждения (claims) — информацию о пользователе (sub, user_id) и другие данные, например, время истечения срока действия токена (exp).
  • Signature (Подпись): Создается путем подписания закодированных header и payload с использованием секретного ключа. Подпись гарантирует, что данные токена не были изменены в пути.

Генерация JWT на Python с помощью PyJWT

Для создания токена необходимо установить библиотеку: pip install pyjwt.

import jwt
import datetime

# Секретный ключ. В реальном приложении должен храниться безопасно!
SECRET_KEY = "your-super-secret-key"

# Полезная нагрузка (payload)
payload = {
    'user_id': 123,
    'username': 'john.doe',
    # 'exp' (expiration time) - обязательное утверждение для безопасности
    'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1),
    # 'iat' (issued at) - время создания токена
    'iat': datetime.datetime.utcnow()
}

# Кодирование токена
token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")

print(f"Сгенерированный токен:n{token}")

# Декодирование (проверка) токена
try:
    decoded_payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
    print(f"nДекодированная нагрузка:n{decoded_payload}")
except jwt.ExpiredSignatureError:
    print("nСрок действия токена истек.")

Ключевые правила безопасности:

  • Используйте надежный алгоритм (HS256 для симметричного шифрования, RS256 для асимметричного).
  • Всегда устанавливайте срок действия токена (exp), чтобы минимизировать риски при его компрометации.
  • Не храните секретный ключ в коде. Используйте переменные окружения или системы управления секретами.
  • Не включайте в payload конфиденциальные данные (пароли, личные ключи), так как он легко декодируется (не шифруется, а кодируется в Base64).

Ответ 18+ 🔞

Так, слушай, про эти ваши JWT, ну, блядь, модная тема, все их в рот берут, а толком объяснить нихуя не могут. Ёпта, сейчас разжую.

JWT — это, типа, такая бумажка-пропуск, но в цифре. Компактная, самодост... самодостаточная, блядь, хуй выговоришь. Короче, в ней всё есть, что нужно. Три куска, разделённые точками: голова.тело.подпись.

  • Голова (Header): Там написано, что это за хуйня (typ: JWT) и каким секретным словом её подписывали (alg, типа HS256). Метаданные, короче.
  • Тело (Payload): А вот тут уже интереснее. Всё, что ты хочешь передать: кто пользователь (user_id), его имя, и, что самое главное, блядь — когда эта хуйня сдохнет (exp). Без этого — вообще ни в какие ворота, сразу на помойку.
  • Подпись (Signature): А это, сука, самый сок. Берёшь закодированные голову и тело, берёшь секретный ключ (который надо спрятать так, чтобы мама не нашла), и это всё подписываешь. Если в пути кто-то твой токен попытается подделать — подпись не сойдётся, и ему сразу пизда.

Как сварганить эту хуйню на Python с PyJWT

Ставишь библиотеку: pip install pyjwt. Делов-то.

import jwt
import datetime

# Секретный ключ. НАХУЙ НЕ КЛАДИ ЕГО ПРЯМО В КОД, ЁБАНАРОТ! В переменные окружения!
SECRET_KEY = "your-super-secret-key"

# Что внутрь пихаем (payload)
payload = {
    'user_id': 123,
    'username': 'john.doe',
    # 'exp' — СРОК ГОДНОСТИ, БЛЯДЬ! БЕЗ ЭТОГО ТОКЕН — ВЕЧНЫЙ, КАК ПИЗДА БАБУШКИ, И ЭТО ОПАСНО!
    'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1),
    # 'iat' — когда испекли
    'iat': datetime.datetime.utcnow()
}

# Запекаем токен
token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")

print(f"Вот твой токен, любуйся:n{token}")

# А теперь пробуем его прочитать и проверить
try:
    decoded_payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
    print(f"nЧто внутри оказалось:n{decoded_payload}")
except jwt.ExpiredSignatureError:
    print("nВсё, кепка, токен протух. Выкидывай.")

Главные правила, чтобы не обосраться:

  • Алгоритм подписи нормальный выбирай (HS256 или RS256). Не выёбывайся с none, а то будет тебе pwned.
  • СРОК ДЕЙСТВИЯ (exp) — ЭТО СВЯТОЕ! Представь, что это молоко. Без даты — страшно пить.
  • Секретный ключ — не твой член, чтобы всем показывать. Спрячь его в переменные окружения, в спец. хранилище, куда угодно, только не в код на GitHub, ебать твою совесть.
  • В payload не пихай пароли, номера карт и фото своей жопы. Он же не шифруется, а просто кодируется в Base64. Любой долбоёб может его раскодировать и посмотреть. Подпись только от подделки защищает, а не от чтения.