Изменение срока действия токена доступа jwt в django с помощью модуля simplejwt

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 = datetime.timedelta(minutes=1)

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):

@classmethod
def get_token(cls, user):        
    token = super(MyTokenObtainPairSerializer, cls).get_token(user)
    token['name']       = user.username
    token['user_id']    = user.id

    if user.is_superuser:
        #token.set_exp(from_time=starttime,lifetime=SUPERUSER_LIFETIME)
        token.payload['exp'] = datetime_to_epoch(token.current_time + SUPERUSER_LIFETIME)

    return token

class MyTokenObtainPairView(TokenObtainPairView):
     serializer_class = MyTokenObtainPairSerializer

я пробовал этот код (по этой ссылке: как мы можем назначить разное время истечения для разных пользователей в jwt токены в django). Этот код обновляет время истечения токена обновления, но я хочу обновить время истечения токена доступа в django с помощью модуля simplejwt. любые предложения, пожалуйста.

1 ответ

Решение

Я только что быстро заглянул на страницу simplejwt github, и вы можете настроить некоторые параметры в своем settings.py файл;

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
}

Обновленный ответ на основе комментария

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

Как вы говорите, вы должны переопределить метод генерации токенов по умолчанию. Но как?

Сначала создайте собственный вид получения токена, унаследованный от TokenObtainPairView и ваш собственный токен получить сериализатор, унаследованный от TokenObtainPairSerializer, После этого вы можете увидеть, что validate метод создания access а также refresh токены, поэтому вы также должны переопределить этот метод, если вы хотите создать токен на основе роли пользователя и т. д. После этих шагов вы также должны изменить свой urls.py,

Пример;

import datetime

from django.utils.six import text_type

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

SUPERUSER_LIFETIME = datetime.timedelta(minutes=1)


class MyTokenObtainSerializer(TokenObtainPairSerializer):
    def validate(self, attrs):
        data = super(TokenObtainPairSerializer, self).validate(attrs)
        refresh = self.get_token(self.user)
        data['refresh'] = text_type(refresh)
        if self.user.is_superuser:
            new_token = refresh.access_token
            new_token.set_exp(lifetime=SUPERUSER_LIFETIME)
            data['access'] = text_type(new_token)
        else:
            data['access'] = text_type(refresh.access_token)
        return data


class MyTokenObtainView(TokenObtainPairView):
    serializer_class = MyTokenObtainSerializer

urls.py

urlpatterns = [
    path('api/token/', MyTokenObtainView.as_view(), name='token_obtain_pair')
]
Другие вопросы по тегам