Skip to main content

JWT verifier with support for multiple JWKS endpoints and local fallback keys

Project description

JWKs Multi Verifier

Biblioteca Python para validacao de JWT com suporte a multiplas fontes JWKS, cache e chaves locais de fallback.

API publica principal:

  • from jwks_multi import get_public_keys, decode_token

Instalacao via URL (Git)

pip

pip install "git+ssh://git@<repo>/jwks-multi.git"
pip install "git+ssh://git@<repo>/jwks-multi.git@main"
pip install "git+ssh://git@<repo>/jwks-multi.git@v<tag>"
pip install "git+ssh://git@<repo>/jwks-multi.git@<commit_sha>"

Uso

Fluxo basico

import asyncio

from jwks_multi import get_public_keys, decode_token


async def main() -> None:
	key_set = await get_public_keys(
		jwks_urls=["https://idp.exemplo.com/.well-known/jwks.json"],
		pre_public_keys={},
	)

	claims = await decode_token(
		token="<jwt>",
		key=key_set,
		options={},
		issuers=["https://idp.exemplo.com/"],
		audiences=["minha-api"],
	)

	print(claims)


asyncio.run(main())

Parametros disponiveis

get_public_keys(...)

Retorna um KeySet com a uniao de chaves locais (pre_public_keys) e chaves remotas (jwks_urls).

Parametro Tipo Padrao Descricao
jwks_urls list[str] obrigatorio Lista de endpoints JWKS remotos.
pre_public_keys dict[str, Any] obrigatorio JWKS local no formato {"keys": [...]} para fallback.
cache_jwk_set bool True Habilita/desabilita cache em memoria por URI.
jwks_ttl int | float | None None Tempo de vida (segundos) do cache remoto. None significa sem expiracao.
jwks_timeout int | float 5.0 Timeout (segundos) das requisicoes HTTP para JWKS remoto.

decode_token(...)

Decodifica e valida o token com ExtendedJWTClaims.

Parametro Tipo Padrao Descricao
token str obrigatorio JWT serializado.
key KeySet obrigatorio Chaves retornadas por get_public_keys(...).
options dict[str, bool | float] | None None Controle fino das validacoes (verify_sub, verify_exp, verify_nbf, verify_iat, verify_jti). Inclui leeway (folga em segundos para validacao temporal).
issuers list[str] | None None Lista de emissores aceitos para claim iss.
audiences list[str] | None None Lista de audiencias aceitas para claim aud.

Exemplo avancado

import asyncio

from jwks_multi import get_public_keys, decode_token


async def validate(token: str) -> dict:
	key_set = await get_public_keys(
		jwks_urls=[
			"https://idp-a.exemplo.com/.well-known/jwks.json",
			"https://idp-b.exemplo.com/.well-known/jwks.json",
		],
		pre_public_keys={
			"keys": [
				{
					"kty": "RSA",
					"kid": "local-fallback-kid",
					"use": "sig",
					"alg": "RS256",
					"n": "<modulus>",
					"e": "AQAB",
				}
			]
		},
		cache_jwk_set=True,
		jwks_ttl=300,
		jwks_timeout=2.5,
	)

	claims = await decode_token(
		token=token,
		key=key_set,
		options={
			"verify_sub": True,
			"verify_exp": True,
			"verify_nbf": True,
			"verify_iat": True,
			"verify_jti": True,
			"leeway": 5,
		},
		issuers=["https://idp-a.exemplo.com/", "https://idp-b.exemplo.com/"],
		audiences=["api-interna"],
	)

	return dict(claims)


# asyncio.run(validate("<jwt>"))

Observacoes importantes

  • O cache e mantido em memoria no processo e separado por URI de JWKS.
  • Quando jwks_ttl=None, as chaves remotas nao expiram (ate reinicio do processo).
  • URLs com valor literal "localhost" sao tratadas como pseudo-origem local e nao geram chamada HTTP.

Desenvolvimento local

pip install -e .
python -c "from jwks_multi import get_public_keys, decode_token; print('API loaded successfully')"

Changelog

O Changelog é gerado pela ferramenta towncrier.

Para criar o changelog da sua alteração, é necessário criar um arquivo em changelog.d com o sufixo desejado:

  • .feature: para nova funcionalidade
  • .bugfix: para correção de bug.
  • .doc: para uma melhoria na documentação.
  • .removal: para uma suspensão de uso ou remoção de API pública.
  • .misc: para uma alteração que não é de interesse do usuário.
  • .health: para refatoração, atualização de dependências.
  • .security: para correção de vulnerabilidade de segurança.

É recomendado como uso do prefixo o código do card referente ao MR. Ex: TST123-xablau.feature

Cada entrada do changelog deve estar em um arquivo separado.

Categorias do changelog

As categorias do changelog seguem o padrão Keep a Changelog:

  • Added: Nova funcionalidade.
  • Changed: Alteração em funcionalidade existente (refatoração, atualização de dependências, melhorias internas).
  • Fixed: Correção de bug.
  • Removed: Remoção de funcionalidade.
  • Deprecated: Funcionalidade que será removida em breve.
  • Security: Correção de vulnerabilidade de segurança.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jwks_multi-0.3.1.tar.gz (6.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jwks_multi-0.3.1-py3-none-any.whl (6.7 kB view details)

Uploaded Python 3

File details

Details for the file jwks_multi-0.3.1.tar.gz.

File metadata

  • Download URL: jwks_multi-0.3.1.tar.gz
  • Upload date:
  • Size: 6.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.13

File hashes

Hashes for jwks_multi-0.3.1.tar.gz
Algorithm Hash digest
SHA256 6e2d2d5a8444250804e1467ce77295ee50586adedb951438f474ef654bc3cb8d
MD5 ea33e585493f3184c848d972b5ace4a4
BLAKE2b-256 8f5291247384ea9d9749e12fed9e195f28a9ff48ef0fe5fbb5093e2e8147da28

See more details on using hashes here.

File details

Details for the file jwks_multi-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: jwks_multi-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 6.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.13

File hashes

Hashes for jwks_multi-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 cdde3b969feb54db1814c53c62104d394c8adffa3394b9ba4d0f27e7f3c4f14d
MD5 a1e085fd574edb0e472585034c854e8c
BLAKE2b-256 f49cd23ec0905f23cd2fb13487548a92bf06f0bbde4e2362c705fd3e27fd5212

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page