Haftungsausschluss: Ich bin neu in der REST-Denkschule und versuche, mich darum zu kümmern.
Ich lese diese Seite, Häufige REST-Fehler , und habe festgestellt, dass mich der Abschnitt über irrelevante Sitzungen völlig verblüfft. Dies ist, was die Seite sagt:
Es sollte nicht erforderlich sein, dass sich ein Client "anmeldet" oder "eine Verbindung herstellt". Die HTTP-Authentifizierung erfolgt automatisch für jede Nachricht. Clientanwendungen sind Konsumenten von Ressourcen, nicht von Diensten. Daher gibt es nichts, bei dem man sich anmelden kann! Angenommen, Sie buchen einen Flug über einen REST-Webservice. Sie erstellen keine neue "Sitzungs" -Verbindung zum Dienst. Stattdessen bitten Sie das "Objekt zum Erstellen der Reiseroute", eine neue Reiseroute zu erstellen. Sie können mit dem Ausfüllen der Lücken beginnen, aber dann an einer anderen Stelle im Web eine völlig andere Komponente erhalten, um einige andere Lücken auszufüllen. Es gibt keine Sitzung, daher gibt es kein Problem beim Migrieren des Sitzungsstatus zwischen Clients. Es gibt auch kein Problem der "Sitzungsaffinität"
Okay, ich verstehe, dass die HTTP-Authentifizierung bei jeder Nachricht automatisch erfolgt - aber wie? Wird der Benutzername / das Passwort bei jeder Anfrage gesendet? Erhöht das nicht nur die Angriffsfläche? Ich habe das Gefühl, dass mir ein Teil des Puzzles fehlt.
Wäre es beispielsweise schlecht, einen REST-Service zu haben /session
, der eine GET-Anforderung akzeptiert, bei der Sie als Teil der Anforderung einen Benutzernamen / ein Kennwort übergeben und bei erfolgreicher Authentifizierung ein Sitzungstoken zurückgeben, könnte dies der Fall sein zusammen mit nachfolgenden Anfragen weitergegeben? Ist das aus REST-Sicht sinnvoll oder fehlt das?
Antworten:
Um RESTful zu sein, sollte jede HTTP-Anforderung genügend Informationen für sich enthalten, damit der Empfänger sie so verarbeiten kann, dass sie vollständig mit der zustandslosen Natur von HTTP übereinstimmt.
Ja, der Benutzername und das Passwort werden bei jeder Anfrage gesendet. Die gängigen Methoden hierfür sind die grundlegende Zugriffsauthentifizierung und die Digest-Zugriffsauthentifizierung . Und ja, ein Lauscher kann die Anmeldeinformationen des Benutzers erfassen. Man würde also alle gesendeten und empfangenen Daten mit Transport Layer Security (TLS) verschlüsseln .
Dies wäre nicht RESTful, da es den Status trägt, aber es ist ziemlich häufig, da es für Benutzer eine Annehmlichkeit ist. Ein Benutzer muss sich nicht jedes Mal anmelden.
Was Sie in einem "Sitzungstoken" beschreiben, wird üblicherweise als Anmeldecookie bezeichnet . Wenn Sie beispielsweise versuchen, sich bei Ihrem Yahoo! Konto gibt es ein Kontrollkästchen mit der Aufschrift "Halten Sie mich 2 Wochen lang angemeldet". Dies bedeutet im Wesentlichen (in Ihren Worten): "Halten Sie mein Sitzungstoken 2 Wochen lang am Leben, wenn ich mich erfolgreich anmelde." Webbrowser senden solche Anmelde-Cookies (und möglicherweise andere) mit jeder HTTP-Anfrage, die Sie für Sie anfordern.
quelle
Es ist nicht ungewöhnlich, dass ein REST-Service für jede HTTP-Anforderung eine Authentifizierung erfordert. Beispielsweise erfordert Amazon S3, dass jede Anforderung eine Signatur hat, die aus den Benutzeranmeldeinformationen, der genauen auszuführenden Anforderung und der aktuellen Uhrzeit abgeleitet wird. Diese Signatur ist auf der Clientseite einfach zu berechnen, kann vom Server schnell überprüft werden und ist für einen Angreifer, der sie abfängt, nur von begrenztem Nutzen (da sie auf der aktuellen Zeit basiert).
quelle
Viele Leute verstehen REST-Principales nicht sehr klar. Die Verwendung eines Sitzungstokens bedeutet nicht, dass Sie immer einen Status haben. Der Grund für das Senden eines Benutzernamens / Kennworts bei jeder Anforderung ist nur die Authentifizierung und derselbe für das Senden eines Tokens (generiert durch Anmeldung) Nur um zu entscheiden, ob der Client die Berechtigung hat, Daten anzufordern oder nicht, verletzen Sie REST-Konvetionen nur, wenn Sie entweder den Benutzernamen / das Passwort oder die Sitzungstoken verwenden, um zu entscheiden, welche Daten angezeigt werden sollen! Stattdessen müssen Sie sie nur zur Authentifizierung verwenden (um Daten anzuzeigen oder um Daten nicht anzuzeigen).
In Ihrem Fall sage ich JA, dies ist RESTy, aber vermeiden Sie die Verwendung nativer PHP-Sitzungen in Ihrer REST-API und generieren Sie Ihre eigenen Hash-Token, die in einem bestimmten Zeitraum ablaufen!
quelle
Nein, es geht nicht daneben. Googles ClientLogin funktioniert genau so, mit der bemerkenswerten Ausnahme, dass der Client angewiesen wird, mithilfe einer HTTP 401-Antwort zur "/ session" zu wechseln . Dies schafft jedoch keine Sitzung, sondern nur eine Möglichkeit für Clients, sich (vorübergehend) zu authentifizieren, ohne die Anmeldeinformationen im Klartext zu übergeben, und für den Server, die Gültigkeit dieser temporären Anmeldeinformationen nach eigenem Ermessen zu kontrollieren.
quelle
"Autorisierung:" HTTP-Header vom Client gesendet. Entweder einfach (einfacher Text) oder verdauen.
Die gesamte Idee einer Sitzung besteht darin, statusbehaftete Anwendungen mithilfe des zustandslosen Protokolls (HTTP) und des dummen Clients (Webbrowser) zu erstellen, indem der Status auf der Serverseite beibehalten wird. Eines der REST-Prinzipien lautet: "Jede Ressource kann mithilfe einer universellen Syntax zur Verwendung in Hypermedia-Links eindeutig adressiert werden . " Auf Sitzungsvariablen kann nicht über URI zugegriffen werden. Eine wirklich RESTful-Anwendung würde den Status auf der Clientseite beibehalten und alle erforderlichen Variablen per HTTP senden, vorzugsweise in der URI.
Beispiel: Suche mit Paginierung. Sie hätten eine URL im Formular
Es hat viel mit Lesezeichen-URLs gemeinsam
quelle
Ich denke, Ihr Vorschlag ist in Ordnung, wenn Sie die Lebensdauer der Client-Sitzung steuern möchten. Ich denke, dass die RESTful-Architektur Sie dazu ermutigt, zustandslose Anwendungen zu entwickeln. Wie @ 2pence schrieb, "sollte jede HTTP-Anfrage genug Informationen für sich enthalten, damit ihr Empfänger sie verarbeiten kann, um in völliger Übereinstimmung mit der zustandslosen Natur von HTTP zu sein" .
Dies ist jedoch nicht immer der Fall. Manchmal muss die Anwendung feststellen, wann sich der Client anmeldet oder abmeldet, und Ressourcen wie Sperren oder Lizenzen basierend auf diesen Informationen verwalten. Siehe meine Follow - up - Frage für ein Beispiel eines solchen Falles.
quelle