Avis de non-responsabilité: je suis nouveau dans l'école de pensée REST et j'essaie de comprendre.
Donc, je lis cette page, Erreurs courantes de REST , et j'ai trouvé que je suis complètement déconcerté par la section sur les sessions qui n'est pas pertinente. Voici ce que dit la page:
Il ne devrait pas être nécessaire pour un client de «se connecter» ou de «démarrer une connexion». L'authentification HTTP est effectuée automatiquement sur chaque message. Les applications clientes consomment des ressources et non des services. Il n'y a donc rien à quoi se connecter! Disons que vous réservez un vol sur un service Web REST. Vous ne créez pas de nouvelle connexion «session» avec le service. Vous demandez plutôt à "l'objet créateur d'itinéraire" de vous créer un nouvel itinéraire. Vous pouvez commencer à remplir les vides, mais ensuite obtenir un composant totalement différent ailleurs sur le Web pour remplir d'autres vides. Il n'y a pas de session donc il n'y a pas de problème de migration de l'état de session entre les clients. Il n'y a pas non plus de problème d '"affinité de session"
D'accord, j'obtiens que l'authentification HTTP se fait automatiquement sur chaque message - mais comment? Le nom d'utilisateur / mot de passe est-il envoyé avec chaque demande? Cela n'augmente-t-il pas simplement la surface d'attaque? J'ai l'impression de manquer une partie du puzzle.
Serait-il mauvais d'avoir un service REST, par exemple, /session
qui accepte une demande GET, où vous passeriez un nom d'utilisateur / mot de passe dans le cadre de la demande, et renvoie un jeton de session si l'authentification a réussi, cela pourrait être alors transmis avec les demandes ultérieures? Est-ce que cela a du sens du point de vue REST, ou est-ce que cela manque le point?
Réponses:
Pour être RESTful, chaque requête HTTP doit transporter suffisamment d'informations par elle-même pour que son destinataire puisse la traiter pour être en parfaite harmonie avec la nature sans état de HTTP.
Oui, le nom d'utilisateur et le mot de passe sont envoyés à chaque demande. Les méthodes courantes pour ce faire sont l'authentification d'accès de base et l' authentification d'accès Digest . Et oui, un espion peut capturer les informations d'identification de l'utilisateur. On crypterait ainsi toutes les données envoyées et reçues en utilisant Transport Layer Security (TLS) .
Ce ne serait pas RESTful car il porte un état, mais c'est cependant assez courant car c'est pratique pour les utilisateurs; un utilisateur n'a pas à se connecter à chaque fois.
Ce que vous décrivez dans un "jeton de session" est généralement appelé cookie de connexion . Par exemple, si vous essayez de vous connecter à votre compte Yahoo! compte il y a une case à cocher qui dit "me garder connecté pendant 2 semaines". C'est essentiellement dire (dans vos mots) "garder mon jeton de session en vie pendant 2 semaines si je me connecte avec succès." Les navigateurs Web enverront de tels cookies de connexion (et éventuellement d'autres) à chaque requête HTTP que vous leur demandez de faire pour vous.
la source
Il n'est pas rare qu'un service REST exige une authentification pour chaque requête HTTP. Par exemple, Amazon S3 exige que chaque demande ait une signature dérivée des informations d'identification de l'utilisateur, de la demande exacte à effectuer et de l'heure actuelle. Cette signature est facile à calculer côté client, peut être rapidement vérifiée par le serveur, et est d'une utilité limitée pour un attaquant qui l'intercepte (puisqu'elle est basée sur l'heure actuelle).
la source
Beaucoup de gens ne comprennent pas très clairement les principes de REST, utiliser un jeton de session ne signifie pas toujours que vous êtes avec état, la raison d'envoyer un nom d'utilisateur / mot de passe à chaque demande est uniquement pour l'authentification et la même chose pour l'envoi d'un jeton (généré par connexion process) juste pour décider si le client a l'autorisation de demander des données ou non, vous ne violez les convétions REST que lorsque vous utilisez soit un nom d'utilisateur / mot de passe ou des jetons de session pour décider quelles données afficher! au lieu de cela, vous devez les utiliser uniquement pour une authentification (pour afficher ou ne pas afficher les données)
dans votre cas, je dis OUI, c'est RESTy, mais essayez d'éviter d'utiliser des sessions PHP natives dans votre API REST et commencez à générer vos propres jetons hachés qui expirent dans un laps de temps déterminé!
la source
Non, ça ne manque pas le point. ClientLogin de Google fonctionne exactement de cette manière, à l'exception notable du fait que le client est invité à accéder à la "/ session" en utilisant une réponse HTTP 401. Mais cela ne crée pas de session, cela crée uniquement un moyen pour les clients de s'authentifier (temporairement) sans passer les informations d'identification en clair, et pour le serveur de contrôler la validité de ces informations d'identification temporaires comme il l'entend.
la source
"Autorisation:" En-tête HTTP envoyé par le client. Soit de base (texte brut) ou de résumé.
L'idée de la session est de faire stateful applications utilisant le protocole sans état (HTTP) et le client muet (navigateur Web), en maintenant l'état du côté du serveur. L'un des principes REST est "Chaque ressource est adressable de manière unique à l'aide d'une syntaxe universelle à utiliser dans les liens hypermédia" . Les variables de session ne sont pas accessibles via l'URI. Une application vraiment RESTful maintiendrait l'état du côté du client, en envoyant toutes les variables nécessaires via HTTP, de préférence dans l'URI.
Exemple: recherche avec pagination. Vous auriez une URL sous forme
Cela a beaucoup en commun avec les URL pouvant être ajoutées aux favoris
la source
Je pense que votre suggestion est correcte, si vous souhaitez contrôler la durée de vie de la session client. Je pense que l'architecture RESTful vous encourage à développer des applications sans état. Comme @ 2pence l'a écrit "chaque requête HTTP doit transporter suffisamment d'informations par elle-même pour que son destinataire puisse la traiter pour être en parfaite harmonie avec la nature sans état de HTTP" .
Cependant, ce n'est pas toujours le cas, parfois l'application a besoin de dire quand le client se connecte ou se déconnecte et de maintenir des ressources telles que des verrous ou des licences en fonction de ces informations. Voir ma question de suivi pour un exemple d'un tel cas.
la source