2009-02-13 6 views
151

Haftungsausschluss: Ich bin neu in der REST-Schule des Denkens, und ich versuche, meine Meinung darüber einzuwickeln.Können Sie mir helfen, dies zu verstehen? "Häufige REST-Fehler: Sitzungen sind irrelevant"

Also, ich lese diese Seite, Common REST Mistakes, und ich habe festgestellt, ich bin völlig verwirrt durch den Abschnitt über Sitzungen, die irrelevant sind. Dies ist, was die Seite sagt: „eine Verbindung starten“

Es sollte für einen Kunden keine Notwendigkeit, „Login“ oder HTTP-Authentifizierung erfolgt automatisch bei jeder Nachricht . Client Anwendungen sind Verbraucher von Ressourcen, keine Dienste. gibt es also nichts, wo man sich einloggen kann! Lassen Sie uns sagen, dass Sie einen Flug auf einem REST-Webservice buchen. Sie erstellen keine neue "Sitzung" Verbindung zum Dienst. Eher bitten Sie das "Route Creator-Objekt", um Ihnen eine neue Route zu erstellen. Sie können beginnen, die Lücken zu füllen, aber dann erhalten Sie ganz andere andere Komponente an anderer Stelle auf der Web, um einige andere Leerzeichen zu füllen. Es gibt keine Sitzung, so gibt es kein Problem der Migration des Sitzungsstatus zwischen Clients. Es gibt auch kein Problem der "Sitzungsaffinität" im Server (obwohl es immer noch Ausgleichsprobleme gibt, um fortzufahren).

Okay, ich bekomme, dass HTTP-Authentifizierung automatisch auf jede Nachricht 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 schlecht, einen REST-Dienst zu haben, sagen wir /session, der eine GET-Anfrage akzeptiert, wo Sie einen Benutzernamen/Passwort als Teil der Anfrage übergeben und ein Sitzungstoken zurückgeben, wenn die Authentifizierung erfolgreich war , das könnte dann mit nachfolgenden Anfragen weitergegeben werden? Ist das aus REST-Sicht sinnvoll, oder fehlt der Punkt?

Antwort

76

Um RESTful zu sein, sollte jede HTTP-Anfrage genügend Informationen enthalten, damit der Empfänger sie vollständig in Übereinstimmung mit der Statuslosigkeit von HTTP verarbeiten kann.

Okay, ich, dass die HTTP-Authentifizierung automatisch auf jede Nachricht durchgeführt wird - aber wie?

Ja, der Benutzername und das Passwort werden bei jeder Anfrage gesendet. Die üblichen Methoden hierfür sind Basiszugriffsauthentifizierung und Digest-Zugriffsauthentifizierung. Und ja, ein Lauscher kann die Anmeldeinformationen des Benutzers erfassen. Man würde somit alle gesendeten und empfangenen Daten unter Verwendung von Transport Layer Security (TLS) verschlüsseln.

Wäre es schlecht sein, einen REST Service haben, sagen wir,/Sitzung, die eine GET-Anfrage akzeptiert, wo Sie in einem Benutzername/Passwort als Teil der Anfrage passieren würde, und gibt ein Sitzung Token Wenn die Authentifizierung erfolgreich war, , die dann mit nachfolgende Anfragen weitergegeben werden konnte? Macht das Sinn von einem REST Blickpunkt, oder ist das fehlt der Punkt?

Dies würde RESTful nicht sein, da es Staat trägt aber es ist jedoch durchaus üblich, da es sich um eine Bequemlichkeit für die Nutzer ist; Ein Benutzer muss sich nicht jedes Mal anmelden.

Was Sie in einem "Sitzungstoken" beschreiben, wird im Allgemeinen als Login-Cookie bezeichnet. Zum Beispiel, wenn Sie versuchen, sich in Ihrem Yahoo! Konto gibt es eine Checkbox, die sagt "halte mich für 2 Wochen eingeloggt". Dies bedeutet im Wesentlichen (in deinen Worten) "halte mein Session Token für 2 Wochen am Leben, wenn ich mich erfolgreich anmelde." Web-Browser senden solche Anmelde-Cookies (und möglicherweise andere) mit jeder HTTP-Anfrage, die Sie von Ihnen verlangen.

