- Relevé par : David
- Le : 29/07/26
Description du problème
Sur l'API (confiture-rest-api), la route POST /api/auth/signin répond
404 Cannot POST /api/auth/signin dès que la requête porte un en-tête
Authorization: Bearer <jeton> invalide ou expiré. Sans cet en-tête, la même
requête répond bien 401 Unauthorized.
Impact usager — il concerne les clients de l'API plutôt que l'application
web. Un client qui conserve un jeton et tente de se reconnecter après son
expiration envoie naturellement l'en-tête, et reçoit alors un 404 qui laisse
croire que la route n'existe plus, au lieu d'une erreur d'authentification.
Le diagnostic part dans la mauvaise direction : on cherche un changement d'API,
pas un problème de jeton.
Navigateur
Sans objet — reproduit en appel HTTP direct (fetch, Node 25). Le
comportement de l'application web n'est pas affecté, celle-ci n'envoyant pas
d'en-tête Authorization sur la connexion.
Scénario pour reproduire le bug
Avec des identifiants volontairement invalides, contre
https://ara.numerique.gouv.fr/api :
# 1. Sans Authorization → 401 Unauthorized (comportement attendu)
curl -s -o /dev/null -w "%{http_code}\n" \
-X POST https://ara.numerique.gouv.fr/api/auth/signin \
-H "Content-Type: application/json" \
-d '{"username":"[email protected]","password":"x"}'
# 2. Avec un Authorization invalide → 404 Cannot POST /api/auth/signin
curl -s -o /dev/null -w "%{http_code}\n" \
-X POST https://ara.numerique.gouv.fr/api/auth/signin \
-H "Content-Type: application/json" \
-H "Authorization: Bearer jeton-invalide" \
-d '{"username":"[email protected]","password":"x"}'
| Requête |
Réponse observée |
sans Authorization |
401 — {"message":"Unauthorized","statusCode":401} |
avec Authorization invalide |
404 — {"message":"Cannot POST /api/auth/signin","error":"Not Found","statusCode":404} |
Correction à apporter
La route de connexion devrait ignorer l'en-tête Authorization : la
présence d'un jeton, même invalide, n'a pas à influer sur la résolution d'une
route publique. Le comportement attendu est un 401 dans les deux cas (ou un
200/201 si les identifiants sont valides).
Il est possible que ce soit une conséquence de la configuration d'un guard sur
le contrôleur d'authentification, plutôt qu'un choix délibéré.
Relevé en développant un client tiers de l'API. Contournement de mon côté : ne
pas envoyer l'en-tête sur cette route — donc rien d'urgent pour moi, mais le
prochain intégrateur y perdra probablement le même temps.
Description du problème
Sur l'API (
confiture-rest-api), la routePOST /api/auth/signinrépond404
Cannot POST /api/auth/signindès que la requête porte un en-têteAuthorization: Bearer <jeton>invalide ou expiré. Sans cet en-tête, la mêmerequête répond bien 401 Unauthorized.
Impact usager — il concerne les clients de l'API plutôt que l'application
web. Un client qui conserve un jeton et tente de se reconnecter après son
expiration envoie naturellement l'en-tête, et reçoit alors un 404 qui laisse
croire que la route n'existe plus, au lieu d'une erreur d'authentification.
Le diagnostic part dans la mauvaise direction : on cherche un changement d'API,
pas un problème de jeton.
Navigateur
Sans objet — reproduit en appel HTTP direct (
fetch, Node 25). Lecomportement de l'application web n'est pas affecté, celle-ci n'envoyant pas
d'en-tête
Authorizationsur la connexion.Scénario pour reproduire le bug
Avec des identifiants volontairement invalides, contre
https://ara.numerique.gouv.fr/api:Authorization401—{"message":"Unauthorized","statusCode":401}Authorizationinvalide404—{"message":"Cannot POST /api/auth/signin","error":"Not Found","statusCode":404}Correction à apporter
La route de connexion devrait ignorer l'en-tête
Authorization: laprésence d'un jeton, même invalide, n'a pas à influer sur la résolution d'une
route publique. Le comportement attendu est un
401dans les deux cas (ou un200/201si les identifiants sont valides).Il est possible que ce soit une conséquence de la configuration d'un guard sur
le contrôleur d'authentification, plutôt qu'un choix délibéré.
Relevé en développant un client tiers de l'API. Contournement de mon côté : ne
pas envoyer l'en-tête sur cette route — donc rien d'urgent pour moi, mais le
prochain intégrateur y perdra probablement le même temps.