【问题标题】:How to validate ES384 JWT signature with x and y coordinate in python如何在python中使用x和y坐标验证ES384 JWT签名
【发布时间】:2020-10-30 11:43:24
【问题描述】:

我有一个 JWT 如下:

Authorization: Bearer eyJhbGciOiJFUzM4NCIsInR5cCI6IkpXVCIsImtpZCI6IjQ0ODIzZjNkLTBiMDEtNGE2Yy1hODBlLWI5ZDNlOGE3MjI2ZiIsImprdSI6Imh0dHBzOi8vc2FuZGJveC5jZHMtaG9va3Mub3JnLy53ZWxsLWtub3duL2p3a3MuanNvbiJ9.eyJpc3MiOiJodHRwczovL3NhbmRib3guY2RzLWhvb2tzLm9yZyIsImF1ZCI6Imh0dHA6Ly8xMjcuMC4wLjE6ODAwMC9jZHMtc2VydmljZXMiLCJleHAiOjE1OTQyMzA5MDAsImlhdCI6MTU5NDIzMDYwMCwianRpIjoiZWZiMzc3M2QtM2EyOC00M2UyLTlmYmMtYjkzNmE5YWUzODhiIn0.Cbey3n5NkDRoCLHZ2WMFc1z_RY8Rlq5oGxdAYfbrBPMiJXLCwjbYoU0av2CQj-Olhbnpe7Vs8vzJ5oHP5gc2-0ooc5J49t4Uz9iYKpiM9KLUrqaJe0umc_klM2-ynHAI

我一直在苦苦挣扎,因为像 PyJWT 这样的 python 库需要一个 PEM 格式的公钥用于椭圆曲线算法,我不得不解码 base64 以获得具有“jku”(https://sandbox.cds-hooks.org/.well-known/jwks.json) 的标题,它只有有 x 和 y 坐标,而不是公钥。

我觉得我完全走错了方向,因为我认为应该是使用 ES384 算法验证 JWT 的简单且自动化的过程。

如果有人可以帮助解释如何使用库/python 代码验证这一点,那将是一个救命稻草!

【问题讨论】:

    标签: python cryptography jwt ecdsa jwk


    【解决方案1】:

    您可以为此使用 Jose-JWT 库:

    pip install python-jose
    

    使用 Jose-JWT,您可以在 decodecall 中直接使用 construct a key from the given JWK 或 JWK (JSON Web Key),如下面的简短示例所示:

    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'}
    

    【讨论】:

      猜你喜欢
      • 2021-03-25
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 1970-01-01
      • 2018-09-16
      • 2020-07-25
      相关资源
      最近更新 更多