Skip to content

POST /auth/signin répond 404 au lieu de 401 lorsqu'un en-tête Authorization est présent #1581

Description

@DavidPivert
  • 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions