Как проверить подпись ES384 JWT с координатами x и y в python - PullRequest
1 голос
/ 09 июля 2020
• 1000 m необходимо декодировать base64, чтобы получить заголовок с "jku" (https://sandbox.cds-hooks.org/.well-known/jwks.json), который имеет только координаты x и y, а не ключ publi c.

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

Если кто-нибудь может помочь объяснить, как проверить это с помощью библиотека / python код, это спасет жизнь!

1 Ответ

1 голос
/ 09 июля 2020

Для этого вы можете использовать библиотеку Jose-JWT:

pip install python-jose

С Jose-JWT вы можете создать ключ из заданного JWK или использовать JWK (JSON Web Key ) непосредственно в вызове decode, как показано в следующем коротком примере:

from jose import jwk, jwt

es384_key = {
    "kty": "EC",
    "crv": "P-384",
    "kid": "44823f3d-0b01-4a6c-a80e-b9d3e8a7226f",
    "use": "sig",
    "alg": "ES384",
    "x": "dw_JGR8nB2I6XveNxUOl2qk699ZPLM2nYI5STSdiEl9avAkrm3CkfYMbrrjr8laB",
    "y": "Sm3mLE-n1zYNla_aiE3cb3nZsL51RbC7ysw3q8aJLxGm-hx79RPMYpITDjp7kgzy"
}

allowed_aud = "http://127.0.0.1:8000/cds-services"
token = "eyJhbGciOiJFUzM4NCIsInR5cCI6IkpXVCIsImtpZCI6IjQ0ODIzZjNkLTBiMDEtNGE2Yy1hODBlLWI5ZDNlOGE3MjI2ZiIsImprdSI6Imh0dHBzOi8vc2FuZGJveC5jZHMtaG9va3Mub3JnLy53ZWxsLWtub3duL2p3a3MuanNvbiJ9.eyJpc3MiOiJodHRwczovL3NhbmRib3guY2RzLWhvb2tzLm9yZyIsImF1ZCI6Imh0dHA6Ly8xMjcuMC4wLjE6ODAwMC9jZHMtc2VydmljZXMiLCJleHAiOjE1OTQyMzA5MDAsImlhdCI6MTU5NDIzMDYwMCwianRpIjoiZWZiMzc3M2QtM2EyOC00M2UyLTlmYmMtYjkzNmE5YWUzODhiIn0.Cbey3n5NkDRoCLHZ2WMFc1z_RY8Rlq5oGxdAYfbrBPMiJXLCwjbYoU0av2CQj-Olhbnpe7Vs8vzJ5oHP5gc2-0ooc5J49t4Uz9iYKpiM9KLUrqaJe0umc_klM2-ynHAI"

payload = jwt.decode(
                token,
                es384_key,
                audience = allowed_aud,
                options = {'verify_exp':False})

print (payload)

Несмотря на то, что он называется decode, функция фактически проверяет подпись .

Примечание: я добавил options = {'verify_exp':False}, чтобы избежать ошибки, потому что ваш токен уже истек вчера.

Вывод:

{'iss': 'https://sandbox.cds-hooks.org', 'aud': 'http://127.0.0.1:8000/cds-services', 'exp': 1594230900, 'iat': 1594230600, 'jti': 'efb3773d-3a28-43e2-9fbc-b936a9ae388b'}
...