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
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']
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.