539 votes

Faire des séances de vraiment violent de la Détente?

Est l'aide de sessions dans une API RESTful vraiment violation de la Détente? J'ai vu beaucoup d'avis allant à l'une ou l'autre direction, mais je ne suis pas convaincu que les sessions sont Agités. De mon point de vue:

  • l'authentification n'est pas interdite pour la Détente (sinon il y aurait peu d'utilité dans les services RESTful)
  • l'authentification se fait par l'envoi d'un jeton d'authentification dans la demande, généralement de l'en-tête
  • ce jeton d'authentification doit être obtenue en quelque sorte et peut être révoquée, auquel cas il doit être renouvelé
  • le jeton d'authentification doit être validé par le serveur (sinon il ne serait pas d'authentification)

Alors, comment faire des sessions de violer cette?

  • côté client, les sessions sont réalisées à l'aide de cookies
  • les cookies sont tout simplement un extra-tête HTTP
  • un cookie de session peut être obtenu et révoquée à tout moment
  • les cookies de session peut avoir une durée de vie infinie temps en cas de besoin
  • l'id de session (jeton d'authentification) est validé côté serveur

En tant que tel, pour le client, un cookie de session est exactement le même que tout autre en-tête HTTP de base du mécanisme d'authentification, sauf qu'il utilise l' Cookie - tête au lieu de l' Authorization ou certains autres propriétaires d'en-tête. Si il n'y a pas de session attachés à la valeur du cookie côté serveur, pourquoi cela ferait-il une différence? Du côté serveur, la mise en œuvre n'a pas besoin de préoccupation au client tant que le serveur se comporte Reposant. En tant que tel, les cookies en eux-mêmes ne doivent pas faire une API Agité, et les séances sont simplement des cookies pour le client.

Sont mes hypothèses de mal? Ce qui rend les cookies de session Agité?

346voto

Jared Harding Points 2191

Tout d'abord, le REPOS n'est pas une religion et ne doit pas être abordé comme tel. Bien qu'il existe des avantages pour les services RESTful, vous devez suivre les principes de REPOS aussi loin qu'ils le font sens pour votre application.

Cela dit, l'authentification et le côté client de l'état de ne pas violer le RESTE principes. Tandis que le RESTE exige que les transitions de l'état d'apatride, c'est en se référant au serveur lui-même. Au cœur, de tout de REPOS est sur les documents. L'idée derrière l'apatridie est que le SERVEUR est apatride, pas les clients. Tout client de la délivrance d'une demande identique (même les en-têtes, les cookies, les adresses URI, etc) doivent être prises à la même place dans l'application. Si le site web stocké à l'emplacement actuel de l'utilisateur et la navigation gérée par une mise à jour côté serveur de navigation variable, puis le RESTE serait violé. Un autre client à l'identique les informations de la demande serait pris à un emplacement différent en fonction du côté serveur de l'état.

Google services web sont un exemple fantastique d'un système Reposant. Ils ont besoin d'un en-tête d'authentification avec l'authentification de l'utilisateur de la clé pour être passé sur chaque demande. Cela ne violent RESTE principes légèrement, parce que le serveur est suivi de l'état de la clé d'authentification. L'état de cette clé doit être maintenu et il a une sorte de date d'échéance/durée au bout de laquelle il n'accorde plus d'accès. Cependant, comme je l'ai déjà mentionné au début de mon post, des sacrifices doivent être faits pour permettre à une application de réalité de travail. Cela dit, les jetons d'authentification doit être stocké dans une manière qui permet à tous les clients possibles à continuer d'accorder l'accès au cours de leur temps. Si un serveur est la gestion de l'état de la clé d'authentification au point qu'un autre serveur d'équilibrage de charge ne peut pas prendre plus de répondre aux demandes fondées sur cette touche, vous avez commencé à vraiment de violer les principes de REPOS. Les services de Google en sorte que, à tout moment, vous pouvez prendre un jeton d'authentification que vous utilisez sur votre téléphone contre équilibrer la charge du serveur et de frapper l'équilibre de la charge du serveur B à partir de votre bureau tout en ayant accès au système et être dirigé vers les mêmes ressources si les demandes étaient identiques.

Ce que tout se résume à ce que vous avez besoin pour vous assurer que vos jetons d'authentification sont validées par rapport à un magasin de sauvegarde d'une certaine sorte (base de données, le cache, peu importe) pour vous assurer que vous préserver comme bien d'autres propriétés que possible.

J'espère que tout cela fait sens. Vous devriez également vérifier les Contraintes section de l'article de wikipédia sur Representational State Transfer si vous ne l'avez pas déjà. Il est particulièrement éclairante quant à ce que les principes de REPOS sont en fait discuter le pour et le pourquoi.

330voto

inf3rno Points 2989

Le poing de définir quelques termes:

  • Reposant:

    On peut caractériser les applications conformes pour le RESTE les contraintes décrit dans cette section comme "RESTful".[15] Si un service de viole de la nécessaire les contraintes, il ne peut pas être considéré comme Reposant.

    selon wikipedia.

  • apatrides contrainte:

    Nous avons ensuite ajouter une contrainte à l'interaction client-serveur: la communication doit être apatrides dans la nature, comme dans le client-apatride-serveur (CSS) le style de la Section 3.4.3 (Figure 5-3), de telle sorte que chaque demande du client vers le serveur doit contenir tous les informations nécessaires à la compréhension de la demande, et ne peut pas prendre avantage de toute stockées contexte sur le serveur. L'état de Session est donc gardé entièrement sur le client.

    selon la mise en service de la dissertation.

Donc côté serveur séances de violer les apatrides contrainte de REPOS, et donc de la Détente.

En tant que tel, pour le client, un cookie de session est exactement le même que n'importe quel d'autres en-tête HTTP de base du mécanisme d'authentification, sauf qu'il utilise l'en-tête de Cookie au lieu de l'Autorisation ou de certains autres propriétaire d'en-tête.

Par les cookies de session vous stocker l'état du client sur le serveur et si votre demande a un contexte. Nous allons essayer d'ajouter un équilibreur de charge et une autre instance de service de votre système. Dans ce cas, vous devez partager les sessions entre les instances du service. Il est difficile de maintenir et d'étendre un tel système, alors qu'il évolue mal...

À mon avis, il n'y a rien de mal avec les cookies. La technologie des cookies est un mécanisme de stockage dans lequel les données enregistrées est automatiquement associé à cookie en-têtes de chaque demande. Je ne sais pas du RESTE de la contrainte qui a un problème avec ce type de technologie. Donc, il n'y a pas de problème avec la technologie elle-même, le problème est avec son utilisation. Fielding a écrit une sous-section à propos de pourquoi il pense que les cookies HTTP sont mauvais.

De mon point de vue:

  • l'authentification n'est pas interdite pour la Détente (sinon il y aurait peu d'utilité dans les services RESTful)
  • l'authentification se fait par l'envoi d'un jeton d'authentification dans la demande, généralement de l'en-tête
  • ce jeton d'authentification doit être obtenue en quelque sorte et peut être révoquée, auquel cas il doit être renouvelé
  • le jeton d'authentification doit être validé par le serveur (sinon il ne serait pas d'authentification)

Votre point de vue était assez solide. Le seul problème était avec le concept de la création de jeton d'authentification sur le serveur. Vous n'avez pas besoin de cette partie. Ce que vous avez besoin est de stocker le nom d'utilisateur et mot de passe sur le client et l'envoyer avec chaque demande. Vous n'avez pas besoin de plus pour faire ce que HTTP basic auth et d'une connexion chiffrée:

Figure 1. - Stateless authentication by trusted clients

  • Figure 1. - D'apatride, de l'authentification par la confiance des clients

Vous avez probablement besoin d'une mémoire auth cache côté serveur pour rendre les choses plus vite, car vous devez vous authentifier à chaque demande.

Maintenant, cela fonctionne assez bien par la confiance des clients écrit par vous, mais qu'en 3ème partie de la clientèle? Ils ne peuvent pas avoir le nom d'utilisateur et le mot de passe et de toutes les autorisations des utilisateurs. Donc, vous avez à stocker séparément les autorisations que d'un 3ème partie client peut disposer d'un utilisateur spécifique. Si le client les développeurs peuvent s'inscrire ils 3ème partie clients, et obtenir une clé API unique et les utilisateurs peuvent autoriser la 3e partie des clients d'accéder à une partie de leurs autorisations. Comme la lecture, le nom et l'adresse e-mail, ou la liste de leurs amis, etc... Après une 3ème partie client, le serveur va générer un jeton d'accès. Ces jeton d'accès peut être utilisé par la 3ème partie client d'accéder aux autorisations octroyées par l'utilisateur, comme suit:

Figure 2. - Stateless authentication by 3rd party clients

  • Figure 2. - D'apatride, de l'authentification par le 3e partie clients

Donc la 3ème partie, le client peut obtenir le jeton d'accès à partir d'un client de confiance (ou directement auprès de l'utilisateur). Après cela, il peut envoyer une requête valide de la avec la clé API et le jeton d'accès. C'est le plus basique de la 3e partie auth mécanisme. Vous pouvez lire plus sur les détails de mise en œuvre dans la documentation de chaque 3ème partie auth système, par exemple le protocole OAuth. Bien sûr, cela peut être plus complexe et plus sécurisé, par exemple, vous pouvez vous inscrire les détails de chaque demande unique sur le côté serveur et envoyer la signature avec la demande, et ainsi de suite... La solution réelle dépend de votre application.

13voto

starteleport Points 321

Les Cookies ne sont pas pour l'authentification. Pourquoi réinventer la roue? HTTP est bien conçu, les mécanismes d'authentification. Si nous utilisons des cookies, nous tombons dans l'aide de HTTP comme protocole de transport seulement, donc nous avons besoin de créer notre propre système de signalisation, par exemple, pour indiquer aux utilisateurs qu'ils ont fournis mal d'authentification (à l'aide de HTTP 401 serait incorrect que nous n'aurions probablement pas d'approvisionnement en Www-Authenticate pour un client, comme HTTP spécifications de besoin :) ). Il convient également de noter que l' Set-Cookie n'est qu'une recommandation pour le client. Son contenu peut être ou peut ne pas être enregistré (par exemple, si les cookies sont désactivés), tandis que l' Authorization d'en-tête est automatiquement envoyé à chaque requête.

