Изменение срока действия токена доступа 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')
]