Ответ
Для генерации JWT (JSON Web Token) на сервере используются специализированные библиотеки. Токен состоит из трех частей: заголовка (Header), полезной нагрузки (Payload) и подписи (Signature).
Процесс генерации:
- Формирование Payload: Создается JSON-объект с данными пользователя (claims), такими как
sub(subject/ID пользователя) иexp(срок действия токена). - Подпись токена: Заголовок и полезная нагрузка подписываются с использованием секретного ключа (
SECRET_KEY) и выбранного алгоритма (например,HS256). Подпись гарантирует целостность и подлинность токена.
Пример на Python с использованием библиотеки PyJWT:
import jwt
import os
from datetime import datetime, timedelta, timezone
# Секретный ключ должен храниться безопасно, например, в переменных окружения
SECRET_KEY = os.environ.get("SECRET_KEY", "your-fallback-secret-key")
ALGORITHM = "HS256"
def create_access_token(user_id: str, expires_in_minutes: int = 30) -> str:
"""Генерирует JWT токен доступа для пользователя."""
# 1. Определяем срок действия токена
expire = datetime.now(timezone.utc) + timedelta(minutes=expires_in_minutes)
# 2. Формируем полезную нагрузку (payload)
to_encode = {
"sub": user_id, # Идентификатор пользователя (subject)
"exp": expire, # Время истечения срока действия (expiration time)
"iat": datetime.now(timezone.utc) # Время создания (issued at)
}
# 3. Кодируем и подписываем токен
encoded_jwt = jwt.encode(
to_encode,
SECRET_KEY,
algorithm=ALGORITHM
)
return encoded_jwt
# Пример использования
user_id = "user-123"
token = create_access_token(user_id=user_id)
print(f"Generated JWT for {user_id}: {token}")
Почему это важно?
- Stateless: Серверу не нужно хранить сессии. Вся необходимая информация содержится в самом токене.
- Безопасность: Подпись не позволяет злоумышленнику изменить данные в токене. Если payload будет изменен, подпись станет невалидной.