Обновление JWT-токенов с помощью PyJWT
При использовании
системы авторизации, основанной на токенах аутентификации, хранящихся в cookies, я сталкиваюсь с проблемами при попытке обновить токен без повторного использования логина и пароля. Возможно ли обновить jwt-токены с помощью PyJWT ? def get(self, request):
token = request.COOKIES.get('userJwt')
if token is None:
raise AuthenticationFailed('Unauthenticated!')
response = Response(status=200)
try:
payload = jwt.decode(token, 'secret', algorithms=['HS256'])
except jwt.ExpiredSignatureError:
# payload['exp'] = datetime.utcnow() + timedelta(seconds=20)
# new_token = jwt.encode(payload, "secret", algorithm="HS256")
# response.set_cookie(key='userJwt', value=new_token, httponly=True)
return Response({"message": "Expired"}, status=200)
user = User.objects.filter(id=payload['id']).first()
serializer = UserSerializer(user)
response.data = serializer.data
return response
Когда срок действия токена истекает, вы можете создать новый токен с той же полезной нагрузкой и новым сроком действия.
def get(self, request):
token = request.COOKIES.get('userJwt')
if token is None:
raise AuthenticationFailed('Unauthenticated!')
response = Response(status=200)
try:
payload = jwt.decode(token, 'secret', algorithms=['HS256'], options={'verify_exp': False})
except jwt.ExpiredSignatureError:
return Response({"message": "Expired"}, status=200)
# Refresh the token
payload['exp'] = datetime.utcnow() + timedelta(seconds=20)
new_token = jwt.encode(payload, "secret", algorithm="HS256")
response.set_cookie(key='userJwt', value=new_token, httponly=True)
user = User.objects.filter(id=payload['id']).first()
serializer = UserSerializer(user)
response.data = serializer.data
return response
В функции jwt.decode я добавил options={'verify_exp': False} в функцию jwt.decode. Это позволяет декодировать полезную нагрузку, даже если срок действия токена истек. Затем я удалил строки, обновляющие токен. Это создает новый токен с той же полезной нагрузкой, но с новым сроком действия, и устанавливает этот новый токен в cookie.
При таком подходе токен будет обновляться при каждом запросе, а не только когда срок действия токена истекает. Если вы хотите обновлять токен только по истечении срока его действия, вам нужно будет обработать эту логику отдельно. Также не забудьте заменить 'secret' и timedelta(seconds=20) на ваш реальный секретный ключ и желаемое время жизни токена.