+5

Diese Antwort ergibt für mich keinen Sinn. Zum einen heißt es, dass es in Ordnung ist, Login und Passwort jedes Mal und damit auch einmal zu übergeben, was sinnvoll ist. Dann wird die Idee vorgeschlagen, den erfolgreichen Anmeldestatus in Form eines Tokens an den Client zurückzugeben. Bei Bedarf könnte das Token den Zeitpunkt der Erstellung codieren. Es ist uns selbstverständlich gestattet, Informationen an den Kunden zurückzugeben. Also, dieser Vorschlag scheint mir gut zu sein. Die Antwort sagt, dass es nicht gut ist, weil "es trägt Zustand", aber ist nicht die Idee von "ST" in "REST" dieser Zustand kann zwischen dem Client und dem Server übertragen werden? –

31

Es ist nicht ungewöhnlich, dass ein REST-Dienst für jede HTTP-Anforderung eine Authentifizierung erfordert. Amazon S3 erfordert beispielsweise, dass jede Anforderung eine Signatur aufweist, die von den Benutzeranmeldeinformationen, der genauen auszuführenden Anforderung und der aktuellen Uhrzeit abgeleitet wird. Diese Signatur ist auf der Client-Seite leicht zu berechnen, kann vom Server schnell verifiziert werden und ist für einen Angreifer, der sie abfängt, von begrenztem Nutzen (da sie auf der aktuellen Zeit basiert).

+0

Ich liebe diesen Ansatz. Wird sofort anfangen, es zu benutzen. –

+3

+1 können Sie bitte näher ausführen: _ist es für einen Angreifer von begrenztem Nutzen, der es abfängt (da es auf der aktuellen Zeit basiert) _? Sprichst du nicht von einem Cookie, der einen verschlüsselten Benutzernamen und ein Passwort enthält? wie SO? (IMHO) –

+1

@RoyiNamir: Ich spreche nicht über einen Keks. Die von S3 verwendete Signatur ist ein Parameter für die HTTP-Anfrage, ist aber * kein * Cookie, sie wird für jede Anfrage neu berechnet. –

3

Ich denke, Ihr Vorschlag ist in Ordnung, wenn Sie die Lebensdauer der Client-Sitzung steuern möchten. Ich denke, dass RESTful-Architektur Sie dazu ermutigt, staatenlose Anwendungen zu entwickeln. Wie @ 2pence schrieb "jede HTTP-Anfrage sollte genügend Informationen von sich selbst für seinen Empfänger zu tragen, um es in völliger Harmonie mit der zustandslosen Natur von HTTP".

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 basierend auf diesen Informationen verwaltet. Ein Beispiel für einen solchen Fall finden Sie in meinem Follow-up question.

5

Okay, ich, dass die HTTP-Authentifizierung automatisch auf jede Nachricht durchgeführt wird - aber wie?

"Autorisierung:" HTTP-Header vom Client gesendet. Entweder grundlegend (Klartext) oder Digest.

Wäre es schlecht sein, einen REST Service haben, sagen wir,/Sitzung, die eine GET-Anfrage akzeptiert, wo Sie in einem Benutzername/Passwort als Teil der Anfrage passieren würde, und gibt ein Sitzung Token Wenn die Authentifizierung erfolgreich war, , die dann mit nachfolgende Anfragen weitergegeben werden konnte? Macht das Sinn von einem REST Blickpunkt, oder ist das fehlt der Punkt?

Die ganze Idee der Sitzung ist Stateful Anwendungen mit zustandsloses Protokoll (HTTP) und stumm Client (Web-Browser) zu machen, indem er den Zustand auf dem Server der Seite beibehalten wird. Eines der REST-Prinzipien ist "Jede Ressource ist eindeutig adressierbar unter Verwendung einer universellen Syntax zur Verwendung in Hypermedia-Links". Sitzungsvariablen sind etwas, auf das nicht über URI zugegriffen werden kann. Eine wahrhaft REST-konforme Anwendung würde den Zustand auf der Clientseite beibehalten und alle erforderlichen Variablen über HTTP senden, vorzugsweise in der URI.

