Sécuriser son API RestFull

Ma 1er API :3

a marqué ce sujet comme résolu.

Bonsoir (les agrumes ? :p )

Actuellement je développe une API pour un projet que je dévoilerai au grand jour une fois fini (comme ça, ça me laisse une marge de manœuvre et ça évite les commentaires désobligeant ^^), sauf qu'un problème se pose : la communication des accréditations (token et/ou mot de passe).

Je m'explique, untel utilise son propre client (une application sous Windows) pour communiquer avec l'API, il lui faut donc un token, mais comment savoir si untel ne s'est pas fait récupérer son token et qu'un autre l'utilise ?

Autre question, Mr X utilise l'interface web officiel (qui est juste un client web full HTML/JS), il entre son mot de passe pour que l'application l'authentifie, comment faire pour que ce mot de passe ne soit pas visible en clair ?

Troisième question, actuellement je transmet les identifiants via les headers, good or bad idea ? :) Je sais qu'il faut que l'API sois en HTTPS, mais je me doute que cela ne sois pas suffisant ^^ il y a aussi JWT mais qui me semble lourd et qui ne peux être utilisé niveau JS / nodeJS (enfin faiblement pour nodeJS) contrairement à PHP.

Autre solution serait de stocker un token temporaire, mais ça ne résout pas le problème qui, lorsque l'on demande l'accès, on balance le token principal (ça réduit les risques c'est certain).

Je m'en remet donc à vos conseils avisé :) Merci d'avance Dryusdan

+0 -0
  1. Tu ne peux quasiment rien y faire, c'est le problème de untel. Ce que tu peux faire, c'est aider untel à éviter de se faire piquer son mdp, en faisant expirer le token relativement tôt, en t'assurant qu'aucun token ne puisse être réutilisé, etc.

  2. HTTPS évidemment.

  3. Les identifiants ne doivent pas transiter par les headers, ni par des variables GET, ni tout ce que le navigateur pourrait mémoriser. Il est courant de les transmettre par POST sous forme de données.

Merci :) Donc 1 je dois transmettre un token temporaire donc, donc l'utilisateur doit transmettre son token une fois, et pendant x minutes, il peut utiliser un token temporaire ? Donc jwt semble être une bonne idée en fait ^^ même si ça ferme un peu l'API :/

Haaa, tu me mets le doute, je sais pas si je code une API REST (mais c'est pas du RESTFull si tu prend le format Json, sinon tu demande à mon API de l'html :p ) U.U, je crois mais je suis pas sur ^^'

Par contre la, j'ai un "soucis" ^^ Si je veux faire un get d'une ressource, je peux pas envoyer un post le token temporaire… Comment je suis censé faire ? ^^' Merci :)

[EDIT] je dois utiliser les headers pour le token ^^

+0 -0

Je pense qu'il est possible de faire circuler le token par l'url (variables GET), même si ce n'est peut-être pas forcément recommandé, c'est beaucoup moins problématique que de transmettre le mdp par ce biais (vu que le token va expirer au bout d'un moment, le risque de vol de session est bien plus faible, mais il existe néanmoins). Tu peux aussi employer un cookie.

Après, je ne suis pas expert en la matière, il vaudrait mieux avoir un avis plus qualifié sur ces questions.

Pourquoi ne pas utiliser "OAuth2" ? C'est le protocole le plus utilisé dans le cas d'une API disponible par le protocole HTTP et il fait ses preuves (utilisé par Google, Apple, … ). Sur l'api Zeste de savoir, c'est ce qu'on utilise.

Je connais pas le langage côté serveur, mais dans tous les langages respectable, y'à une libraire qui permet l'implémentation de ce protocole.

+0 -0

@Yoch Je dois envoyer le token via un header HTTP "Autorization" utilisant le schéma Bearber (je ne sais pas du tout ce que c'est ^^)

@Hugo Pour plusieurs raisons, la première étant que je ne comprend pas comment ça fonctionne contrairement aux Json web token (c'est juste l'implantation qui est compliqué ^), y a une grosse zone de flou, la deuxième étant que l'installation est très fastidieux (et que c'est la 1er fois que je code une API ^)

Après, j'ai cru lire que OAuth2 n'était pas un standard contrairement à JWT, même s'il est plus utilisé. J'ai tout de même trouvé une librairie JavaScript ;) le seul truc qui coince c'est ça

Authorization header using the Bearer schema

C'est flou car je ne sais pas comment l'implanter en PHP, le Javascript le gère bien :)

