Comptes de Service
Les comptes de service fournissent un accès machine à machine (M2M) aux APIs STOA en utilisant le grant OAuth2 client_credentials. Ils sont idéaux pour les pipelines CI/CD, les services backend et les scripts d'automatisation.
Fonctionnement
- Votre application s'authentifie auprès de Keycloak avec
client_idetclient_secret - Keycloak retourne un token d'accès JWT
- Le token est utilisé comme token Bearer pour les requêtes API
- Le compte de service hérite du rôle RBAC de l'utilisateur qui l'a créé
Créer un Compte de Service
Via l'API
The examples below use environment variables. Set them for your STOA instance:
export STOA_API_URL="https://api.gostoa.dev" # Replace with your domain
export STOA_AUTH_URL="https://auth.gostoa.dev" # Keycloak OIDC provider
export STOA_GATEWAY_URL="https://mcp.gostoa.dev" # MCP Gateway endpoint
Self-hosted? Replace gostoa.dev with your domain.
curl -X POST "${STOA_API_URL}/v1/service-accounts" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "ci-pipeline",
"description": "CI/CD pipeline for API deployments"
}'
Réponse (credentials affichés une seule fois) :
{
"id": "sa_abc123",
"name": "ci-pipeline",
"client_id": "sa-ci-pipeline-a1b2c3",
"client_secret": "generated-secret-shown-once",
"created_at": "2026-02-13T10:00:00Z"
}
Sauvegardez le client_secret immédiatement — il ne peut pas être récupéré après la création.
Via le Portail
- Accédez à Comptes de Service dans la barre latérale du Portail
- Cliquez sur Créer un Compte de Service
- Saisissez un nom et une description optionnelle
- Cliquez sur Créer
- Copiez le
client_idet leclient_secret(affichés une seule fois)
Utiliser un Compte de Service
Obtenir un Token d'Accès
TOKEN=$(curl -s -X POST "${STOA_AUTH_URL}/realms/stoa/protocol/openid-connect/token" \
-d "grant_type=client_credentials" \
-d "client_id=sa-ci-pipeline-a1b2c3" \
-d "client_secret=your-client-secret" \
| jq -r '.access_token')
Effectuer des Requêtes API
# Lister les APIs
curl -s "${STOA_API_URL}/v1/apis" \
-H "Authorization: Bearer $TOKEN"
# Appeler un outil via MCP Gateway
curl -s "${STOA_GATEWAY_URL}/v1/tools/payment-tool/execute" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"input": {"amount": 100}}'
Exemple Python
import httpx
async def get_token(client_id: str, client_secret: str) -> str:
async with httpx.AsyncClient() as client:
response = await client.post(
f"{auth_url}/realms/stoa/protocol/openid-connect/token",
data={
"grant_type": "client_credentials",
"client_id": client_id,
"client_secret": client_secret,
},
)
return response.json()["access_token"]
Héritage RBAC
Les comptes de service héritent du rôle de l'utilisateur qui les a créés :
| Rôle du Créateur | Permissions du Compte de Service |
|---|---|
cpi-admin | Accès complet à la plateforme |
tenant-admin | Tenant propre : lecture + écriture |
devops | Tenant propre : déployer + promouvoir |
viewer | Accès en lecture seule |
Les comptes de service sont limités au même tenant que leur créateur.
Rotation des Secrets
Régénérer un Secret
curl -X POST "${STOA_API_URL}/v1/service-accounts/{sa_id}/regenerate-secret" \
-H "Authorization: Bearer $TOKEN"
Réponse :
{
"client_id": "sa-ci-pipeline-a1b2c3",
"client_secret": "new-generated-secret"
}
L'ancien secret est invalidé immédiatement. Mettez à jour tous les systèmes utilisant ce compte de service avant de faire la rotation.
Bonnes Pratiques de Rotation
- Rotation tous les 90 jours — alignez avec votre politique de rotation des secrets
- Mettez à jour les consommateurs en premier — déployez le nouveau secret sur tous les clients avant la rotation
- Utilisez des variables d'environnement — ne codez jamais les secrets en dur dans le code source
- Surveillez les échecs de tokens — un pic d'erreurs 401 après la rotation indique des mises à jour manquées
Gérer les Comptes de Service
Lister les Comptes de Service
curl "${STOA_API_URL}/v1/service-accounts" \
-H "Authorization: Bearer $TOKEN"
Supprimer un Compte de Service
curl -X DELETE "${STOA_API_URL}/v1/service-accounts/{sa_id}" \
-H "Authorization: Bearer $TOKEN"
La suppression retire le client Keycloak et invalide immédiatement tous les tokens.
Intégration CI/CD
GitHub Actions
jobs:
deploy-api:
steps:
- name: Get STOA token
run: |
TOKEN=$(curl -s -X POST "$STOA_AUTH_URL/realms/stoa/protocol/openid-connect/token" \
-d "grant_type=client_credentials" \
-d "client_id=${{ secrets.STOA_CLIENT_ID }}" \
-d "client_secret=${{ secrets.STOA_CLIENT_SECRET }}" \
| jq -r '.access_token')
echo "STOA_TOKEN=$TOKEN" >> $GITHUB_ENV
- name: Sync API spec
run: |
curl -X POST "$STOA_API_URL/v1/apis/sync" \
-H "Authorization: Bearer $STOA_TOKEN" \
-H "Content-Type: application/json" \
-d @openapi.json
Mise en Cache des Tokens
Les tokens d'accès ont un TTL par défaut de 5 minutes. Pour les processus de longue durée, rafraîchissez le token avant l'expiration :
# Vérifier l'expiration du token
echo $TOKEN | cut -d. -f2 | base64 -d 2>/dev/null | jq '.exp'
Voir Aussi
- Guide d'Authentification -- Flux OIDC pour les utilisateurs interactifs
- Permissions RBAC -- Matrice des rôles
- Administration Keycloak -- Configuration des clients
- Configuration de Sécurité -- Paramètres JWT