Docs/ Référence API/ Authentification API

Authentification API

Authentifiez-vous auprès de l'API REST sh0 en utilisant des jetons JWT Bearer ou des clés API pour un accès programmatique.

Obtenir un jeton API

Pour obtenir un jeton JWT, envoyez une requête POST à l'endpoint de connexion avec vos identifiants :

Terminal
curl -X POST https://your-server:9000/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "password": "your-password"
  }'

Si les identifiants sont valides, l'API retourne un jeton JWT et les informations de l'utilisateur :

Response (200 OK)
{
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c3JfYWJjMTIzIiwiZXhwIjoxNzE...",
    "user": {
      "id": "usr_abc123",
      "email": "[email protected]",
      "name": "Admin",
      "role": "admin"
    }
  }
}

Si l'authentification à deux facteurs est activée, incluez le code TOTP :

Terminal
curl -X POST https://your-server:9000/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "password": "your-password",
    "totp_code": "123456"
  }'
Diagramme du flux de connexion API montrant l'échange d'identifiants contre un jeton JWT

Authentification par jeton Bearer

Incluez le jeton JWT dans l'en-tête Authorization de chaque requête API :

Terminal
curl https://your-server:9000/api/apps \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Le jeton contient l'ID utilisateur, le rôle et le délai d'expiration. sh0 valide la signature et l'expiration à chaque requête.

Tip
Stockez le jeton de manière sécurisée. Dans les scripts, utilisez des variables d'environnement plutôt que de coder les jetons en dur :
Terminal
export SH0_TOKEN="eyJhbGciOiJIUzI1NiIs..."

curl https://your-server:9000/api/apps \
  -H "Authorization: Bearer $SH0_TOKEN"

Alternative par clé API

Pour les intégrations de longue durée (pipelines CI/CD, scripts de surveillance, webhooks), les clés API sont plus pratiques que les jetons JWT car elles n'expirent pas.

Créer une clé API :

  1. Naviguez vers Settings → API Keys dans le tableau de bord.
  2. Cliquez sur Generate API Key.
  3. Entrez un nom descriptif (ex. : "Pipeline CI/CD" ou "Surveillance").
  4. Copiez la clé immédiatement -- elle n'est affichée qu'une seule fois.
Panneau de gestion des clés API avec les clés générées

Utiliser une clé API :

Terminal
curl https://your-server:9000/api/apps \
  -H "X-API-Key: sh0_key_abc123def456"
Warning
Les clés API ont les mêmes permissions que l'utilisateur qui les a créées. Traitez-les comme des mots de passe -- ne les committez jamais dans le contrôle de version et ne les partagez jamais en texte clair.

Expiration et rafraîchissement des jetons

Les jetons JWT sont valides 30 jours par défaut. Le délai d'expiration est encodé dans le payload du jeton.

Pour rafraîchir un jeton expirant, appelez l'endpoint de rafraîchissement avec votre jeton actuel (encore valide) :

Terminal
curl -X POST https://your-server:9000/api/auth/refresh \
  -H "Authorization: Bearer YOUR_CURRENT_TOKEN"
Response (200 OK)
{
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIs...(new token)...",
    "expires_at": "2026-04-20T12:00:00Z"
  }
}

Le tableau de bord rafraîchit automatiquement les jetons avant leur expiration. Pour les intégrations API, implémentez une logique de rafraîchissement de jeton ou utilisez des clés API pour éviter les problèmes d'expiration.

Note
Les clés API n'expirent pas. Elles restent valides jusqu'à leur révocation manuelle depuis Settings → API Keys.

Jetons CSRF pour les requêtes du tableau de bord

Lors des requêtes depuis le tableau de bord (navigateur), sh0 utilise des jetons CSRF pour prévenir les attaques de falsification de requêtes intersites. Ceci est géré automatiquement par le client API du tableau de bord.

Si vous construisez un frontend personnalisé qui s'authentifie via des cookies (au lieu de jetons Bearer), vous devez inclure le jeton CSRF dans vos requêtes :

Terminal
# Get a CSRF token
curl https://your-server:9000/api/auth/csrf-token \
  -H "Cookie: session=..."

# Include it in state-changing requests
curl -X POST https://your-server:9000/api/apps \
  -H "Cookie: session=..." \
  -H "X-CSRF-Token: csrf_token_here" \
  -H "Content-Type: application/json" \
  -d '{"name": "my-app"}'
Tip
L'authentification par jeton Bearer (via l'en-tête Authorization) ne nécessite pas de jetons CSRF. La protection CSRF ne s'applique qu'aux sessions basées sur les cookies.

Erreurs d'authentification

Lorsque l'authentification échoue, l'API retourne une réponse d'erreur structurée :

401 Unauthorized
{
  "error": {
    "code": "UNAUTHORIZED",
    "message": "Invalid or expired authentication token"
  }
}
403 Forbidden
{
  "error": {
    "code": "FORBIDDEN",
    "message": "You do not have permission to perform this action"
  }
}

Scénarios d'erreur courants :

StatutCodeCause
401UNAUTHORIZEDJeton/clé API manquant, invalide ou expiré
401INVALID_CREDENTIALSE-mail ou mot de passe incorrect à la connexion
401TOTP_REQUIREDLa 2FA est activée mais aucun code TOTP n'a été fourni
403FORBIDDENLe rôle de l'utilisateur n'a pas la permission pour cette action
429RATE_LIMITEDTrop de tentatives de connexion (5 par minute par IP)
Réponse d'erreur d'authentification dans l'explorateur API