Ich interessiere mich speziell dafür, wie Benutzer autorisierte / authentifizierte Vorgänge an einer Web-API ausführen.
Sind Authentifizierungs-Cookies mit der REST-Philosophie kompatibel und warum?
Ich interessiere mich speziell dafür, wie Benutzer autorisierte / authentifizierte Vorgänge an einer Web-API ausführen.
Sind Authentifizierungs-Cookies mit der REST-Philosophie kompatibel und warum?
Antworten:
Ein idealer ReSTful-Dienst ermöglicht es Clients (die möglicherweise nicht im Browser sind), alle erforderlichen Aufgaben in einer Anforderung auszuführen . weil der vollständige Status dafür vom Client und nicht vom Server gehalten wird. Da der Client die vollständige Kontrolle über den Status hat, kann er den Status selbst erstellen (sofern dies legitim ist) und nur mit der API kommunizieren, um "fertig" zu werden.
Das Erfordernis von Cookies kann dies erschweren. Für Kunden neben Browsern ist die Verwaltung von Cookies eine ziemlich große Schwierigkeit im Vergleich zu Abfrageparametern, einfachen Anforderungsheadern oder dem Anforderungshauptteil. Andererseits kann die Verwendung von Cookies im Browser vieles einfacher machen.
Daher sucht eine API möglicherweise zuerst in der Authorization
Kopfzeile nach den erforderlichen Authentifizierungsdaten, da dies wahrscheinlich der Ort ist, an dem Clients, die keine Browser-Clients sind, diese bevorzugen. Um jedoch browserbasierte Clients zu vereinfachen und zu rationalisieren, sucht sie möglicherweise auch nach einem Sitzungscookie für die serverseitige Anmeldung, aber nur, wenn der reguläre Authorization
Header fehlte.
Ein weiteres Beispiel könnte eine komplexe Anforderung sein, für die normalerweise viele Parameter festgelegt werden müssen. Ein nicht interaktiver Client würde keine Probleme haben, alle diese Daten in einer Anfrage zusammenzufassen. Eine HTML-basierte Oberfläche könnte es jedoch vorziehen, die Anfrage in mehrere Seiten aufzuteilen (so etwas wie eine Reihe von "Assistenten" -Seiten), damit Benutzer nicht angezeigt werden mit Optionen, die aufgrund der vorherigen Auswahl nicht zutreffen. Alle Zwischenseiten könnten die Werte in clientseitigen Cookies speichern, so dass nur die allerletzte Seite, auf der der Benutzer die Anfrage tatsächlich einreicht , einen serverseitigen Effekt hat. Die API könnte nach den erforderlichen Attributen im Anforderungshauptteil suchen und auf die Suche nach Cookies zurückgreifen, wenn die erforderlichen Parameter nicht vorhanden sind.
Edit: in RE zu @ Konrads Kommentar unten:
Tokens sind im Vergleich schwerer zu implementieren, insbesondere weil Sie das Token nicht einfach ungültig machen können, ohne sie irgendwo zu speichern.
äh ... Sie validieren die Cookies auf der Serverseite, richtig? Nur weil Sie den Browser angewiesen haben , ein Cookie nach 24 Stunden zu löschen, bedeutet dies nicht, dass dies der Fall ist. Dieser Cookie könnte von einem hochtechnischen Benutzer gespeichert und weiterverwendet werden, lange nachdem er "abgelaufen" ist.
Wenn Sie keine Sitzungsdaten auf dem Server speichern möchten, sollten Sie diese im Token (Cookie oder auf andere Weise) speichern. Ein in sich geschlossenes Authentifizierungstoken wird manchmal als Makrone bezeichnet. Wie dies zwischen Client und Server übertragen wird (ob per Cookie, als zusätzliche Header oder in der Anforderungsentität selbst), ist völlig unabhängig vom Authentifizierungsmechanismus selbst.
HttpClient
In .NET können Sie Cookies beispielsweise problemlos verwenden, und Sie müssen nicht wirklich darüber nachdenken. Tokens sind im Vergleich schwerer zu implementieren, insbesondere weil Sie das Token nicht einfach ungültig machen können, ohne sie irgendwo zu speichern.
curl
oder wget
ist das Verwalten von Cookies verdammt umständlich und man muss sich wirklich viele Gedanken darüber machen. Ich habe auf Ihren anderen Punkt geantwortet, indem ich meine Antwort bearbeitet habe.
Ja und Nein - Hängt davon ab, wie Sie es verwenden.
Wenn Cookies verwendet werden, um den Client-Status beim Client, für den Client, für den Client und für den Client aufrechtzuerhalten, sind sie erholsam.
Wenn Sie den Serverstatus im Cookie speichern, verlagern Sie die Last im Grunde genommen nur auf den Client - was nicht unangenehm ist.
Also, was sind einige Beispiele?
Erholsam:
Nicht erholsam:
Ruhe entsteht durch Staatenlosigkeit - des Servers. Clients können den Anwendungsstatus beibehalten und ihn an den Server senden, um zu bestimmen, wo sie sich befinden, damit der Server entscheiden kann, wohin er von dort aus gehen soll. Grundsätzlich benötigen Sitzungen / Status historische Daten und sind sozusagen von früheren Anfragen abhängig. Ruhende Anwendungen sind dies im Idealfall nicht.
Man kann Cookies verwenden. REST erlaubt es ihnen.
Für REST müssen Sitzungsinformationen auf dem Client gespeichert werden. Bei der Authentifizierung müssen jedoch einige Informationen aus Sicherheitsgründen auf dem Server gespeichert werden.
In einem meiner Blog- Beiträge wurde allgemein vereinbart, dass Authentifizierungsdaten in Bezug auf REST als außerhalb des Geltungsbereichs liegend betrachtet werden. Daher ist es für Server in Ordnung, einige dieser Sitzungsdaten auf ihrer Seite zu halten.