159 votes

Pouvez-vous m'aider à comprendre cela? "Commune RESTE des Erreurs: les Sessions sont hors de propos"

Avertissement: je suis nouveau sur le RESTE de l'école de la pensée, et je suis en train d'envelopper mon esprit autour de lui.

Donc, je suis en train de lire cette page, Commune RESTE des Erreurs, et j'ai constaté que je suis complètement déconcerté par la section sur les sessions étant sans pertinence. C'est ce que la page me dit:

Il devrait y avoir aucun besoin pour un client "login" ou "démarrer une connexion." L'authentification HTTP est fait automatiquement à chaque message. Client les applications sont des consommateurs de des ressources, et non les services. Donc il n'y a rien pour vous connecter à! Nous allons dire que la réservation d'un vol sur un Service web REST. Vous ne créez pas un nouvelle "session" connexion à l' service. Plutôt vous demander de l'itinéraire créateur de l'objet" pour vous créer un nouveau l'itinéraire. Vous pouvez commencer à remplir les blancs, mais puis obtenir une totalement les différents composants d'ailleurs sur le web remplir certaines autres blancs. 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 ya aussi pas de question de "l'affinité de session" dans le serveur (s'il y a encore de la charge questions d'équilibrage pour continuer).

Ok, je que HTTP authentification se fait automatiquement à chaque message, mais comment? Est le nom d'utilisateur/mot de passe envoyé avec chaque demande? N'est-ce pas simplement augmenter la surface d'attaque? Je me sens comme je suis partie manquante du puzzle.

Serait-il mauvais d'avoir un service REST, disons, /session, qui accepte une requête GET, où vous seriez de passage à un nom d'utilisateur/mot de passe dans le cadre de la requête et retourne un jeton de session si l'authentification a réussi, qui puisse ensuite être transmis en même temps que les demandes ultérieures? Cela fait sens d'un point de vue, ou n'est-ce pas?

79voto

z8000 Points 2147

Pour être paisible, chaque requête HTTP devraient porter assez d'informations par lui-même pour son destinataire puisse la traiter afin d'être en complète harmonie avec les apatrides de la nature de HTTP.

Ok, je reçois ce que l'authentification HTTP est fait automatiquement à chaque message - mais comment?

Oui, le nom d'utilisateur et le mot de passe est envoyé avec chaque demande. Les méthodes courantes de le faire sont authentification d'accès de base et digest authentification d'accès. Et oui, une personne peut capturer les identifiants de l'utilisateur. On pourrait donc crypter toutes les données envoyées et reçues à l'aide de TLS (Transport Layer Security).

Serait-il mauvais d'avoir un REPOS service de, disons, /session, qui accepte un Demande d'OBTENIR où vous seriez de passage à 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, qui pourrait alors être transmis en même temps que les demandes ultérieures? Est-ce que les du sens d'un point de vue, ou est que manque le point?

Ce ne serait pas Reposante car elle se charge de l'état, mais il est cependant tout à fait courants, car c'est une commodité pour les utilisateurs, qu'un utilisateur n'a pas à vous connecter à chaque fois.

Ce que vous décrivez dans un "jeton de session" est communément appelé un cookie de connexion. Par exemple, si vous essayez de vous connecter à votre compte Yahoo! compte il y a une case "rester connecté pendant 2 semaines". C'est essentiellement en disant (dans vos propres mots) "garder ma session jeton vivant pour 2 semaines si je me connecte avec succès." Des navigateurs Web envoyer ces témoins de connexion (et probablement d'autres) avec chaque requête HTTP que vous lui demandez de faire pour vous.

33voto

Greg Hewgill Points 356191

Il n'est pas rare pour un service REST pour exiger l'authentification pour chaque requête HTTP. Par exemple, Amazon S3 exige que chaque demande d'avoir une signature qui est dérivée à partir de l'identification de l'utilisateur, la demande exacte à effectuer, et à l'heure actuelle. Cette signature est facile à calculer sur le côté client, peuvent être rapidement vérifiée par le serveur, et est d'un usage limité à un attaquant qui intercepte (puisqu'il est basé sur l'heure actuelle).

10voto

EvilThinker Points 96

Beaucoup de gens ne comprennent pas RESTE principales très clairement, à l'aide d'un jeton de session ne signifie pas toujours que vous êtes dynamique, la raison pour envoyer le nom d'utilisateur/mot de passe avec chaque demande est uniquement à des fins d'authentification et de même pour l'envoi d'un jeton (généré par le processus d'ouverture de session) pour décider si le client dispose de l'autorisation de demander des données ou pas, vous ne violent RESTE convetions lorsque vous utilisez oblige à choisir entre lumière nom d'utilisateur/mot de passe ou les jetons de session de décider quelles sont les données à afficher ! au lieu de cela vous avez à les utiliser uniquement pour athentication (pour afficher des données ou de ne pas afficher les données)

dans votre cas, je dis OUI c'est RESTy, mais essayez d'éviter l'utilisation des sessions natives de php dans votre API REST et commencer à générer vos propres haché jetons qui expirent en période déterminée de temps!

8voto

mogsie Points 1998

Non, ce n'est pas manquer le point. Google ClientLogin fonctionne exactement de cette façon, à l'exception notable que le client est invité à aller à l' "/session" à l'aide de HTTP 401 réponse. Mais cela ne veut pas créer une session, il crée seulement un moyen pour les clients (temporairement) de s'authentifier sans transmettre les informations de connexion en clair, et pour le serveur de contrôle de la validité de ces informations d'identification temporaires comme il l'entend.

5voto

vartec Points 53382

Ok, je reçois ce que l'authentification HTTP est fait automatiquement à chaque message - mais comment?

"L'autorisation:" en-tête HTTP d'envoyer par le client. De base (texte brut) ou à digérer.

Serait-il mauvais d'avoir un REPOS service de, disons, /session, qui accepte un Demande d'OBTENIR où vous seriez de passage à 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, qui pourrait alors être transmis en même temps que les demandes ultérieures? Est-ce que les du sens d'un point de vue, ou est que manque le point?

L'idée de la session est de faire de la dynamique des applications à l'aide apatrides (protocole HTTP) et muets client (navigateur web), par le maintien de l'état côté serveur. L'une des RESTE principes est "Chaque ressource est particulièrement adressable en utilisant une syntaxe universelle pour une utilisation dans les liens hypermédia". Les variables de Session sont quelque chose qui ne peut être consulté via l'URI. Vraiment Reposante application permettrait de maintenir l'état sur le client, l'envoi de toutes les variables sur par HTTP, de préférence dans l'URI.

Exemple: recherche de la pagination. Vous avez de l'URL dans le formulaire

http://server/search/urlencoded-search-terms/page_num

Il a beaucoup en commun avec bookmarkable Url

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X