OAuth2 partenaires

Client Credentials Machine-to-Machine pour intégrations long-terme.

Pour les intégrations machine-to-machine (ESN, fournisseur SaaS, CMDB externe). Alternative au flow PAT — rotation autonome côté partenaire.

Quand choisir OAuth2 plutôt que PAT : intégrations long-terme avec rotation auto (CI/CD, CMDB, monitoring).

1. Provisioning self-service

Depuis v0.1.85, le tenant-admin provisionne directement les clients OAuth2 partner depuis /api-token-requests (onglet « OAuth2 partner »). Un audit trail unifié avec les PAT est conservé dans la queue admin.

Champs à fournir :

  • Slug du partenaire (kebab-case, ex. acme-corp) — composera le client_id final arch-partner-<tenant>-<slug>
  • Email technique du partenaire — destinataire des futures alertes de rotation
  • Scopes (read/write/admin)
  • IPs sources (optionnel, audit/contractuel uniquement en V1)
  • Justification — projet, périmètre, durée

À l'approbation par le tenant-admin, un client Keycloak client_credentials est créé instantanément ; client_id et client_secret sont affichés une seule fois côté admin pour transmission via canal sécurisé (Vault, 1Password share, etc.).

Le client_secret n'est plus jamais affiché après ce one-shot. Rotation possible via le script ops infra/scripts/keycloak-prod-create-m2m-client.sh (sur demande à support@arch-platform.com).

2. Obtenir un access token

curl
curl -X POST \
  -d 'grant_type=client_credentials' \
  -d 'client_id=arch-partner-VOTRE_TENANT-VOTRE_SLUG' \
  -d 'client_secret=...' \
  -d 'scope=read write' \
  https://auth.arch-platform.com/realms/arch-prod/protocol/openid-connect/token
Python
import requests

resp = requests.post(
    "https://auth.arch-platform.com/realms/arch-prod/protocol/openid-connect/token",
    data={
        "grant_type": "client_credentials",
        "client_id": "arch-partner-votre-tenant-votre-slug",
        "client_secret": "VOTRE_SECRET",
        "scope": "read write",
    },
)
token = resp.json()["access_token"]

api = requests.get(
    "https://api.arch-platform.com/api/v1/referentiel/applications",
    headers={"Authorization": f"Bearer {token}"},
)
print(api.json())

TTL access token : 5 minutes. Cachez-le côté client.

3. Scopes & mapping

Scope JWTPermet
readEndpoints @PublicApi(scope="read")
writeread + endpoints @PublicApi(scope="write")
adminTous scopes

4. Rotation

Rotation du client_secret sur demande à support@arch-platform.com (interface self-service à venir). L'ancien reste valide 24h post-rotation.

5. Rate limiting

Quota partenaire : 600 req/min (3× le quota PAT).

PAT vs OAuth2

PATOAuth2 partenaire
ProvisioningSelf-service /api-token-requestsSelf-service /api-token-requests (tenant-admin)
Formatarc_pat_… opaqueJWT signé KC
TTLConfigurable5 min, refresh autonome
Rate limit180 req/min600 req/min
RecommandéScripts, POC, CI ponctuelIntégrations long-terme

On this page