Authentification

Toutes les requêtes API doivent être authentifiées à l'aide de clés API. Incluez votre clé API dans l'en-tête de requête pour accéder aux points de terminaison protégés.

Authentification par clé API

Incluez votre clé API dans l'en-tête X-API-Key avec chaque requête:
En-tête d'authentification
X-API-Key: ucos_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Les clés ont la forme ucos_<live|test>_<32 caractères base64url>, par exemple ucos_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. Conservez-les côté serveur et renouvelez toute clé qui apparaît dans un journal ou une capture d'écran.

Génération de clés API

Avant de pouvoir effectuer des requêtes API, vous devez générer une clé API à partir des paramètres de votre application. Suivez ces étapes pour créer votre première clé API:
  1. Connectez-vous à votre tableau de bord Ultimate Custom Order Status
  2. Accédez à Paramètres > Clés API
  3. Cliquez sur "Générer une nouvelle clé API"
  4. Configurez les permissions pour votre clé API
  5. Enregistrez la clé API en toute sécurité (elle ne sera affichée qu'une seule fois)

💡 Important: Stockez votre clé API dans un emplacement sécurisé immédiatement après la génération. Pour des raisons de sécurité, la clé ne sera affichée qu'une seule fois et ne pourra pas être récupérée ultérieurement. Si vous perdez votre clé API, vous devrez en générer une nouvelle.

Gestion des clés API

Le nom d’affichage et la description d’une clé peuvent être modifiés dans Paramètres > Clés API. Tout ce qui touche à l’authentification est fixé au moment de la création de la clé.
  • Le nom d’affichage et la description sont modifiables à tout moment.
  • Le secret de la clé, les permissions, les limites de débit et l’expiration sont fixés à la création et ne peuvent plus être modifiés ensuite.
  • Pour modifier l’un de ces éléments, révoquez la clé et créez une clé de remplacement. Une clé révoquée reste listée et refuse l’authentification jusqu’à la suppression de son enregistrement.
  • Les limites de débit sont définies par clé à la création (par défaut : 60 requêtes par minute et 10 000 par jour) et sont indiquées dans les en-têtes de réponse X-RateLimit-*.
  • La carte des clés liste les dernières requêtes servies par chaque clé, ce qui rend l’utilisation vérifiable dans l’application.

Permissions de clé API

Chaque clé API peut être configurée avec des permissions spécifiques. Seules ces cinq peuvent être accordées :
PermissionDescription
canViewOrdersAccès en lecture aux commandes
canChangeOrderStatusMettre à jour le statut et le sous-statut de la commande
canSendNotificationsEnvoyer des notifications aux clients (email, SMS, WhatsApp)
canViewStatusesAccès en lecture aux statuts personnalisés
canOverrideProductChainEnforcementContourner les règles d'application de la chaîne de produits lors de la mise à jour du statut

Limitation de débit

Les requêtes API sont limitées en débit par clé API en utilisant deux fenêtres séparées:
  • Limite par minute : définie par clé à la création (par défaut : 60 requêtes/minute)
  • Limite par jour : définie par clé à la création (par défaut : 10 000 requêtes/jour)

Les deux limites doivent être satisfaites pour qu'une requête soit autorisée. Si l'une ou l'autre limite est dépassée, la requête sera rejetée avec un code d'état 429.

Une requête qui dépasse l'une des limites est rejetée avec 429, un en-tête Retry-After et details.retryAfter dans le corps.

Les informations de limite de débit sont incluses dans tous les en-têtes de réponse API:

  • X-RateLimit-Limit-Minute: Nombre maximum de requêtes par minute
  • X-RateLimit-Remaining-Minute: Requêtes restantes dans la minute en cours
  • X-RateLimit-Reset-Minute: Horodatage Unix (secondes) de réinitialisation de la minute
  • X-RateLimit-Limit-Day: Nombre maximum de requêtes par jour
  • X-RateLimit-Remaining-Day: Requêtes restantes dans le jour en cours
  • X-RateLimit-Reset-Day: Horodatage Unix (secondes) de réinitialisation du jour
  • Retry-After: Secondes à attendre avant de réessayer (présent en cas de limitation)

Meilleures pratiques de sécurité

⚠️ Directives de sécurité importantes

  • Ne jamais commiter les clés API dans le contrôle de version
  • Stocker les clés API dans des variables d'environnement ou des systèmes de gestion de clés sécurisés
  • Faire une rotation des clés API régulièrement
  • Utiliser des clés API différentes pour différents environnements (développement, staging, production)
  • Révoquer immédiatement toute clé API qui pourrait avoir été compromise
  • Utiliser les permissions minimales nécessaires pour chaque clé API
  • Surveiller l'utilisation de l'API pour détecter des modèles inhabituels

Journal d’audit

Les requêtes sont enregistrées sous la clé qui les a authentifiées, et les tentatives rejetées sont enregistrées séparément pour le support.
  • Les requêtes authentifiées enregistrent le point de terminaison, la méthode, le code de statut, le temps de réponse, l’adresse source et l’agent utilisateur.
  • Une requête en échec (4xx ou 5xx) enregistre aussi le corps de la requête et le message d’erreur de la réponse, afin qu’une charge utile rejetée puisse être diagnostiquée depuis le journal.
  • Une requête rejetée avant l’authentification (clé absente ou inconnue, 401) ne produit pas de ligne par clé ; l’application enregistre la tentative séparément (raison, quatre derniers caractères de la clé présentée, source et point de terminaison) pour le support.
  • Les deux types d’enregistrements sont conservés 90 jours par défaut, puis supprimés.
  • Une clé révoquée ou expirée présentée est enregistrée comme un 401 (afin qu’une clé retirée toujours utilisée reste visible) mais ne compte pas comme une utilisation.
  • Le compteur d’utilisation et la date de dernière utilisation de la clé sont mis à jour exactement une fois par requête authentifiée, y compris les requêtes refusées par un contrôle de permission ou par la limite de débit.

Exemple de requête

Voici un exemple complet d'une requête API authentifiée:
Requête cURL authentifiée
curl -X GET "https://api.ultimate-custom-order-status.apps.msmtech.ca/api/v1/orders?page=1&limit=25" \
  -H "X-API-Key: ucos_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
  -H "X-API-Version: 1.5"

Réponses d'erreur

401 Non autorisé

Retourné lorsque la clé API est manquante ou invalide:

401 Non autorisé
{
  "success": false,
  "error": "Missing API key. Include it in the X-API-Key header"
}

403 Interdit

Retourné lorsque la clé API manque de permissions requises:

403 Interdit
{
  "success": false,
  "error": "Insufficient permissions. Required: canViewOrders"
}

400 Requête invalide

La requête est invalide : un champ est manquant ou a une valeur incorrecte, le JSON est mal formé, une version d’API non prise en charge a été demandée, ou une valeur de requête est invalide. La plupart des échecs de validation contiennent details.errors ; d’autres 400 peuvent contenir d’autres détails (par exemple supported_versions pour une version d’API inconnue).

400 Requête invalide
{
  "success": false,
  "error": "Validation failed",
  "details": {
    "errors": [
      {
        "code": "invalid_type",
        "expected": "string",
        "received": "undefined",
        "path": ["status_id"],
        "message": "Required"
      }
    ]
  }
}

405 Méthode non autorisée

La route existe mais n'accepte pas cette méthode HTTP. Cette réponse est produite par le framework HTTP avant l'exécution de l'API ; elle n'utilise donc pas l'enveloppe { success, error }.

429 Trop de requêtes

La limite par minute ou par jour de la clé est atteinte. Attendez details.retryAfter secondes (également envoyé dans l'en-tête Retry-After) avant de réessayer.

429 Trop de requêtes
{
  "success": false,
  "error": "Rate limit exceeded",
  "details": {
    "retryAfter": 30
  }
}

500 Erreur interne du serveur

Une erreur inattendue s'est produite. details.message peut contenir des diagnostics ; réessayez avec un délai progressif.

500 Erreur interne du serveur
{
  "success": false,
  "error": "Internal server error",
  "details": {
    "message": "An unexpected error occurred"
  }
}