Ir para o conteúdo

sdk/python

SDK de servidor Python assíncrono para verificação JWT sem rede,autenticação de requisições e validação de assinatura de webhook.

Ver como Markdown

Estado

Implementado e verificado localmente. A verificação de ida e voltacom um IdP real (busca de JWKS, assinatura/verificação de tokencontra uma instância XID ativa) ainda não foi realizada e deve serconcluída antes do uso em produção.

Instalar

pip install xid

Início rápido

Construa um XidClient na inicialização e reutilize-o. Ocliente faz cache do JWKS internamente.

from xid import XidClient

client = XidClient(
    issuer="https://xid.dev",
    audience="https://api.yourapp.com",  # optional
)

# Verify a token
claims = await client.verify_token("eyJ...")
print(claims.sub, claims.email, claims.scope)

# Authenticate a request
status = await client.authenticate_request(
    headers=dict(request.headers),
    cookies=dict(request.cookies),
)
if not status.authenticated:
    raise Unauthorized()
user_id = status.claims.sub

Verifica webhook

from xid import WebhookVerificationError

try:
    webhook = client.verify_webhook(
        payload=request.body,
        headers=dict(request.headers),
        secret="whsec_xxx",
    )
    import json
    event = json.loads(webhook.body)
except WebhookVerificationError as exc:
    raise BadRequest(str(exc))

Integração com FastAPI

from fastapi import FastAPI, Depends, HTTPException, Request
from xid import XidClient, TokenClaims

app = FastAPI()
xid = XidClient(issuer="https://xid.dev")

@app.on_event("shutdown")
async def shutdown():
    await xid.aclose()

async def require_auth(request: Request) -> TokenClaims:
    status = await xid.authenticate_request(dict(request.headers))
    if not status.authenticated:
        raise HTTPException(status_code=401)
    return status.claims

@app.get("/me")
async def me(claims: TokenClaims = Depends(require_auth)):
    return {"sub": claims.sub, "email": claims.email}

Opções do XidClient

Parâmetro Padrão Descrição
issuer obrigatório URL do emissor XID
audience None Claim aud esperado; None ignora a validação
jwks_ttl 3600 TTL do cache em memória do JWKS em segundos
http_timeout 10.0 Timeout de busca do JWKS em segundos
cookie_name __session Chave de cookie para extração do token de sessão
leeway 0 Tolerância de desvio de relógio em segundos

API principal

Método Descrição
await client.verify_token(token) Verifica string JWT; lança TokenVerificationError em caso defalha.
await client.authenticate_request(headers, cookies) Extrai e verifica o token de headers/cookies. RetornaAuthStatus; não lança exceções.
client.verify_webhook(payload, headers, secret) Síncrono. Valida HMAC-SHA256 svix + janela de replay de 5 minutos.Lança WebhookVerificationError em caso de falha.
await client.aclose() Libera os recursos do cliente HTTP subjacente.

Notas da plataforma

  • Prioridade assíncrona. Chamadores síncronos (Django/Flask) podemenvolver com asyncio.run().
  • Depende de pyjwt[crypto] >=2.8 e httpx >=0.27. Python3.10+ obrigatório.
  • Implantações com múltiplos workers não compartilham cache JWKS entreprocessos. Um cache compartilhado (Redis) é uma melhoria planejada.
Navegação

Digite para pesquisar...

Use as teclas de seta para navegarPressione Enter para selecionarPressione Escape para fechar