Dépanner les erreurs d'authentification et de signature
Guide pratique - diagnostiquer et résoudre les erreurs 401, 403 et de signature lors de l'appel du canal API.
Utilisez ce guide lorsque vos requêtes vers le canal API retournent des erreurs d'authentification ou de signature inattendues.
401 missing_api_key
Symptôme : {"error":{"code":"missing_api_key","message":"…"}}
Cause : Aucun en-tête Authorization n'a été envoyé.
Solution : Ajoutez Authorization: Bearer <clé> à chaque requête. Vérifiez que votre client HTTP ne supprime pas les en-têtes lors d'une redirection.
401 invalid_api_key
Symptôme : {"error":{"code":"invalid_api_key","message":"…"}}
Cause : La clé est incorrecte, révoquée ou a été renouvelée.
Checklist :
- Copiez à nouveau la clé depuis la console - l'indice affiché est masqué (
nx_live_••••abcd). - Confirmez qu'il n'y a pas d'espaces en début ou fin de la valeur stockée.
- Confirmez que la clé appartient bien à ce canal (chaque canal possède sa propre clé).
- Si la clé a été renouvelée récemment, mettez à jour votre service avec la nouvelle clé.
403 environment_mismatch
Symptôme : {"error":{"code":"environment_mismatch","message":"…"}}
Cause : L'environnement de la clé ne correspond pas à l'environnement du canal.
- Les clés
nx_live_fonctionnent uniquement sur les canaux de production. - Les clés
nx_test_fonctionnent uniquement sur les canaux dev / staging.
Solution : Utilisez la clé avec l'environnement correspondant, ou créez le canal dans l'environnement correspondant.
403 origin_not_allowed
Symptôme : 403 avec un code d'erreur d'origine.
Cause : Vous utilisez une clé serveur (nx_live_ ou nx_test_) et la requête inclut un en-tête Origin, ou vous utilisez une clé publique (nx_pub_) et l'origine n'est pas dans la liste des origines autorisées du canal.
Checklist pour les clés serveur :
- Supprimez l'en-tête
Origindes appels serveur à serveur - les clés serveur ne doivent pas être utilisées depuis des contextes navigateur.
Checklist pour les clés publiques :
- Confirmez que la requête inclut
Origin: <votre_origine>. - Dans la console, vérifiez que la liste des origines autorisées du canal inclut l'origine exacte (ex.
https://app.example.com). - Si vous appelez depuis une application mobile native qui ne peut pas définir
Origin, soit :- Utilisez un proxy backend avec une clé
nx_live_. - Définissez
allowed_origins: ["*"]sur le canal (lisez d'abord les implications de sécurité).
- Utilisez un proxy backend avec une clé
401 signature_required
Symptôme : {"error":{"code":"signature_required","message":"…"}}
Cause : Le canal a require_signature = true mais aucun en-tête X-Naixus-Signature n'a été envoyé.
Solution : Ajoutez l'en-tête de signature. Voir Signer les requêtes avec HMAC.
401 signature_expired
Symptôme : {"error":{"code":"signature_expired","message":"…"}}
Cause : L'horodatage t= dans l'en-tête de signature est à plus de 300 secondes de l'heure actuelle du serveur.
Checklist :
- Vérifiez que l'horloge système de votre serveur est synchronisée avec NTP.
- Confirmez que vous calculez
t = floor(Date.now() / 1000)(secondes, pas millisecondes) au moment où la requête est envoyée - pas au démarrage ou depuis une valeur mise en cache. - Confirmez que vous ne réutilisez pas une signature calculée précédemment.
401 invalid_signature
Symptôme : {"error":{"code":"invalid_signature","message":"…"}}
Cause : Le digest HMAC ne correspond pas à ce que le serveur a calculé, ou l'en-tête est mal formé.
Checklist :
- Confirmez que vous signez les octets bruts du corps tels qu'ils sont envoyés - pas une copie re-sérialisée ou formatée.
- Confirmez que le
Content-Typeestapplication/jsonet que l'encodage du corps correspond (UTF-8). - Confirmez que vous utilisez le bon secret de signature pour ce canal. Copiez-le depuis la réponse de rotation si vous n'en êtes pas sûr (vous devrez le renouveler pour en obtenir un nouveau).
- Confirmez que le format de l'en-tête est exactement
t=<int>,v1=<hex_minuscules>sans espaces supplémentaires. - Exécutez le HMAC localement avec les mêmes octets de corps et comparez le digest.
Extrait de débogage (Python) :
import hashlib, hmac
body = b'...' # octets exacts que vous envoyez
secret = '...' # secret de signature
ts = '...' # valeur t= que vous avez envoyée
signed = ts.encode('ascii') + b'.' + body
expected = hmac.new(secret.encode('utf-8'), signed, hashlib.sha256).hexdigest()
print('v1 attendu :', expected)503 signing_secret_unavailable
Symptôme : {"error":{"code":"signing_secret_unavailable","message":"…"}}
Cause : Le canal a require_signature = true mais aucun secret de signature n'est actuellement stocké.
Solution : Dans la console (ou via POST /api/v1/channels/{id}/rotate-signing-secret), générez un secret de signature. Copiez et déployez la valeur retournée.
Canal introuvable (404) après une authentification réussie
Symptôme : 404 avec channel_not_bound ou similaire.
Cause : Le canal existe mais n'est pas lié à un flow publié.
Solution : Dans le flow builder, ajoutez un nœud Trigger from Channel, sélectionnez le canal et publiez le flow.
Référence
Pour la référence complète des codes d'erreur, voir la référence d'API - section Référence des erreurs.
Recevoir les réponses en SSE
Guide pratique - consommer le flux Server-Sent Events du canal API depuis un backend Node.js ou un client navigateur.
Architecture et sécurité du canal API
Explication - comment le canal API fonctionne, comment l'authentification et la signature fonctionnent, ce qu'elles protègent, et les limitations actuelles.