Aller au contenu

Authentification

Passez un argument auth à l'un ou l'autre client pour vous connecter à un registry protégé. Deux gestionnaires sont intégrés : BearerAuth pour les tokens statiques ou fournis par un provider, et KeycloakAuth pour les identifiants clients OAuth2 contre un endpoint Keycloak.

Le paramètre auth est mutuellement exclusif avec http_client — si vous fournissez votre propre client httpx, configurez l'authentification directement dessus.

BearerAuth — token statique ou dynamique

Token statique

from apicurio_serdes import ApicurioRegistryClient, BearerAuth

auth = BearerAuth(token="my-static-token")

client = ApicurioRegistryClient(
    url="http://registry:8080/apis/registry/v3",
    group_id="com.example.schemas",
    auth=auth,
)

Token dynamique (rafraîchi à chaque requête)

Passez un callable sans argument via token_provider à la place. Il est appelé à chaque requête et peut retourner un token frais à chaque fois — utile pour les identifiants de courte durée comme les tokens OIDC GCP ou les baux Vault :

from apicurio_serdes import BearerAuth

def get_token() -> str:
    # remplacez par votre logique réelle de récupération de token
    return fetch_oidc_token()

auth = BearerAuth(token_provider=get_token)

token et token_provider sont mutuellement exclusifs ; exactement l'un des deux doit être fourni.

KeycloakAuth — identifiants clients OAuth2

Pour les registries protégés par Keycloak, KeycloakAuth gère le flux des identifiants clients, y compris le rafraîchissement du token. Fournissez-lui une URL de token, un identifiant client et un secret :

from apicurio_serdes import ApicurioRegistryClient, KeycloakAuth

auth = KeycloakAuth(
    token_url="https://keycloak.example.com/realms/myrealm/protocol/openid-connect/token",
    client_id="my-client",
    client_secret="secret",
    scope="openid",          # optionnel
)

client = ApicurioRegistryClient(
    url="http://registry:8080/apis/registry/v3",
    group_id="com.example.schemas",
    auth=auth,
)

Le token est récupéré lors de la première requête. Ensuite, KeycloakAuth le rafraîchit automatiquement lorsqu'il reste moins de 20% de son TTL. Le client asynchrone dispose de son propre chemin de rafraîchissement non bloquant pour ne jamais bloquer la boucle d'événements.

Utilisation avec AsyncApicurioRegistryClient

BearerAuth et KeycloakAuth fonctionnent sans modification avec le client asynchrone :

from apicurio_serdes import AsyncApicurioRegistryClient, KeycloakAuth

auth = KeycloakAuth(
    token_url="https://keycloak.example.com/realms/myrealm/protocol/openid-connect/token",
    client_id="my-client",
    client_secret="secret",
)

async with AsyncApicurioRegistryClient(
    url="http://registry:8080/apis/registry/v3",
    group_id="com.example.schemas",
    auth=auth,
) as client:
    ...

Utilisation d'un client httpx personnalisé (trappe de sortie)

Aucun des gestionnaires ne convient ? Fournissez directement un httpx.Client préconfiguré via http_client. Le client est utilisé tel quel — close() ne le fermera pas. C'est à vous de le fermer.

import httpx
from apicurio_serdes import ApicurioRegistryClient

http_client = httpx.Client(
    headers={"X-Api-Key": "my-api-key"},
    verify="/chemin/vers/ca-personnalise.pem",
)

client = ApicurioRegistryClient(
    url="http://registry:8080/apis/registry/v3",
    group_id="com.example.schemas",
    http_client=http_client,
)

Gestion des erreurs

Les échecs d'authentification lèvent AuthenticationError :

from apicurio_serdes._errors import AuthenticationError

try:
    payload = serializer(data, ctx)
except AuthenticationError as e:
    print(f"Authentification échouée : {e}")

Voir Gestion des erreurs pour les causes fréquentes et les étapes de récupération.