Как мы можем назначить разное время истечения срока действия разным пользователям в токенах jwt в django

Я использую токены jwt в django. У меня время истечения 5 минут для всех пользователей. но я хочу изменить время истечения срока действия пользователя в зависимости от роли. Как я могу добиться этого в django с помощью модуля SIMPLE JWT.

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
    'ROTATE_REFRESH_TOKENS': False,
    'BLACKLIST_AFTER_ROTATION': True,
    }

отредактированный код:

  SUPERUSER_LIFETIME = datetime.timedelta(seconds=10)
  class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
            @classmethod
            def get_token(cls, user):
                            token = super(MyTokenObtainPairSerializer, cls).get_token(user)
                            starttime              = datetime.datetime.now()
                            timelimit              = datetime.timedelta(seconds=10)
                            endtime               = (timelimit + datetime.datetime.now())
                            expirytime = int(endtime.timestamp())
                            token['name']                   = user.username
                            token['user_id']                = user.id
                            if user.is_superuser:
                                            print("EXPIRY TIME ",expirytime)
                                            print("SUPERUSER LIFETIME ",SUPERUSER_LIFETIME)
                                            token.set_exp(lifetime=SUPERUSER_LIFETIME)
                            return token
  class MyTokenObtainPairView(TokenObtainPairView):
            serializer_class = MyTokenObtainPairSerializer

когда я печатаю SUPERUSER LIFETIME, он показывает разницу в 10 секунд. Но когда я пытаюсь декодировать токен доступа, он показывает время по умолчанию 300 секунд. в чем может быть проблема?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
693
1

Ответы 1

Вы можете попробовать написать свой собственный вид:

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
from rest_framework_simplejwt.utils import datetime_to_epoch

SUPERUSER_LIFETIME = timedelta(minutes=60)

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
        token = super(MyTokenObtainPairSerializer, cls).get_token(user)
        if user.is_superuser:
            token = token.access_token
            token.set_exp(lifetime=SUPERUSER_LIFETIME)
        return token

class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer

Также вам необходимо обновить ваш urls.py

url(r'^api/token/$', MyTokenObtainPairView.as_view(), name='token_obtain_pair'),

Я обновил код (отредактировал вопрос, проверьте один раз), как вы сказали. Но я не могу изменить время истечения по умолчанию.

padmaja cherukuri 18.12.2018 10:32

да, метод переопределяет время истечения срока действия токена обновления, а не токен доступа. Как я могу изменить время истечения срока действия токена доступа?

padmaja cherukuri 19.12.2018 09:48

Я добавил некоторые изменения, например token = token.access_token, попробуйте.

Sergey Pugach 19.12.2018 10:09

Файл "/home/cpm/cpm_env/lib/python3.6/site-packages/rest_framewor‌ k_simplejwt / serializ‌ ers.py", строка 68, в данных проверки ['access'] = text_type (refresh.access_token) AttributeError: У объекта AccessToken нет атрибута access_token. Я обновил код, но у меня появляется указанная выше ошибка. Не могли бы вы разобраться в этом один раз.

padmaja cherukuri 19.12.2018 14:09

Другие вопросы по теме