Estoy usando la implementación JWT de python-jose para generar tokens JWT con fines de autenticación.
Ejecutamos nuestro backend en un contenedor Docker en Kubernetes y , a veces, cuando tenemos varios pods, obtenemos diferentes tokens para los mismos reclamos, secreto y algoritmo . También me sucedió esto en un solo contenedor en mi entorno de desarrollo al touch mi script index.wsgi .
Vaina 1:
>>> jwt.encode({'key': 'value'}, 'secret', algorithm='HS256') 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ2YWx1ZSJ9.FG-8UppwHaFp1LgRYQQeS6EDQF7_6-bMFegNucHjmWg'Vaina 2:
>>> jwt.encode({'key': 'value'}, 'secret', algorithm='HS256') 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJrZXkiOiJ2YWx1ZSJ9.JPIDicqvQ6GAh14yE2yZ3wnZQ0LiLNTTRDtJgLZcn98'Me sumergí profundamente en el código para ver qué podría estar causando esto y no encontré nada incriminatorio. En pocas palabras, esto es lo que hace el código:
json.dumps del encabezado del algoritmo ( {'typ': 'JWT', 'alg': 'HS256'} ) y codifíquelo como Base64, eliminando cualquier = 'sjson.dumps de la carga útil ( {'key': 'value'} ) y codifíquelo como Base64, eliminando cualquier = 'sencoded_header.encoded_payload usando HMAC256 con la clave secret y codifíquelo como Base64, nuevamente eliminando cualquier = 'sencoded_header.encoded_payload.encoded_signatureEn este punto, no tengo idea de qué está causando esto. Sospecho que hay algún tipo de error en la implementación de Python en HMAC o SHA256, pero parece poco probable... ¿Alguna pista?
Nota: hemos reproducido con éxito el error con pyjwt , que fue la base para python-jose .
Esto ocurre porque los diccionarios de Python están desordenados. Si decodifica los dos JWT, verá que la parte del encabezado se ordena de manera diferente para cada token.
{ "typ": "JWT", "alg": "HS256" }y
{ "alg": "HS256", "typ": "JWT" }Esto hace que el encabezado codificado en base64 sea diferente, lo que a su vez hará que la firma sea diferente.
Dicho esto, ambos son tokens válidos para exactamente el mismo conjunto de reclamos, y ambos deberían verificarse correctamente. No hay nada en la especificación de JWT que dicte que un conjunto de notificaciones equivalente deba dar como resultado una salida de JWT equivalente.
Nota: soy el autor de la biblioteca python-jose .