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é. 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 des 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 la Cookie
en-tête de la place de la 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é?
- J'ai couvert qui est exactement la question ici: stackoverflow.com/questions/1296421/rest-complex-applications/...
- Ajouter à cela, si vous êtes seulement en utilisant la session d'authentification, alors pourquoi ne pas utiliser les en-têtes? Si non, et que vous utilisez la session pour les autres de l'état de la conversation, alors que c'est violer les Apatrides contrainte de REPOS.
- Merci. Il semble que vous parlez de la sessions pour stocker temporairement les données transmises par les internautes, alors que dans mon cas, je suis juste en train de parler d'eux comme un détail de l'implémentation de l'authentification. Cela peut-il être où le désaccord vient d'où?
- Hartung: pas de différence significative du protocole de point de vue. Filtre doit également être conservé sur le côté serveur et le filtre code doit être toujours transmis. 100% le même que pour les séances.
- Mon seul point est que si vous allez utiliser un en-tête pour représenter un jeton d'authentification, HTTP fournit un au-delà d'un générique de cookie. Alors, pourquoi ne pas l'utiliser et de conserver la gratuit de la sémantique que vous obtenez avec elle (quelqu'un de voir la charge utile peut voir qu'il y a un jeton d'authentification, est attribué à).
- Il ne suffit pas de protocole, c'est à propos de la sémantique aussi.
- Donc, tout le débat est simplement un problème de syntaxe? 🙂 Si le
Authorization
en-tête se sont comportés exactement le même comme un cookie de session, il serait parfaitement Paisibles? Je suis d'accord que les témoins se sentent un peu "sale", mais il n'y a pas de différence technique. - Hartung: toujours pas de voir la différence. Vous avez donné le nom différent à la même technique. Nous pouvons le nom de ce filtre, mais c'est encore une session.
- Certes, mais alors pourquoi ne pas faire vos propres en-têtes, ou de détourner certains autres d'en-tête pour le jeton d'authentification. Utiliser le X-XYZZY en-tête. C'est juste la syntaxe de droit? Les en-têtes de transmettre de l'information. L'en-tête d'Autorisation est plus de "l'auto-documentation" que votre cookie est, parce que "tout le monde" savoir ce que l'en-tête d'Authentification est pour. Si ils voient juste JSESSIONID (ou autre), ils ne peuvent pas faire toutes les hypothèses, ou pire, de faire le mauvais hypothèses (quoi d'autre est-il stocker dans la session, quoi d'autre est-ce utilisé pour, etc.). Avez-vous le nom de vos variables dans votre code Aq12hsg? Non, bien sûr que non. La même chose s'applique ici.
- Non, c'est un Filtre. Un Filtre a différentes sémantiques qu'une Session. Cycle de vie différent, les différents flux de travail, des objectifs différents.
- Hartung: ne Peut pas avoir l'idée alors :-S à Partir de votre post, je l'ai trouvé tout à fait similaire.
- Cette opinion basée question est une violation des règles. Beaucoup de bonnes questions générer un certain degré d'opinion basée sur les experts de l'expérience, mais les réponses à cette question ont tendance à être presque entièrement basé sur des opinions, plutôt que des faits, des références, ou des compétences spécifiques. Si cette question peut être reformulé de manière à adapter les règles dans le centre d'aide, veuillez modifier la question.
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, définissons quelques termes:
Reposante:
selon wikipédia.
apatrides contrainte:
selon la Fielding thèse.
Donc côté serveur séances de violer les apatrides contrainte de REPOS, et ainsi de Repos soit.
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 au sujet de pourquoi il pense que les cookies HTTP sont mauvais.
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:
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:
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 a besoin.
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 la Les contraintes section de la 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 pourquoi.
WWW-Authenticate
pour qui? Prendre Amazonie comme une source d'inspiration de la ressource: docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html, ils ont définiAWS
côté deDigest
etBasic
. Le navigateur ne sait probablement pas comment gérerAWS
authentifications, de sorte qu'il ne sera pas afficher la fenêtre de connexion, si vous ne voulez pas le navigateur pour l'afficher et, par conséquent, décidé de ne pas utiliser cet en-tête.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'alimentation
Www-Authenticate
à un client, que HTTP spécifications de besoin 🙂 ). Il convient également de noter queSet-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 queAuthorization
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:
GET /a
sans cookiePOST /auth
Set-Cookie
GET /a
avec cookie. Mais neGET /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.
Authorization: Basic
ouDigest
. Si vous voulez faire quelque chose de plus avancé que sur la base de la digérer auth (et vous devriez), dans un contexte du navigateur, puis vous allez avoir besoin d'autre chose que de laAuthorization
en-tête.Authorization
en-tête, même dans un contexte du navigateur.GET /a
sans un cookie, un cookie sont clairement deux différentes demandes, et il est acceptable pour eux de se comporter différemment.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
"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 n'a vraiment rien à voir avec le REPOS à tous. Donc, en ce qui concerne les apatrides, nous parlons de l'application des données uniquement.
Par exemple, que 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.
HTTP transaction, authentification d'accès de base, n'est pas adapté pour RBAC, parce que l'authentification d'accès de base utilise le cryptage nom d'utilisateur:mot de passe à chaque fois d'identifier, de tout ce qui est nécessaire dans RBAC est le Rôle de l'utilisateur veut utiliser pour un appel spécifique.
RBAC ne pas valider les autorisations sur le nom d'utilisateur, mais sur des rôles.
Vous pourriez tric autour de concaténer comme ceci: usernameRole:mot de passe, mais c'est une mauvaise pratique, et il est également inefficace parce que lorsqu'un utilisateur a plusieurs rôles, l'authentification moteur aurait besoin de tester tous les rôles dans la concaténation, et que chaque appel de nouveau. Ce serait détruire l'un des plus grands avantages techniques de RBAC, à savoir très rapidement une autorisation d'essai.
De sorte que le problème ne peut être résolu à l'aide authentification d'accès de base.
Pour résoudre ce problème, à la session de maintenance est nécessaire, et qui semble, selon certaines réponses, en contradiction avec le RESTE.
C'est ce que j'aime au sujet de la réponse que le REPOS ne doit pas être considéré comme une religion. Dans un complexe d'affaires des cas, dans les soins de santé, par exemple, RBAC est absolument commun et nécessaire. Et il serait dommage qu'ils ne seraient pas autorisés à utiliser REPOSER, parce que tout le RESTE-les outils de concepteurs auraient traiter RESTE comme une religion.
Pour moi il n'y a pas beaucoup de façons de maintenir une session HTTP. On peut utiliser des cookies, avec un id de session, ou un en-tête avec un id de session.
Si quelqu'un a une autre idée je serai heureux de l'entendre.