2

Я собираюсь разрешить пользователю отменять ранее выпущенные токены (да, хотя срок их действия истекает через 15 минут), но не нашел способа сделать это, используя DRF-jwt.Отмена токенов с использованием Django rest-framework-jwt

Прямо сейчас, я рассматриваю несколько вариантов:

  • Надежда кто-то на SO будет показать мне, как это сделать вне коробки ;-)
  • Используйте поле JTI в виде счетчик, и, после аннулирования, требуется jti> last jti.
  • Посолить уровень пользователя к процедуре подписания, и изменить его при аннулировании
  • магазина живых лексемы в некотором Redis DB

ли какое-либо из выше пути идти?

ответ

2

Мы сделали это таким образом в нашем проекте:

Добавить jwt_issue_dt в модели пользователя.

Добавить original_iat в полезную нагрузку. Поэтому обновление токена не изменит это поле.

Сравнить original_iat от полезной нагрузки и user.jwt_issue_dt:

from calendar import timegm 
from rest_framework_jwt.authentication import JSONWebTokenAuthentication 

class CustomJSONWebTokenAuthentication(JSONWebTokenAuthentication): 

    def authenticate_credentials(self, payload): 
     user = super(CustomJSONWebTokenAuthentication, self).authenticate_credentials(payload) 
     iat_timestamp = timegm(user.jwt_issue_dt.utctimetuple()) 
     if iat_timestamp != payload['iat']: 
      raise exceptions.AuthenticationFailed('Invalid payload') 
     return user 

Чтобы отменить токен вам просто нужно обновить поле user.jwt_issue_dt.

+0

Thanks Raz. Правильно ли, что этот метод не поддерживает несколько токенов? Хотя, я думаю, вы можете сравнить метку времени с '><' вместо '! ='. – bavaza

+0

Да. Нам нужен только один действительный токен. Но 'if iat_timestamp> полезная нагрузка ['iat']: raise' должна работать. – Raz

Смежные вопросы