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
X-API-Key: ucos_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXLes 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
- Connectez-vous à votre tableau de bord Ultimate Custom Order Status
- Accédez à Paramètres > Clés API
- Cliquez sur "Générer une nouvelle clé API"
- Configurez les permissions pour votre clé API
- 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 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
| Permission | Description |
|---|---|
canViewOrders | Accès en lecture aux commandes |
canChangeOrderStatus | Mettre à jour le statut et le sous-statut de la commande |
canSendNotifications | Envoyer des notifications aux clients (email, SMS, WhatsApp) |
canViewStatuses | Accès en lecture aux statuts personnalisés |
canOverrideProductChainEnforcement | Contourner les règles d'application de la chaîne de produits lors de la mise à jour du statut |
Limitation de débit
- 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 minuteX-RateLimit-Remaining-Minute: Requêtes restantes dans la minute en coursX-RateLimit-Reset-Minute: Horodatage Unix (secondes) de réinitialisation de la minuteX-RateLimit-Limit-Day: Nombre maximum de requêtes par jourX-RateLimit-Remaining-Day: Requêtes restantes dans le jour en coursX-RateLimit-Reset-Day: Horodatage Unix (secondes) de réinitialisation du jourRetry-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 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
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:
{
"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:
{
"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).
{
"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.
{
"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.
{
"success": false,
"error": "Internal server error",
"details": {
"message": "An unexpected error occurred"
}
}