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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6e2d2d5a8444250804e1467ce77295ee50586adedb951438f474ef654bc3cb8d
|
|
| MD5 |
ea33e585493f3184c848d972b5ace4a4
|
|
| BLAKE2b-256 |
8f5291247384ea9d9749e12fed9e195f28a9ff48ef0fe5fbb5093e2e8147da28
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cdde3b969feb54db1814c53c62104d394c8adffa3394b9ba4d0f27e7f3c4f14d
|
|
| MD5 |
a1e085fd574edb0e472585034c854e8c
|
|
| BLAKE2b-256 |
f49cd23ec0905f23cd2fb13487548a92bf06f0bbde4e2362c705fd3e27fd5212
|