Не удалось десериализовать ключевые данные при декодировании Python JWT - PullRequest
0 голосов
/ 16 ноября 2018

Я использую библиотеку pyjwt для декодирования токена JWT. Я получил эту ошибку, когда я декодирую. Код был указан в документации.

import jwt

encoded_jwt='''eyJ0eXAiOiJKV1QiLCJhbG......'''
secret=b''''-----BEGIN PUBLIC KEY-----
MIIFRjCCBC6gAwIBAgIQCIdSGhpikQCjOIY154XoqzANBgkqhkiG9w0BAQsFADBN
......
-----END PUBLIC KEY-----'''

print(jwt.decode(encoded_jwt, secret , algorithms=['RS256']))

повышение значения ValueError («Не удалось десериализовать ключевые данные».) ValueError: Возможно не десериализовать ключевые данные.

Не могли бы вы помочь мне решить эту проблему, потому что, когда я использую это на веб-сайте JWT , он работает.

Это полный журнал ошибок ..

Traceback (последний вызов был последним): File "/Home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/jwt/algorithms.py", строка 205, в prepare_key ключ = load_pem_private_key (ключ, пароль = нет, backend = default_backend ()) файл "/Home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/primitives/serialization.py", строка 20, в load_pem_private_key return backend.load_pem_private_key (data, password) Файл "/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py", строка 1014, в load_pem_private_key пароль, файл "/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py", строка 1233, в _load_key Файл self._handle_key_loading_error () "/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py", строка 1291, в _handle_key_loading_error повысить ValueError («Не удалось десериализовать данные ключа.») ValueError: Не удалось десериализовать данные ключа.

Во время обработки вышеуказанного исключения произошло другое исключение:

Traceback (последний вызов был последним): File "/home/sathiyakugan/PycharmProjects/JWTsample/sample.py", строка 45, в файл печати (jwt.decode (encoded_jwt, секретный, алгоритмы = ['RS256'])) "/Home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/jwt/api_jwt.py", линия 93, в декодировании jwt, ключ = ключ, алгоритмы = алгоритмы, опции = опции, ** файл kwargs "/Home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/jwt/api_jws.py", строка 157, в декодировании ключ, алгоритмы) Файл "/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/jwt/api_jws.py", строка 221, в _verify_signature key = alg_obj.prepare_key (key) Файл "/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/jwt/algorithms.py", строка 207, в prepare_key key = load_pem_public_key (key, backend = default_backend ()) Файл "/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/primitives/serialization.py", строка 24, в load_pem_public_key вернуть файл backend.load_pem_public_key (data) "/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py", строка 1040, в load_pem_public_key Файл self._handle_key_loading_error () "/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py", строка 1291, в _handle_key_loading_error поднять ValueError («Не удалось десериализовать данные ключа.») ValueError: Не удалось десериализовать данные ключа.

Процесс завершен с кодом выхода 1

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

В библиотеке pyjwt есть некоторые проблемы. и вы должны получить открытый ключ из сертификата.

Я использовал openssl x509 -pubkey -noout -in cert.pem > pubkey.pem

тогда из открытого ключа я мог бы легко расшифровать его, используя библиотеку authlib.

from authlib.specs.rfc7519 import jwt

encoded_jwt='''eyJ0eXAiOiJ....'''
secret=b'''-----BEGIN PUBLIC KEY-----
......
-----END PUBLIC KEY-----'''
claims = jwt.decode(encoded_jwt, secret)
print(claims)
0 голосов
/ 16 ноября 2018

Как вы кодировали свой JWT?Используйте один из следующих подходов:

Токены кодирования и декодирования с RS256 (RSA)

encoded = jwt.encode({'some': 'payload'}, private_key, algorithm='RS256')
decoded = jwt.decode(encoded, public_key, algorithms='RS256')

Чтение Claimset без проверки

jwt.decode(encoded, verify=False)
{u'some': u'payload'}

Или используйте тот же секрет для кодирования и декодирования jwt, один из подходов должен работать.В моем случае я использовал jwt.decode(token, verify=False), потому что мой сервер уже выполнил проверку подписи для меня, мне нужно только получить набор требований.

...