webentwicklung-frage-antwort-db.com.de

Können Sie mir helfen, das zu verstehen? "Häufig REST Fehler: Sitzungen sind irrelevant"

Haftungsausschluss: Ich bin neu in der REST Gedankenschule, und ich versuche, mich darum zu kümmern.

Ich lese diese Seite, Common REST Mistakes , und ich habe festgestellt, dass der Abschnitt über irrelevante Sitzungen mich völlig verblüfft Die Seite sagt:

Es sollte nicht erforderlich sein, dass sich ein Client "anmeldet" oder "eine Verbindung herstellt". Die HTTP-Authentifizierung wird automatisch für jede Nachricht durchgeführt. Clientanwendungen sind Konsumenten von Ressourcen, keine Dienste. Daher gibt es nichts zum einloggen! Angenommen, Sie buchen einen Flug über einen REST= Webdienst. Sie erstellen keine neue "Sitzungs" -Verbindung zum Dienst. Sie werden vielmehr vom "Ersteller der Reiseroute" aufgefordert, Sie zu erstellen Sie können beginnen, die Lücken auszufüllen, aber dann eine völlig andere Komponente im Web verwenden, um andere Lücken auszufüllen. Es gibt keine Sitzung, sodass es kein Problem gibt, den Sitzungsstatus zwischen Clients zu migrieren. Es gibt auch kein Problem von "Sitzungsaffinität" auf dem Server (obwohl es noch Lastausgleichsprobleme gibt, um fortzufahren).

Okay, ich habe festgestellt, dass die HTTP-Authentifizierung bei jeder Nachricht automatisch durchgeführt wird - aber wie? Wird der Benutzername/das Passwort bei jeder Anfrage gesendet? Erhöht das nicht einfach die Angriffsfläche? Ich habe das Gefühl, dass mir ein Teil des Puzzles fehlt.

Wäre es schlecht, einen REST Service zu haben, sagen wir, /session, das eine GET-Anfrage akzeptiert, bei der Sie einen Benutzernamen/ein Passwort als Teil der Anfrage übergeben würden, und ein Sitzungstoken zurückgibt, wenn die Authentifizierung erfolgreich war, das dann zusammen mit nachfolgenden Anfragen weitergeleitet werden könnte? Ist das aus Sicht von REST sinnvoll, oder fehlt dem der Punkt?

159
Rob

Um REST-fähig zu sein, sollte jede HTTP-Anforderung für sich genug Informationen enthalten, damit der Empfänger sie so verarbeiten kann, dass sie vollständig mit der statuslosen Natur von HTTP übereinstimmt.

Okay, ich habe festgestellt, dass die HTTP-Authentifizierung bei jeder Nachricht automatisch durchgeführt wird - aber wie?

Ja, der Benutzername und das Passwort werden bei jeder Anfrage gesendet. Die gebräuchlichen Methoden hierfür sind grundlegende Zugriffsauthentifizierung und Digest-Zugriffsauthentifizierung. Und ja, ein Lauscher kann die Anmeldeinformationen des Benutzers erfassen. Man verschlüsselt also alle gesendeten und empfangenen Daten mit Transport Layer Security (TLS).

Wäre es schlecht, einen REST Service zu haben, sagen wir,/session, der eine GET-Anfrage akzeptiert, bei der Sie einen Benutzernamen/ein Passwort als Teil der Anfrage übergeben würden, und eine Sitzung zurückgibt Token, wenn die Authentifizierung erfolgreich war, das dann mit nachfolgenden Anforderungen weitergereicht werden könnte? Ist das aus einer REST Sicht sinnvoll, oder fehlt der Punkt?

Dies wäre nicht RESTful, da es den Status trägt, aber es ist durchaus üblich, da es eine Annehmlichkeit für Benutzer ist; Ein Benutzer muss sich nicht jedes Mal anmelden.

Was Sie in einem "Sitzungstoken" beschreiben, wird allgemein als Login-Cookie bezeichnet. Zum Beispiel, wenn Sie versuchen, sich bei Ihrem Yahoo! Konto gibt es ein Kontrollkästchen mit der Aufschrift "Ich möchte 2 Wochen angemeldet bleiben". Dies bedeutet (in Ihren Worten) im Wesentlichen, dass "mein Sitzungstoken 2 Wochen lang am Leben bleibt, wenn ich mich erfolgreich anmelde." Webbrowser senden solche Anmelde-Cookies (und möglicherweise auch andere) mit jeder HTTP-Anfrage, die Sie für Sie stellen möchten.

79
z8000

Es ist nicht ungewöhnlich, dass ein Dienst REST Authentifizierung für jede HTTP-Anforderung erfordert. Beispielsweise erfordert Amazon S3, dass jede Anforderung eine Signatur hat, die von den Benutzeranmeldeinformationen abgeleitet ist, die genaue Anforderung, die ausgeführt werden muss und die aktuelle Uhrzeit: Diese Signatur ist auf Clientseite einfach zu berechnen, kann vom Server schnell überprüft werden und ist für einen Angreifer, der sie abfängt, von begrenztem Nutzen (da sie auf der aktuellen Uhrzeit basiert).

33
Greg Hewgill

Viele Leute verstehen das Prinzip REST nicht ganz klar. Wenn Sie ein Sitzungstoken verwenden, bedeutet dies nicht, dass Sie immer über den aktuellen Status informiert sind. Der Grund für das Senden des Benutzernamens/Kennworts bei jeder Anforderung ist nur die Authentifizierung und das Senden desselben Ein Token (generiert durch den Anmeldevorgang), um zu entscheiden, ob der Client die Berechtigung hat, Daten anzufordern oder nicht. Sie verletzen REST Konvektionen nur, wenn Sie mit einem anderen Benutzernamen/Passwort oder Sitzungstoken entscheiden, welche Daten angezeigt werden sollen. stattdessen müssen Sie sie nur für die Authentifizierung verwenden (um Daten anzuzeigen oder um Daten nicht anzuzeigen)

in deinem Fall sage ich JA, das ist RESTy, aber vermeide native PHP-Sitzungen in deiner REST API und beginne, deine eigenen Hash-Token zu generieren, die in einem bestimmten Zeitraum ablaufen!

10
EvilThinker

Nein, es kommt nicht darauf an. Googles ClientLogin funktioniert genau so mit der bemerkenswerten Ausnahme, dass der Client angewiesen wird, mit einer HTTP 401-Antwort zur "/ session" zu wechseln. Dadurch wird jedoch keine Sitzung erstellt, sondern nur eine Möglichkeit für Clients, sich (vorübergehend) zu authentifizieren, ohne die Anmeldeinformationen im Klartext weiterzugeben, und für den Server, die Gültigkeit dieser temporären Anmeldeinformationen nach eigenem Ermessen zu steuern.

8
mogsie

Okay, ich habe festgestellt, dass die HTTP-Authentifizierung bei jeder Nachricht automatisch durchgeführt wird - aber wie?

"Authorization:" HTTP-Header wird vom Client gesendet. Entweder einfach (Klartext) oder verdauen.

Wäre es schlecht, einen REST Service zu haben, sagen wir,/session, der eine GET-Anfrage akzeptiert, bei der Sie einen Benutzernamen/ein Passwort als Teil der Anfrage übergeben würden, und eine Sitzung zurückgibt Token, wenn die Authentifizierung erfolgreich war, das dann mit nachfolgenden Anforderungen weitergereicht werden könnte? Ist das aus einer REST Sicht sinnvoll, oder fehlt der Punkt?

Die ganze Idee der Sitzung ist es, stateful Anwendungen unter Verwendung des statusfreien Protokolls (HTTP) und des dummen Clients (Webbrowser) zu erstellen, indem der Status auf der Serverseite beibehalten wird. Eines der REST Prinzipien ist "Jede Ressource ist mit einer universellen Syntax für die Verwendung in Hypermedia-Links eindeutig adressierbar" . Sitzungsvariablen sind etwas, auf das nicht über URI zugegriffen werden kann. Wirklich RESTful-Anwendungen behalten den Status auf Clientseite bei und senden alle erforderlichen Variablen über HTTP, vorzugsweise in der URI.

Beispiel: Suche mit Paginierung. Sie hätten URL in Form

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

Es hat viel mit lesezeichenfähigen URLs gemeinsam

5
vartec

Ich denke, Ihr Vorschlag ist in Ordnung, wenn Sie die Lebensdauer der Clientsitzung steuern möchten. Ich denke, dass RESTful-Architektur Sie dazu ermutigt, zustandslose Anwendungen zu entwickeln. Wie @ 2pence schrieb "sollte jede HTTP-Anforderung für sich genug Informationen enthalten, damit der Empfänger sie verarbeiten kann, um sie vollständig mit der statuslosen Natur von HTTP in Einklang zu bringen" .

Dies ist jedoch nicht immer der Fall. Manchmal muss die Anwendung angeben, wann sich der Client anmeldet oder abmeldet, und Ressourcen wie Sperren oder Lizenzen müssen auf der Grundlage dieser Informationen verwaltet werden. Siehe mein Follow-up Frage für ein Beispiel für einen solchen Fall.

3
LiorH