Я понял, как заставить это работать.
Что я сделал, это поставил сигнал, который отслеживает, изменился ли какой-либо обязательный параметр. Если это так, он помещает в черный список все токены обновления, связанные с этим пользователем.
Вот код:
Сначала добавьте 'rest_framework_simplejwt.token_blacklist'
в установленные приложения. Тогда:
@receiver(signals.pre_save, sender=User)
def revoke_tokens(sender, instance, update_fields, **kwargs):
if not instance._state.adding: #instance._state.adding gives true if object is being created for the first time
existing_user = User.objects.get(pk=instance.pk)
if instance.password != existing_user.password or instance.email != existing_user.email or instance.username != existing_user.username:
# If any of these params have changed, blacklist the tokens
outstanding_tokens = OutstandingToken.objects.filter(user__pk=instance.pk)
# Not checking for expiry date as cron is supposed to flush the expired tokens
# using manage.py flushexpiredtokens. But if You are not using cron,
# then you can add another filter that expiry_date__gt=datetime.datetime.now()
for out_token in outstanding_tokens:
if hasattr(out_token, 'blacklistedtoken'):
# Token already blacklisted. Skip
continue
BlacklistedToken.objects.create(token=out_token)
То, что в основном делает этот код, получает все выдающиеся токены для пользователя, а затем добавляет их в черный список. Вы можете получить больше информации о выдающихся / занесенных в черный список токенах здесь.
https://github.com/davesque/django-rest-framework-simplejwt#blacklist-app