Un autre point est que, pour obtenir une autorisation de cookie, vous aurez probablement besoin de fournir vos informations d'identification, quelque part en premier? Si oui, alors ne serait-il pas Inquiet? Exemple Simple:

  • Vous essayez GET /a sans cookie
  • Vous obtenez une demande d'autorisation en quelque sorte
  • Vous allez autoriser quelque sorte comme POST /auth
  • Vous obtenez Set-Cookie
  • Vous essayez GET /a avec cookie. Mais n' GET /a se comporter idempotently dans ce cas?

Pour résumer cela, je crois que si nous avons accès à certaines ressources et nous avons besoin de s'authentifier, puis nous doit s'authentifier sur la même ressource, pas n'importe où ailleurs.

10voto

user3099108 Points 21

En fait, la Détente ne s'applique qu'aux RESSOURCES, comme indiqué par une Universal Resource identifier. Donc à même de parler de choses comme les en-têtes, les cookies, etc. en ce qui concerne le RESTE n'est pas vraiment approprié. RESTE peut travailler sur n'importe quel protocole, même si elle arrive à être fait de façon systématique sur HTTP.

Le principal déterminant est ceci: si vous envoyez un RESTE d'appel, ce qui est une URI, puis une fois l'appel fait avec succès sur le serveur, est-ce que l'URI de retour le même contenu, dans la mesure où les transitions ont été effectuées (PUT, POST, DELETE)? Ce test permettrait d'exclure les erreurs ou les demandes d'authentification étant retourné, parce que dans ce cas, la demande n'a pas encore fait sur le serveur, ce qui signifie la servlet ou de l'application qui va renvoyer le document correspondant à l'URI.

De même, dans le cas d'un POST ou PUT, pouvez-vous envoyer un URI/charge utile, et peu importe combien de fois vous envoyer le message, il sera toujours mise à jour de la base des mêmes données, de sorte que par la suite, Obtient retournera un résultat cohérent?

RESTE est au sujet de l'application de données, pas sur le faible niveau d'information requis pour obtenir que les données transférées sur.

Dans le blog suivant, Roy Fielding a donné un bon résumé de tout REPOS idée:

http://groups.yahoo.com/neo/groups/rest-discuss/conversations/topics/5841

"Un séjour Reposant système passe d'un état stable à l' ensuite, et ce à l'état d'équilibre est à la fois un potentiel de départ de l'état- et un potentiel de l'état final. I. e., un Réparateur est un système inconnu nombre de composants obéissant à un ensemble de règles simples, tels qu'ils sont toujours soit au REPOS ou au passage d'un Réparateur état à un autre Réparateur de l'état. Chaque état peut être complètement compris par la représentation(s) qu'elle contient et l'ensemble de les transitions qu'il fournit, avec les transitions limitée à un uniforme d'actions pour être compréhensible. Le système peut être un complexe diagramme d'état, mais chaque agent utilisateur ne peut voir que un état à un moment (l'actuel état d'équilibre) et donc chaque l'état est simple et peut être analysées de façon indépendante. Un utilisateur, otoh, que, est en mesure de créer leurs propres transitions à tout moment (par exemple, entrez une URL, sélectionnez un signet, ouvrez un éditeur, etc.)."


Aller à la question de l'authentification, si elle est accomplie par le biais de cookies ou des en-têtes, tant que l'information n'est pas une partie de l'URI et de la POST-charge utile, il a vraiment rien à voir avec le RESTE. Donc, en ce qui concerne les apatrides, nous parlons de l'application des données uniquement.

Par exemple, l'utilisateur entre des données dans un écran graphique, le client est de garder la trace de ce que les champs ont été inscrits, qui n'ont pas, tous les champs obligatoires sont manquants, etc C'est tout ce CONTEXTE CLIENT et ne doivent pas être envoyés ou suivis par le serveur. Ce qui est envoyée au serveur est l'ensemble des champs qui doivent être modifiées dans les ressources (par l'URI), tels qu'une transition se produit de cette ressource à partir d'un Réparateur état à l'autre.

Ainsi, le client conserve la trace de ce que l'utilisateur est en train de faire, et il n'envoie logiquement compléter les transitions de l'état du serveur.

1voto

jcoffland Points 1506

Séances violent clairement de REPOS parce qu'ils stockent l'état du client sur le serveur. Je ne comprends pas pourquoi les devs vont autour de clamaient haut et fort les vertus d'une API RESTful, mais ensuite ne voulez pas suivre la base principale.

http://en.wikipedia.org/wiki/REST#Constraints

Assurer qu'il est parfaitement ok pour la conception d'une API qui n'est surtout Reposante, mais de comprendre la différence et de confesser dans vos documents.

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