Quelle est la méthode préférée pour l'authentification des utilisateurs d'une page web dans une bonne voie?

StackOverflow https://stackoverflow.com/questions/2010699

Question

Je suis l'élaboration d'un nouveau dispositif expérimental web application framework, et j'ai décidé de donner Reposant un peu d'attention.J'ai lu sur les bases, et se sentir comme j'ai une assez bonne compréhension de la Reposant comme un concept.

J'ai un système en place et en cours d'exécution, à l'aide d'Url strictement dans la définition des "noms" dans le système et de prendre les "verbes" à partir de la requête HTTP méthodes.Je suis à l'aide de javascript ajax appels pour fournir l'accès à la SUPPRIMER et de METTRE des méthodes de formulaires HTML ne peut pas fournir.(Je réalise que ces mesures ne sont pas strictement nécessaires pour être paisible, mais il satisfait à l'Uniforme de l'Interface de l'exigence).

Le problème vient apatrides-ness et cacheability avec authentification.Le modèle de référence pour l'authentification de l'utilisateur sur les sites web implique un "login" authentification de l'événement, après quoi (en cas de succès) l'utilisateur est "à l'intérieur du mur" avec une persistante de la session sécurisée et peut voir et faire des choses sur les demandes des utilisateurs non authentifiés peuvent pas.Cette persistance de l'authentification semble pause Reposante-ness.La mise en cache et l'apatridie semblent être brisé, parce que l'utilisateur authentifié, va probablement voir HTML qui est différente de celle à laquelle un utilisateur non authentifié va voir pour la même demande (par exemple, il pourrait y avoir un formulaire de connexion dans la barre latérale de la session d'utilisateur).

À l'aide de www-authenticate stratégies pour authentifier un utilisateur seulement sur les demandes qui nécessitent une authentification semble être un pas dans la bonne direction, car elle n'implique pas la notion d'une persistance de la session sécurisée.Toutefois, il y a toujours la question de savoir comment faire le portrait d'un "connecté" apparence à l'utilisateur final en accord avec ce que nous avons tous appris à attendre de sites web.

Ainsi, dans le courant de pensée actuel, quelle est la meilleure façon de gérer l'authentification et l'permissioning d'une page web dans un strictement Reposant façon, tout en permettant connecté décorations dans le HTML?

Était-ce utile?

La solution

  

Cette persistance de l'authentification   semble briser RESTful-ness

Au lieu d'authentification d'un utilisateur, vous pouvez penser à créer une session. Vous retournerez une nouvelle "session ID", ainsi que le code d'état HTTP approprié (200: OK, 403: Interdit, etc).

  

L'utilisateur verra probablement HTML qui est   différent de celui qui a   utilisateur non authentifié verra pour   la même demande

Vous poserez votre serveur REST: « Pouvez-vous me faire le HTML (ou toute autre ressource) pour cet ID de session? ». Le code HTML sera différent en fonction de la « session ID ».

Avec cette méthode, il n'y a pas de mur pour « persistants sessions sécurisées ». Vous agissant simplement sur une session.

Le nom (ou la ressource) représenterait la session actuelle, si vous optez pour cette méthode.

Autres conseils

« Le modèle standard pour l'authentification des utilisateurs sur les sites Web implique un « » événement d'authentification, après quoi (en cas de succès) un utilisateur est « connexion à l'intérieur du mur » avec une session sécurisée persistante »

  1. Ce n'est pas vraiment correct. Il est en partie vrai, mais seulement pour les sites Web qui inventent leur propre authentification.

  2. Si vous utilisez "l'authentification digest" le navigateur doit envoyer les informations d'identification à chaque demande.

L'authentification Digest - références à chaque demande -. Est totalement RESTful

faire.

Pour rendre les choses un peu plus simple, vous pouvez calculer l'authentification Digest Nonce en fonction du temps pour que ce soit bon pour un certain temps (6 minutes, 0,1 heure est bon). Tout le monde quelques minutes une demande envoient un statut 401 et exiger recalcul du digestat.

Une option pour préserver cachability en intermédiaires pour les pages avec des éléments spécifiques à l'utilisateur est d'ajouter le balisage spécifique à l'utilisateur via Ajax. Vous servez tous utilisent la même page, y compris certains JavaScript qui fera une demande de XHR à une ressource qui renvoie quelque chose de différent en fonction de la connexion de l'utilisateur. Vous fusionnez alors cela dans la page du côté client. La majeure partie de la page sera alors cachable comme il est le même pour tous les utilisateurs.

Une autre option consiste à utiliser ESI (Edge Side Includes). Avec ceux-ci, le cache lui-même peut fusionner différentes représentations pour construire le résultat final.

J'ai penser comme ceci:Le "nom" dans l'authentification de l'utilisateur est une session.Si votre formulaire de connexion utilise une requête POST à "créer" une nouvelle session, et la déconnexion utilise une demande de SUPPRESSION de "supprimer" la session.

Je sais ce que vous entendez à propos de la persistance de l'authentification aller à l'encontre de la Détente, mais les cookies (ce qui donne l'illusion de persistance) sont simplement une partie de chaque demande.

« Cette persistance de l'authentification semble briser RESTful-ness. Mise en cache et apatridie semblent brisés, parce que l'utilisateur authentifié sera probablement voir HTML qui est différente de celle d'un utilisateur non authentifié verra pour la même demande »

Il est ok si la représentation de la ressource est légèrement différente basée sur les informations d'authentification. Les informations auth fait partie du message et donc le message est encore « auto-descriptif ». Conceptuellement vous accédez toujours la même ressource, et la modifier et supprimer les liens sont autorisés transitions, pas des morceaux de données supplémentaires. Le contrôle de ce que les transitions sont disponibles en fonction de qui accède à la ressource me semble valide.

Re: Réponse de Daniel:

Si une session est un objet transitoire qui devient rapidement supprimé, ce n'est pas très cachable, comme tout cache vous créer serait seulement une durée de vie utile peut-être un jour, mais aussi continuer à utiliser l'espace dans le cache de toute façon.

Ne serait-il préférable de créer l'utilisateur comme un objet, et l'authentification en utilisant l'authentification Digest, (ou un cookie si vous devez). De cette façon, chaque utilisateur reçoit son propre cache au lieu d'une persistante cache qui dure un jour et disparaît.

Cela rend également le sens plus logique pour moi, puisque vous faites une page se voient différemment selon l'utilisateur, (en ajoutant « bonjour [nom] » et autres) et la différence entre le « connecté » et « déconnecté "états dépend si l'utilisateur est inclus dans l'URL. Que ce soit une personne en particulier a accès à cette URL spécifique de l'utilisateur dépend si elles peuvent authentifier en tant que utilisateur.

Si votre cadre RESTful ne va être utilisé par votre application web, et ne sera pas utilisé comme une API pour des tiers, je ne vois aucune raison pour laquelle vous ne pouvez pas utiliser le même schéma d'authentification que le reste de votre application. Vous pourriez penser à cette authentification en tant que couche de niveau inférieur au niveau « d'application ». Le niveau d'application peut encore rester sans état d'une manière purement RESTful.

Bien sûr, si vous envisagez de créer une API Web RESTful, vous devez donner à cette pensée plus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top