如何在Python中使用JWK解码JWT令牌

Nik*_*aya 8 python jwt jwk

我正在开发一个应用程序,其中所有 API 都受 OAuth 保护。我已从客户端收到访问令牌,但无法解码和验证令牌。

我有以下格式的 JWK

{
  "keys": [
    {
      "kty": "RSA",
      "x5t#S256": "Some value",
      "e": "Some Value",
      "x5t": "Some Value",
      "kid": "SIGNING_KEY",
      "x5c": [
        "Some Value"
      ],
      "key_ops": [
        "verify",
        "encrypt"
      ],
      "alg": "RS256",
      "n": "Some Value"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

如何在Python中使用上述JWK解码JWT令牌?

dej*_*dej 22

快速检查您的 jwt 令牌https://jwt.io/

否则你可以尝试这个,但你应该知道用于生成令牌的算法(例如:HS256)和用于签名令牌的密钥)(例如:super_secretkey)


import jwt # pip install pyjwt[crypto] to install the package
jwt.decode(token, key='super_secretkey', algorithms=['HS256', ])
Run Code Online (Sandbox Code Playgroud)

使用 JWK 更新解码 JWT

import json
import jwt

#for JWKS that contain multiple JWK
public_keys = {}
for jwk in jwks['keys']:
    kid = jwk['kid']
    public_keys[kid] = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(jwk))

kid = jwt.get_unverified_header(token)['kid']
key = public_keys[kid]

payload = jwt.decode(token, key=key, algorithms=['RS256'])
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 8

我知道这很久以前就得到了回答,但这可能对某人有用。

如果您正在使用支持 OpenID 的 OAuth 提供程序,您可以使用类似以下内容来执行以下操作:

  1. 无需验证即可解码令牌以获取颁发者
  2. 从 OpenID 配置中检索 JWK
  3. 从令牌标头中检索密钥 ID 和算法
  4. 解码并验证令牌
from os import environ
import json
import urllib.request
import jwt;

def get_jwks_url(issuer_url):
    well_known_url = issuer_url + "/.well-known/openid-configuration"
    with urllib.request.urlopen(well_known_url) as response:
        well_known = json.load(response)
    if not 'jwks_uri' in well_known:
        raise Exception('jwks_uri not found in OpenID configuration')
    return well_known['jwks_uri']

def decode_and_validate_token(token):
    unvalidated = jwt.decode(token, options={"verify_signature": False})
    jwks_url = get_jwks_url(unvalidated['iss'])
    jwks_client = jwt.PyJWKClient(jwks_url)
    header = jwt.get_unverified_header(token)
    key = jwks_client.get_signing_key(header["kid"]).key
    return jwt.decode(token, key, [header["alg"]])

token = "xxxyyyzzz"
decoded = decode_and_validate_token(token)
print(decoded)
Run Code Online (Sandbox Code Playgroud)