web-dev-qa-db-fra.com

Impossible de désérialiser les données clés lors du décodage JWT python

J'utilise la bibliothèque pyjwt pour décoder le jeton JWT. J'ai eu cette erreur lors du décodage. Le code a été donné dans la documentation.

import jwt

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

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

augmenter ValueError ("Impossible de désérialiser les données clés.") ValueError: Impossible de désérialiser les données clés.

Pourriez-vous s'il vous plaît m'aider à le résoudre parce que je l'utilise sur le site Web JWT cela fonctionne.

Ceci est le journal des erreurs complet ..

Traceback (dernier appel le plus récent): Fichier "/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/jwt/algorithms.py", ligne 205, dans prepare_key key = load_pem_private_key (key, password = None, backend = default_backend ()) File "/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/primitives/serialization.py", ligne 20, dans load_pem_private_key return backend .load_pem_private_key (data, password) File "/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py", ligne 1014, dans load_pem_private_key password, Fichier "/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py", ligne 1233, dans _load_key self._handle_key_loading_error () File "/ home /sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py ", ligne 1291, dans _handle_key_loading_error raise ValueErr ou ("Impossible de désérialiser les données clés.") ValueError: Impossible de désérialiser les données clés.

Lors du traitement de l'exception ci-dessus, une autre exception s'est produite:

Traceback (dernier appel le plus récent): Fichier "/home/sathiyakugan/PycharmProjects/JWTsample/sample.py", ligne 45, imprimé (jwt.decode (encoded_jwt, secret, algorithms = ['RS256'])) Fichier "/ home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/jwt/api_jwt.py ", ligne 93, dans decode jwt, key = key, algorithms = algorithms, options = options, ** kwargs File "/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/jwt/api_jws.py", ligne 157, en clé de décodage, algorithmes) Fichier "/ home/sathiyakugan/PycharmProjects/Python/venv /lib/python3.5/site-packages/jwt/api_jws.py ", ligne 221, dans le fichier _verify_signature key = alg_obj.prepare_key (key)" /home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/ site-packages/jwt/algorithms.py ", ligne 207, dans prepare_key key = load_pem_public_key (key, backend = default_backend ()) File" /home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages /cryptography/hazmat/primitives/serialization.py ", ligne 24, dans le retour de load_pem_public_key backend.load_pem_public_key (data) File "/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py", ligne 1040, dans load_pem_public_key self.load () Fichier "/home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py", ligne 1291, dans _handle_key_loading_error raise ValueError ("Impossible de désérialiser) données de clé. ") ValueError: impossible de désérialiser les données de clé.

Processus terminé avec le code de sortie 1

Il y a quelques problèmes dans la bibliothèque pyjwt. et vous devez obtenir la clé publique du certificat.

J'ai utilisé openssl x509 -pubkey -noout -in cert.pem > pubkey.pem

puis à partir de la clé publique, je pouvais facilement le décoder en utilisant la bibliothèque 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)

Vous devez créer vos clés RSA avec OpenSSL:

openssl genrsa -out jwt-key 4096
openssl rsa -in jwt-key -pubout > jwt-key.pub

référence: entrez la description du lien ici

2
J4v4d

Utilisez la bibliothèque authlib , je n'ai jamais réussi à décoder les jetons keycloak avec pyjwt. Tu as besoin d'un public_key, Je suppose que vous l'avez.

from authlib.jose import jwt
key = '-----BEGIN PUBLIC KEY-----\n' + public_key + '\n-----END PUBLIC KEY-----'
key_binary = key.encode('ascii')

try:
    claims = jwt.decode(encoded,key_binary)
    claims.validate()
    #do some logic here
    #...

Astuce: vous pouvez facilement récupérer la clé publique de votre serveur d'authentification (dans mon cas, Keycloak) à un certain point final:

url = 'http://localhost:8080/auth/realms/your_realm'
with  urllib.request.urlopen(url) as r:
    response = r.read()
    public_key = json.loads(response)['public_key']
1
Tamás Panyi

Comment avez-vous codé votre jwt? Utilisez l'une des approches ci-dessous

Jetons d'encodage et de décodage avec RS256 (RSA)

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

Lecture du jeu de revendications sans validation

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

Ou utilisez le même secret pour coder et décoder le jwt, l'une des approches devrait fonctionner. Dans mon cas, j'ai utilisé jwt.decode(token, verify=False) parce que mon serveur a déjà fait la validation de signature pour moi, je n'ai besoin que de l'ensemble de revendications.

0