Problème de communication avec une API

Un bug mystique...

a marqué ce sujet comme résolu.

Bonjour à tous,

J'ai actuellement une API Symfony2, et une application AngularJS qui la consomme.

Je rencontre un problème lors de la connexion d'un membre. Le mécanisme est le suivant :

  • Le client envoie une requête POST sur la route /api/public/users/connection avec un objet JSON comme données, sous la forme suivante : {"username":"qzdqzd","password":"qzdqzdc"} (à terme ce sera bien sûr en HTTPS)
  • Le serveur vérifie la requête et renvoie soit un code 400 si la connexion a échouée, avec comme données de la réponse un message d'erreur ("This user does not exist." par exemple). Sinon, il renvoie un code 200 avec la clé pour se connecter à l'API, que le client stockera dans une cookie

Je suis confronté à un problème très étrange. J'ai une instance de l'API en local (http://galaxia.local/api) et une autre en ligne (http://api.galaxia-online.com/api). Lorsque j'essaie de me connecter avec un pseudo qui n'existe pas, et que je fais la requête à l'API en local, j'ai bien ce à quoi je m'attends :

Tout va bien

Par contre, lorsque je fais la même requête, en changeant dans mon code l'adresse de l'API pour mettre l'API distance, rien ne va plus ! Je reçois bien une erreur 400, mais d'une part il n'y a rien dans le corps de la requête (alors qu'il devrait y avoir le message d'erreur), et d'autre part Firefox m'indique que la requête a été bloquée à cause de la politique CORS :

Rien ne va plus

Vous allez me dire, active CORS ! Alors oui, sauf que quand je teste la requête à l'aide d'un add-on dédié pour Firefox (RESTClient), tout marche parfaitement !

En fait, si, ça va

Je suis donc vraiment perplexe par rapport à ce problème, je manque peut-être quelque chose. Si vous avez une idée d'où ça pourrait venir, je me ferai un plaisir de tester ! :) Merci d'avance.

Vous allez me dire, active CORS ! Alors oui, sauf que quand je teste la requête à l'aide d'un add-on dédié pour Firefox (RESTClient), tout marche parfaitement !

C'est normal, c'est une extension. Elle peut demander lors de l'installation des permissions supplémentaires et du coup le navigateur considère qu'elle a le droit de faire des requêtes cross-origin, et que c'est "safe". Ta page par contre, il n'en sait rien.

Et qui plus est elle n'a pas vraiment "d'origine", le CORS c'est une page web sur un domaine qui fait des requêtes sur un autre domaine. Une extension n'est pas exécutée depuis un domaine particulier. Tu pourrais te connecter à ton service via CURL ou un client lourd (lib python, java, …), ça fonctionnerait aussi.

Donc oui, c'est un problème de CORS. Positionne le bon header dans la réponse HTTP (access-control-allow-origin) et tout ira bien.

Le serveur vérifie la requête et renvoie soit un code 400 si la connexion a échouée, avec comme données de la réponse un message d'erreur ("This user does not exist." par exemple).

Très mauvais design.

400 cela signifie que l'utilisateur a envoyé une requête que le serveur ne comprend pas, ne peut pas traiter.

Exemple, quelqu'un essaie de logger sans fournir de login. Là tu pourrais renvoyer une 400. Dans le cas d'un login qui échoue, on renverra une 401. Dans le cas que tu décris, on pourrait presque renvoyer une 404 (utilisateur n'existe pas, utilisateur non trouvé). Mais on préfèrera toujours donner le moins d'info possible pour éviter de faciliter des attaques passablement débiles (je teste tous les logins possibles jusqu'à ce que tu me dises que l'utilisateur existe mais que ce n'est pas le bon mot de passe, là, déjà j'ai l'info que ce login existe, je vais pouvoir possiblement faire des choses avec).

Bref : 401 "invalid username or password" je pense pas que y'ait à chercher plus loin que ça.

+0 -0

Salut Javier,

Merci de ta réponse. Je n'ai pas encore eu le temps de regarder mais je comprends mieux pourquoi c'est un problème de CORS et pourquoi mon analyse était mauvaise. Je vais regarder ça de plus près.

Merci aussi pour tes conseils de design de l'API, c'est la première fois que je fais ça donc ça m'aide beaucoup. Je le modifierai dans les jours qui viennent.

Merci encore ;)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte