Frage

Ich entwickle einen neuen experimentellen Web-Applikations-Framework, und ich beschloss RESTful etwas Aufmerksamkeit zu geben. Ich habe auf den Grundlagen nachlesen, und fühle mich wie ich ein ziemlich gutes Verständnis von RESTful als ein Konzept haben.

Ich habe ein System und läuft, bekomme URLs streng zu definieren ‚Substantive‘ im System und nehmen Sie die ‚Verben‘ von dem HTTP-Request-Verfahren. Ich verwende Javascript Ajax fordert Zugriff auf die DELETE zu bieten und PUT Methoden, die HTML-Formulare nicht zur Verfügung stellen kann. (Ich weiß, diese Maßnahmen sind nicht streng RESTful sein erforderlich, aber es erfüllt die "Einheitliche Schnittstelle Anforderung).

Das Problem kommt mit staatenlos-ness und Cachebarkeit mit Authentifizierung. Das Standardmodell für die Benutzerauthentifizierung auf Websites beinhaltet ein „Login“ Authentifizierungsereignis, danach (falls erfolgreich) ein Benutzer „in der Wand“ mit einer persistenten sicheren Sitzung und kann Dinge auf nachfolgende Anforderungen, die nicht authentifizieren Benutzer können nicht sehen und tun. Diese Persistenz der Authentifizierung scheint RESTful-ness zu brechen. Caching und Staatenlosigkeit scheinen gebrochen werden, da der authentifizierte Benutzer wahrscheinlich HTML sehen wird, die verschieden ist von dem, was eine nicht authentifizierte Benutzer für die gleiche Anforderung sehen (zum Beispiel könnte es ein Login-Formular in einer Sidebar für die eingeloggten sein out user).

Mit www authentifizieren Strategien zur Authentifizierung eines Benutzers nur auf den Anforderungen, die eine Authentifizierung erfordern scheint ein Schritt in der richtigen Richtung zu sein, da es nicht das Konzept einer persistenten sicheren Sitzung beteiligt ist. Allerdings gibt es nach wie vor die Frage, wie ein „angemeldet“ Aussehen an den Endverbraucher porträtieren im Einklang mit dem, was wir alle gekommen sind, von Websites zu erwarten.

So in dem aktuellen Denken, was ist der bevorzugte Weg, Authentifizierung und Permissionierung einer Webseite in eine streng RESTful Art und Weise zu handhaben, während es nach wie vor für angemeldete in Dekorationen im HTML-Format?

War es hilfreich?

Lösung

  

Diese Persistenz der Authentifizierung   RESTful-ness zu brechen scheint

Statt einen Benutzer zu authentifizieren, können Sie darüber nachdenken, eine Sitzung zu erstellen. (: OK, 403: 200 Verbote, etc) Sie wird eine neue "Session-ID", zusammen mit dem entsprechenden HTTP-Statuscode zurückgegeben werden.

  

Der Benutzer wird wahrscheinlich HTML sehen, die ist   verschieden ist, das ein   Nicht-authentifizierte Benutzer sieht für   die gleiche Anfrage

Sie werden Ihren REST-Server fragen: „Können Sie mir die HTML-GET (oder jede Ressource) für diese Session ID?“. Der HTML-Code wird auf der Grundlage der „Session-ID“ unterschiedlich sein.

Bei dieser Methode gibt es keine Wand für „persistent sichere Sitzungen“. Sie sind auf einer Sitzung einfach handeln.

Das Substantiv (oder die Ressource) würde das die aktuelle Sitzung darstellen, wenn Sie sich für diese Methode entscheiden.

Andere Tipps

„Das Standardmodell für die Benutzerauthentifizierung auf Websites beinhaltet ein‚Login‘Authentifizierungsereignis, danach (falls erfolgreich) ein Benutzer‚in der Wand‘mit einer persistenten sicheren Sitzung“

  1. Das ist nicht wirklich richtig. Es ist zum Teil richtig, aber nur für Web-Sites, die ihre eigene Authentifizierung erfinden.

  2. Wenn Sie "Digest-Authentifizierung" der Browser die Anmeldeinformationen mit jeder Anforderung senden muss.

Digest-Authentifizierung - Anmeldeinformationen mit jeder Anforderung -. Sind völlig RESTful

Tu das.

Um die Dinge etwas schlanker zu machen, können Sie die Authentifizierung Nonce basierend auf Zeit verdauen berechnen, so dass es für eine gewisse Zeit gut ist (6 Minuten, 0,1 h ist gut). Jeder wenigen Minuten eine Anfrage einen Status-401 senden und erfordern eine erneute Berechnung des Digest.

Eine Option cachability in Vermittlern für Seiten mit benutzerspezifischen Elementen zu erhalten, ist der benutzerspezifischen Auszeichnungs über Ajax hinzuzufügen. Sie dienen alle die gleiche Seite zu nutzen, darunter auch einige JavaScript, die eine XHR-Anforderung an eine Ressource tun, die etwas anderes auf der Grundlage der Benutzeranmeldung zurückgibt. Sie verschmelzen dann diese in die Seite auf der Client-Seite. Der größte Teil der Seite wird dann cachable sein, wie es das gleiche für jeden Benutzer ist.

Eine weitere Möglichkeit ist ESI zu verwenden (Edge Side Includes). Mit diesen kann die Cache selbst unterschiedliche Darstellungen verschmilzt das Endergebnis aufzubauen.

Ich denke darüber wie folgt aus: Die „Substantiv“ in der Benutzerauthentifizierung eine Sitzung. So Ihre Login-Formular verwendet eine POST-Anforderung an „erstellen“ eine neue Sitzung und Abmelden verwendet eine DELETE-Anfrage zu „löschen“ die Sitzung.

Ich weiß, was Sie über die Persistenz der Authentifizierung bedeuten gegen restfulness gehen, aber die Cookies (die die Illusion von Ausdauer geben) sind einfach ein Teil jeder Anfrage.

„Das Beharren der Authentifizierung scheint RESTful-ness zu brechen. Caching und Staatenlosigkeit erscheinen, gebrochen werden, da der authentifizierte Benutzer wahrscheinlich HTML sehen wird, die verschieden ist von dem, was eine nicht authentifizierte Benutzer für die gleiche Anforderung sehen“

Es ist in Ordnung, wenn die Darstellung der Ressource ist etwas anders als auf der Grundlage der Authentifizierungsinformationen. Die Auth Informationen sind Teil der Nachricht und damit die Botschaft ist immer noch „selbsterklärend“. Konzeptionell sind Sie immer noch die gleiche Ressource zugreifen, und das Bearbeiten und Löschen von Links sind Übergänge erlaubt, keine zusätzlichen Datenstücke. Inhalte steuern Übergänge vorhanden sind, basierend auf der Ressource zugreift, scheint gültig zu mir.

Re: Daniel Antwort:

Wenn eine Sitzung ein vorübergehendes Objekt ist, das schnell gelöscht wird, ist dies nicht sehr cachable, wie jeder Cache Sie nur eine Lebensdauer von vielleicht einen Tag schaffen würde, sondern auch weiterhin Platz im Cache sowieso aufbrauchen.

Wäre es nicht besser, die USER als ein Objekt zu erstellen, und authentifizieren, die Digest-Authentifizierung verwendet wird, (oder ein Cookie, wenn Sie müssen). auf diese Weise, jeder Benutzer seinen eigenen persistenten Cache wird anstelle eines Cache, der einen Tag dauert und verschwindet.

Dieses auch logischer macht Sinn für mich, da Sie eine Seite machst anders aussehen, je nach dem USER und die Differenz zwischen dem „angemeldet“ und „(‚Hallo [name]‘und solche Zugabe) abgemeldet "Staaten hängen davon ab, ob der Benutzer in der URL enthalten ist. Ob eine bestimmte Person Zugang zu diesem benutzerspezifischen URL gewährt hängt davon ab, ob sie als dieser Benutzer authentifizieren können.

Wenn Ihr RESTful Rahmen wird nur durch Ihre Web-Anwendung verwendet werden, und nicht als eine API für Dritter verwendet werden, sehe ich keinen Grund, warum Sie nicht das gleiche Authentifizierungsschema wie der Rest Ihrer Anwendung verwenden können. Sie könnten als eine untere Ebene Schicht dieser Authentifizierung denken als die „Anwendung“ -Niveau. Die Anwendungsebene kann noch staatenlos bleibt in einer reinen RESTful Weise.

Natürlich, wenn Sie einen RESTful Web-API erstellen planen, müssen Sie diese mehr Gedanken geben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top