La façon de gérer l'authentification dans une architecture client-serveur RESTful est un sujet de débat.
En général, cela peut être réalisé, dans le monde de la SOA sur HTTP, via :
- Authentification de base HTTP sur HTTPS ;
- Cookies et gestion des sessions ;
- Jeton dans les en-têtes HTTP (ex. OAuth 2.0 + JWT) ;
- Authentification des requêtes avec des paramètres de signature supplémentaires.
Vous devrez adapter, ou mieux encore mélanger ces techniques, pour qu'elles correspondent au mieux à votre architecture logicielle.
Chaque schéma d'authentification a ses avantages et ses inconvénients, en fonction de l'objectif de votre politique de sécurité et de votre architecture logicielle.
Authentification de base HTTP sur HTTPS
Cette première solution, basée sur le protocole standard HTTPS, est utilisée par la plupart des services web.
GET /spec.html HTTP/1.1
Host: www.example.org
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Elle est facile à mettre en œuvre, disponible par défaut sur tous les navigateurs, mais présente quelques inconvénients connus, comme l'affreuse fenêtre d'authentification affichée sur le navigateur, qui persistera (il n'y a pas de fonction de type déconnexion ici), une certaine consommation supplémentaire de CPU côté serveur, et le fait que le nom d'utilisateur et le mot de passe sont transmis (par HTTPS) au serveur (il devrait être plus sûr de laisser le mot de passe uniquement du côté client, lors de la saisie au clavier, et d'être stocké sous forme de hachage sécurisé sur le serveur).
Nous pouvons utiliser Authentification Digest mais il faut également utiliser le protocole HTTPS, car il est vulnérable à l'infection par le VIH. MiM o Replay et est spécifique à HTTP.
Session via les cookies
Pour être honnête, une session gérée sur le serveur n'est pas vraiment apatride.
Une possibilité serait de conserver toutes les données dans le contenu du cookie. Et, par conception, le cookie est géré du côté du serveur (le client, en fait, n'essaie même pas d'interpréter ces données de cookie : il se contente de les renvoyer au serveur à chaque demande successive). Mais ces données de cookie sont des données d'état d'application, et c'est donc le client qui doit les gérer, et non le serveur, dans un monde purement Stateless.
GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: theme=light; sessionToken=abc123
La technique des cookies est elle-même liée au protocole HTTP, ce qui n'est pas vraiment RESTful, qui devrait être indépendant du protocole, à mon avis. Elle est vulnérable à MiM o Replay attaques.
Accordé via Token (OAuth2)
Une autre solution consiste à placer un jeton dans les en-têtes HTTP afin que la demande soit authentifiée. C'est ce que fait OAuth 2.0 le fait, par exemple. Voir la RFC 6749 :
GET /resource/1 HTTP/1.1
Host: example.com
Authorization: Bearer mF_9.B5f-4.1JqM
En bref, il est très similaire à un cookie et souffre des mêmes problèmes : il n'est pas apatride, repose sur les détails de la transmission HTTP et est sujet à beaucoup de failles de sécurité - y compris MiM et Replay - et ne doit donc être utilisé que via HTTPS. En règle générale, un JWT est utilisé comme un jeton.
Authentification des requêtes
L'authentification des requêtes consiste à signer chaque requête RESTful via certains paramètres supplémentaires sur l'URI. Voir cet article de référence .
Il a été défini comme tel dans cet article :
Toutes les requêtes REST doivent être authentifiées par la signature des paramètres de la requête triés en minuscules, par ordre alphabétique, en utilisant le justificatif d'identité privé comme jeton de signature. La signature doit avoir lieu avant le codage URL de la de la requête.
Cette technique est peut-être la plus compatible avec une architecture sans état, et peut également être mise en œuvre avec une gestion légère des sessions (en utilisant des sessions en mémoire au lieu de la persistance de la base de données).
Par exemple, voici un exemple d'URI générique provenant du lien ci-dessus :
GET /object?apiKey=Qwerty2010
doit être transmis comme tel :
GET /object?timestamp=1261496500&apiKey=Qwerty2010&signature=abcdef0123456789
La chaîne de caractères à signer est /object?apikey=Qwerty2010×tamp=1261496500
et la signature est le hachage SHA256 de cette chaîne en utilisant le composant privé de la clé API.
La mise en cache des données côté serveur peut être toujours disponible. Par exemple, dans notre cadre, nous mettons en cache les réponses au niveau du SQL, et non au niveau de l'URI. L'ajout de ce paramètre supplémentaire ne perturbe donc pas le mécanisme de mise en cache.
Ver cet article pour plus de détails sur l'authentification RESTful dans notre cadre ORM/SOA/MVC client-serveur, basé sur JSON et REST. Comme nous autorisons la communication non seulement via HTTP/1.1, mais aussi via des pipes nommés ou des messages GDI (localement), nous avons essayé d'implémenter un modèle d'authentification véritablement RESTful, et de ne pas dépendre des spécificités HTTP (comme les en-têtes ou les cookies).
Note ultérieure L'ajout d'une signature dans l'URI peut être considéré comme une mauvaise pratique (puisqu'elle apparaîtra par exemple dans les journaux du serveur http) et doit donc être atténué, par exemple par un TTL approprié pour éviter les répétitions. Mais si vos journaux http sont compromis, vous aurez certainement de plus gros problèmes de sécurité.
En pratique, les prochaines Authentification par jetons MAC pour OAuth 2.0 peut constituer une amélioration considérable par rapport au système actuel de "concession par jeton". Mais il s'agit encore d'un travail en cours et il est lié à la transmission HTTP.
Conclusion
Il convient de conclure que REST n'est pas uniquement basé sur HTTP, même si, dans la pratique, il est aussi principalement mis en œuvre sur HTTP. REST peut utiliser d'autres couches de communication. Ainsi, une authentification RESTful n'est pas seulement un synonyme d'authentification HTTP, quoi que réponde Google. Elle devrait même ne pas utiliser du tout le mécanisme HTTP mais être abstraite de la couche de communication. Et si vous utilisez la communication HTTP, grâce à la fonction Initiative Let's Encrypt il n'y a aucune raison de ne pas utiliser le protocole HTTPS, qui est requis en plus de tout système d'authentification.
4 votes
Lorsque je cherche Restful Authentication sur Google, je trouve une douzaine de plugins RoR. Je suppose que ce n'est PAS ce que vous recherchez. Si ce n'est pas RoR, alors quel langage ? Quel serveur web ?
3 votes
Il n'y aura pas d'erreur grave si vous utilisez le protocole HTTPS. La requête HTTP complète ainsi que l'URL seront cryptées.
5 votes
@BharatKhatri : Oui. Je ne transmettrais jamais d'informations sensibles dans l'URL visible par l'utilisateur. Ces informations sont beaucoup plus susceptibles de fuir à des fins pratiques. Le protocole HTTPS ne peut rien contre les fuites accidentelles.
3 votes
@jcoffland : Qu'entendez-vous par authentification RESTful réelle ? Je suis intéressé parce que je viens d'implémenter la troisième méthode de la réponse acceptée, mais je n'en suis pas satisfait (je n'aime pas le paramètre supplémentaire dans l'URL).
5 votes
Certaines personnes utilisent jwt.io/introduction pour résoudre ce Je fais des recherches sur ce sujet en ce moment pour résoudre mon cas : stackoverflow.com/questions/36974163/ >>J'espère que cela fonctionnera correctement.