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