Я использую токены 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 секунд. в чем может быть проблема?
Вы можете попробовать написать свой собственный вид:
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'),
Я обновил код (отредактировал вопрос, проверьте один раз), как вы сказали. Но я не могу изменить время истечения по умолчанию.
да, метод переопределяет время истечения срока действия токена обновления, а не токен доступа. Как я могу изменить время истечения срока действия токена доступа?
Я добавил некоторые изменения, например token = token.access_token
, попробуйте.
Файл "/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. Я обновил код, но у меня появляется указанная выше ошибка. Не могли бы вы разобраться в этом один раз.
Я ответил на тот же вопрос Изменение времени истечения срока действия токена доступа jwt в django с помощью модуля simplejwt