Обновление 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) на ваш реальный секретный ключ и желаемое время жизни токена.

Вернуться на верх