Изменение срока действия токена доступа jwt в django с помощью модуля simplejwt - PullRequest
0 голосов
/ 19 декабря 2018
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 Ответ

0 голосов
/ 19 декабря 2018

Я только что быстро просмотрел страницу 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')
]
...