Удаление просроченных токенов из базы данных (Django + JWT)
В настоящее время я использую JWT (rest_framework_simplejwt) с Django Rest Framework. Таблица базы данных, содержащая токены, становится все больше и больше. Есть ли способ удалить все просроченные токены доступа из базы данных? Я имею в виду все просроченные Outstanding_Tokens и связанные с ними Blacklisted_Tokens.
Я попробовал выполнить следующую команду из оболочки django shell, но ничего не получилось:
from rest_framework_simplejwt.tokens import AccessToken
AccessToken.objects.filter(expires__lt=datetime.now()).delete()
==>
AttributeError: type object 'AccessToken' has no attribute 'objects'
Большое спасибо за помощь!
Короткий ответ:
Токены JWT не хранятся в базе данных. Таким образом, вам не нужно удалять токены. В simplejwt не объявлено ни одной модели django.
Длинный ответ:
AccessToken
- это только объект, а не модель django. Таким образом, он не поддерживает то, что вы пытаетесь сделать. JWT - это тип токена, в котором дата истечения срока действия и дополнительные данные зашифрованы парольной фразой, которая известна только серверной стороне. Фронтенд будет иметь эти зашифрованные данные с информацией о пользователе, но не сможет их прочитать. Всякий раз, когда запрос попадает в бэкенд, он расшифровывается, и с помощью этой информации вы можете авторизовать пользователя.
Токены JWT нигде не хранятся. Если срок действия не прошел, токен остается действительным. В некоторых случаях вы хотите, чтобы существующие токены были признаны недействительными. Тогда вам нужно хранить эти токены, если эти токены (черный список) используются, вам нужно отказаться от них. Приложение simplejwt
также предоставляет приложение blacklist app, которое обрабатывает операцию blacklist. Если вы имеете в виду их, то существует 2 модели. Тогда для их удаления вам может понадобиться следующий код:
from rest_framework_simplejwt.token_blacklist.models import \
OutstandingToken, BlacklistedToken
BlacklistedToken.objects.filter(token__expires_at__lt=datetime.now()).delete()
OutstandingToken.objects.filter(expires_at__lt=datetime.now()).delete()