+0 -0

Haaa, tu me mets le doute, je sais pas si je code une API REST (mais c'est pas du RESTFull si tu prend le format Json, sinon tu demande à mon API de l'html :p ) U.U, je crois mais je suis pas sur ^^'

Je t'invite à regarder la vidéo que j'ai linké. Mais peu importe ce n'est qu'une question de langage (j'ai juste posté parce que t'as spécifié que c'était ta première et du coup je me suis dit que c'était bon d'en parler).

Pour ce qui est de oauth2 en quoi c'est moins normalisé que JWT ?

[edit] à noter que google utilise quasiment tous les systèmes d'authentication existants pour ses APIs, comprenant ces deux là :-) . Du coup dire « Google l'utilise » comme argument pour oauth… bon… on repassera. Par contre oauth est peut être un chouilla plus simple. Et a peut être d'autres avantages comme l'assurance de la provenance ou des trucs comme ça. J'suis pas assez calé dans les systèmes d'auth pour pouvoir en parler donc n'hésitez pas à vous documenter et même à faire des retours ici :-) .

+0 -0

J'avais lu ça sur un site lambda sans vérifier les dires ;)

EDIT, les JWT permettent aussi le contrôle des provenances et sont compatible OAuth2 apparemment (faut que je fouille pour comprendre comment et à quoi ça sert ^^) J'utilise aussi JWT car il semble moins restrictif qu'OAuth ^^

+0 -0

@Yoch Je dois envoyer le token via un header HTTP "Autorization" utilisant le schéma Bearber (je ne sais pas du tout ce que c'est ^^)

Dans toute requête HTTP, tu as une partie Header qui te permet de spécifier des informations. Une de ces informations est souvent un token.

Par exemple, un client de ton API pourrais utiliser la commande shell suivante pour accéder à une ressource privé: curl -H "Authorization: Bearer 5454d56aadza1221" https://api.github.com/ma_ressource_privé/ Curl est une commande pour envoyer une requête HTTP, -H pour spécifier des informations dans le header, 'Authorization' c'est le nom du paramètre de ta requête et "Bearer 5454d56aadza1221" sa valeur ('5454d56aadza1221' est le token).

Je sais pas si c'est de ça que tu parle, mais voila.

@Hugo Pour plusieurs raisons, la première étant que je ne comprend pas comment ça fonctionne contrairement aux Json web token (c'est juste l'implantation qui est compliqué ), y a une grosse zone de flou, la deuxième étant que l'installation est très fastidieux (et que c'est la > 1er fois que je code une API )

C'était une proposition, je te force pas du tout ;) . Je te donne plusieurs protocoles pour que tu puisse faire un choix. OAuth2 est compliqué, point. Surement bien plus que JWT. OAuth2, même un ingénieur info passe en moyenne une petite semaine avant de comprendre tous les mécanismes. Y'a des livres dans ma bibliothèque, qui font plus un bon paquet de pages sur le sujet. OAuth2 est beaucoup utilisé par les entreprises et est devenu de facto un choix par-défaut du coup, même pour ta culture perso, le connaitre au moins de nom est important.

à toi de faire ton choix en fonction de tes besoins, et de tes envies.

Pour plus tard, quand tu voudras un peu améliorer ton api, regarde du côté des ETag pour faire du cache. J'aurais plein d'autre sujet à te donner à regarder, mais le mieux si tu veux t'inspirer d'une API bien écrite, y'a celle de GitHub. Regarde quels principes, l'équipe de GitHub utilise pour mettre en place leur API et ça te donnera des idées pour améliorer la tienne.

+1 -0

En PHP, curl s'occupe des headers, je savais pas (je croyais que c'était pour passer des informations… Enfin c'est le but, mais je savais pas que ça passait par les headers x) )

Donc le schéma Bearer ? Pourquoi le caler la dedans (oui, je suis perdu x) )

J'ai déjà essayé d'implanter OAuth2 sur des pseudo API, mais je n'ai jamais réussi et comme je comprenais pas comment ça fonctionnais… C'est peut-être un défaut ^^

JWT est plus léger et moins contraignant, tu peux l’appeler de partout :p mais on vire le coté sécurisé d'OAuth (il est plus sécurisé mais il fait tout lui même en fait, alors que JWT on code toute la sécurité) ^^

Merci pour les ETag, ça a l'air intéressant, je pense les mettraes en place dès que j'ai fini mon API :p

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