Beispiel: Suche mit Paginierung. Sie würden URL in Form haben

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

Es ist hat viel gemeinsam mit Lesezeichen erstellt URLs

+4

Authentifizierungsinformationen sind auch nicht über URI zugänglich - alle sprechen davon, Auth-Informationen als Teil des Anforderungsheaders zu senden. Wie unterscheidet sich das von der Aufnahme eines Sitzungstokens mit der Anfrage? Ich sage nicht das Session-Token in der URI, sondern in Daten, die in der Anfrage übergeben werden. –

+0

Authentifizierung wird eingerichtet, wenn Sie berechtigt sind, diese Aktion auszuführen, und in der RESTful-Anwendung das Ergebnis nicht beeinflussen würde. – vartec

+4

Ein Sitzungstoken stellt auch fest, ob Sie berechtigt sind, diese Aktion auszuführen. Was meinst du damit würde es nicht beeinflussen? Wenn der Aufrufer nicht autorisiert ist, erhalten sie einen Nicht autorisierten Fehler. Das gleiche gilt für ein Sitzungstoken. Ich sehe wirklich keinen Unterschied? –

8

Nein, es nicht verpassen den Punkt. Googles ClientLogin funktioniert genau so, mit der bemerkenswerten Ausnahme, dass der Client angewiesen wird, mit einer HTTP 401-Antwort zur "/ session" zu gehen. Dadurch wird jedoch keine Sitzung erstellt, sondern Clients können sich (vorübergehend) selbst authentifizieren, ohne die Anmeldeinformationen im Klartext zu übergeben, und der Server kann die Gültigkeit dieser temporären Anmeldeinformationen nach eigenem Ermessen steuern.

+0

Das scheint jedoch nicht RESTful. –

+11

@ unforgiven3 Solange das zurückgegebene Token nur zur Authentifizierung des Benutzers verwendet wird und nicht vom Server verwendet wird, um den Benutzer einem anderen auf dem Server gespeicherten Status zuzuordnen, werden keine REST-Einschränkungen verletzt. –

+0

@Darrel, wie konnten nachfolgende HTTP-Anfragen authentifiziert werden? Mein Verständnis ist Authentifizierung passiert auf jedem HTTP-Anfragen. –

10

Viele Leute verstehen REST-Principales nicht sehr klar, die Verwendung eines Session-Tokens bedeutet nicht immer, dass Sie Stateful sind, der Grund für den Benutzernamen und das Passwort bei jeder Anfrage ist nur für die Authentifizierung und das Senden eines Tokens (generiert durch Login-Prozess) nur um zu entscheiden, ob der Client die Erlaubnis hat, Daten anzufordern oder nicht, Sie verletzen nur REST-Konventionen, wenn Sie entweder Benutzername/Passwort oder Session-Token verwenden, um zu entscheiden, welche Daten angezeigt werden sollen! Stattdessen müssen Sie sie nur für die Authentifizierung verwenden (um Daten anzuzeigen oder nicht um Daten anzuzeigen)

in Ihrem Fall sage ich JA das ist RESTy, aber versuchen Sie es mit nativen PHP-Sitzungen in Ihrer REST-API zu vermeiden und starten Sie Ihre eigenen Hash-Token, die in bestimmten Zeitabschnitten ablaufen!

+0

danke. Warum sollte man native PHP-Sessions meiden und stattdessen eigene Hash-Token verwenden? – Matthew

+0

kein brillanter Grund, sage ich, nur für mehr Sicherheit und mehr Kontrolle. – EvilThinker

+0

Das ist besser als die angenommene Antwort. Zumindest akzeptiert es die Suggestion als RESTy, was Sinn macht. Ich sehe jedoch nicht, warum die übergebenen Informationen nicht für die benutzerabhängige Autorisierung verwendet werden können. Einige Benutzer haben möglicherweise Zugriff auf einige Daten und andere nicht. Das macht das Protokoll nicht RESTful. –

Verwandte Themen