SignatureExpired

Исключение SignatureExpired является подклассом BadSignature и возникает в Django при использовании функций подписи, когда срок действия подписи истек. Это исключение выбрасывается методами signer.unsign и TimestampSigner.unsign при проверке временных меток. Основная причина - попытка верификации подписи после истечения установленного максимального срока действия. Исключение содержит информацию о времени создания подписи и текущем времени.

Синтаксис

pythonfrom django.core.signing import TimestampSigner, SignatureExpired

signer = TimestampSigner()
try:
  value = signer.unsign(signed_value, max_age=60)
except SignatureExpired as e:
  # Обработка истекшей подписи
  pass

Пример

Рассмотрим базовый пример создания и проверки подписи с ограниченным сроком действия:

pythonfrom django.core.signing import TimestampSigner, SignatureExpired
from datetime import datetime, timedelta

signer = TimestampSigner()
data = "user_id:123"

# Создаем подпись
signed_data = signer.sign(data)
print(signed_data)

# Пытаемся верифицировать подпись (срок жизни 10 секунд)
try:
  value = signer.unsign(signed_data, max_age=10)
  print(f"Подпись действительна: {value}")
except SignatureExpired as e:
  print(f"Ошибка: {e}")

Результат выполнения кода:

python"user_id:123:1mnb2v3c4x5z6a7s8d9f"
"Подпись действительна: user_id:123"

Пример

Пример обработки истекшей подписи при верификации токена восстановления пароля:

pythonfrom django.core.signing import TimestampSigner, SignatureExpired
from django.http import JsonResponse

def verify_reset_token(request, token):
  signer = TimestampSigner()
  try:
    # Проверяем токен, срок жизни 1 час (3600 секунд)
    user_id = signer.unsign(token, max_age=3600)
    return JsonResponse({
      "status": "success",
      "user_id": user_id
    })
  except SignatureExpired:
    return JsonResponse({
      "status": "error",
      "message": "Срок действия токена истек"
    })
  except Exception as e:
    return JsonResponse({
      "status": "error",
      "message": "Недействительный токен"
    })

Результат выполнения кода при истекшем токене:

python{
  "status": "error",
  "message": "Срок действия токена истек"
}

Пример

Пример использования исключения SignatureExpired для получения детальной информации о времени создания подписи:

pythonfrom django.core.signing import TimestampSigner, SignatureExpired
from datetime import datetime

signer = TimestampSigner()
data = "session_data"
signed_data = signer.sign(data)

try:
  value = signer.unsign(signed_data, max_age=5)
except SignatureExpired as e:
  # Получаем информацию об истекшей подписи
  signature_obj = e.args[0] if e.args else None
  print(f"Ошибка истекшей подписи")

Результат выполнения кода:

python"Ошибка истекшей подписи"

Смотрите также

  • исключение BadSignature,
    родительское исключение для ошибок подписи
  • класс ImproperlyConfigured,
    возникает при некорректной конфигурации
  • исключение DisallowedHost,
    выбрасывается при неразрешенном хосте
  • исключение SuspiciousSession,
    возникает при подозрительной сессии