PyJWT возвращает неверные подписи токена

Я использую PyJWT==1.4.2 для генерации токенов, которые я намерен использовать для аутентификации Firebase.

К сожалению, я не могу использовать какие-либо сторонние библиотеки Python Firebase, и даже если бы я мог, у меня возникли те же трудности, когда я пытался с FirebaseTokenGenerator.

Внутри моего API у меня есть функция для генерации токена для имени пользователя.

118     def generate_token(self, username):
119         payload = {
120             'something': 'Here',
121         }   
122         secret = "TESTSECRET"
123         token = jwt.encode(
124             payload,
125             secret,
126             algorithm='HS256')
127         return token

Пример токена, который я получаю от этой функции:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzb21ldGhpbmciOiJIZXJlIn0.fpIMSRJ3AAL30LIDwHJM9ZOumdRzS7yooiiUgMPms2Y

К сожалению, это недействительный токен. Онлайн-ресурс, такой как https://jwt.io/, сообщает мне, что часть подписи недействительна.

Не уверен, что это дополнительная полезная информация, но когда я пытаюсь расшифровать токен, я получаю следующее:

b'{"alg":"HS256","typ":"JWT"}{"something"[83 chars]\x88'

Есть мысли о том, что я могу делать не так?

5 ответов

Решение

Это действительно допустимый токен, если вы зайдете в jwt.io и вставите этот токен, а затем обновите секрет, использованный для проверки того, что он использовался для генерации токена, тогда инструмент укажет, что подпись действительна.

По умолчанию jwt.io пытается проверить подпись, используя алгоритм HS256 и секрет по умолчанию secret, Вы действительно создаете JWT с использованием алгоритма HS256, поэтому единственное, что вам нужно сделать, чтобы проверить, является ли он действительным, это обновить поле секретного ввода для использования TESTSECRET,

Кроме того, компонент подписи JWT представляет собой необработанные двоичные данные, которые могут отображаться некорректно, если вы попытаетесь декодировать их в текст. Чтобы узнать больше о том, как работает JWT, вы можете посмотреть Начало работы с JSON Web Tokens.

      example_payload = {
    'public_id': user.public_id,
    'exp': datetime.datetime.utcnow()+datetime.timedelta(minutes=30)
}

Для КОДИРОВАНИЯ используйте

      token = jwt.encode(example_payload,app.config['SECRET_KEY'],algorithm="HS256")

Для ДЕКОДИРОВАНИЯ используйте

      data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=["HS256"])

в основном просто добавление частей ALGORITHM и ALGORITHMS = [] ... в противном случае это дало мне ошибку (токен недействителен для операций после входа в систему), но это исправило.

В Python3 вам не нужен «.decode('UTF-8')» после «jwt.encode ()»: он сделает это за вас.

Также проверьте, что у вас нет пакетов jwt и PyJWT:

      pip3 list

если у вас установлены jwt и PyJWT, выполните:

      pip3 uninstall jwt
pip3 uninstall PyJWT
pip3 install PyJWT

перезапустите ваше приложение

Думаю, с последней версией PyJWT при декодировании нужно использовать алгоритм.

Я столкнулся с той же проблемой. Решил это с помощью параметра алгоритма. Я использую версию PyJwt 2.0.1. Ниже приведен пример кода. Пожалуйста, дайте мне знать, работает ли это.

      payload = jwt.decode("YOUR_JWT_TOKEN","YOUR_SECRET_KEY", algorithms=["HS256"])

Попробуйте добавить .decode("utf-8") к функции декодирования.

в любом случае кто-то использует его, как я, и создает токен с помощью этого метода

          from flask_jwt_extended import create_access_token

    access_token = create_access_token(identity=access_token)

вы должны добавить в свой app.py

      app.config['algorithms'] = ["HS256"]

Я использую PyJWT 2.1.0

Другие вопросы по тегам