Diese Frage ist eine Frage zu Login-Flows für Web-Apps im Allgemeinen. Ich bin am meisten an Antworten interessiert, die auf Benutzerfreundlichkeit und Leistung bei gleichzeitiger Aufrechterhaltung der Sicherheit optimieren.
Um das Problem zu veranschaulichen, sind hier einige Routen und entsprechende Verhaltensweisen für eine Beispielanwendung:
%Vor%Analyse: Hoffentlich ist Ihr Client ein moderner Browser, der nicht mit HTTP kompatibel ist, so dass er nach einem 302'd POST ein GET ausführt. Dies gilt für alle Bereiche. Sollte ich mir Sorgen machen?
Analyse: Gleiche Probleme wie oben. Es wurde ein Problem hinzugefügt, dass die URL, die vom Browser während der Anmeldung angezeigt wird, sich ändert, was für den Benutzer verwirrend ist und Lesezeichen, Link-Sharing usw. unterbricht.
Analyse: Leider ist die Aktualisierungsschaltfläche jetzt ebenfalls kaputt: Die Aktualisierung führt dazu, dass der Benutzeragent mit einer Warnung erneut sendet, anstatt erneut zu holen / geheim. Der Benutzer erhält eine Warnung, aber wenn er sie ignoriert, passiert etwas Schlimmes.
Auf der hellen Seite minimieren Sie Rundreisen mit dieser Technik.
Analyse: Gleiche Probleme wie Optionen 2 + 4.
Gibt es eine andere Technik, die ich vermisse?
Was ist der korrekte HTTP-Status? Code beim Umleiten auf eine Login-Seite? Welche Art von HTTP-Umleitung für Anmeldungen? HTTP-Antwort mit Umleitung, aber ohne Roundtrip?
Option 1 & amp; 3 folgen nicht dem HTTP-RFC als "heimlich angezeigtes Anmeldeformular" widerspricht 200 GET-Antwort, wobei "eine Entität entspricht an die angeforderte Ressource gesendet wird in der Antwort "wird erwartet.
Option 2 ist OK. Alle modernen Browser unterstützen 302 auf POST und viele REST-basierte Frameworks (wie RoR) nutzen es aktiv. Alternativ können Sie in "302 to / login" bereits die Sitzung (Cookie) erstellen und die URL in Sitzung speichern, um zu vermeiden, dass die ursprüngliche URL in GET-Parametern übergeben wird. Aus Usability-Sicht können Sie auch eine entsprechende Nachricht auf der Anmeldeseite haben (ich denke, der URL-Mismatch ist hier irrelevant - Sie können den Benutzer den Inhalt sowieso nicht sehen lassen).
Option 4: Wenn Sie POST an / secret senden, erwartet HTTP RFC, dass Sie "die in der Anfrage eingeschlossene Entität als neuen Untergebenen der durch den Request-URI in der Request-Line identifizierten Ressource akzeptieren", aber alles, was Sie sind Das heißt, sich anzumelden und nichts Neues unter / secret zu erstellen.
Nach HTTP-RFC ist Ihre beste Wahl Option 2 . Tatsächlich stimmt Option 2 auch mit dem POST- & gt; Redirect- & gt; GET-Entwurfsmuster überein, das hilft um das Problem der Unvorhersehbarkeit von URL-Lesezeichen für POST-Ressourcen zu beheben.
Mein $ .02: Ich habe vor kurzem die Option 2 implementiert (obwohl ich /secret
in einer Sitzung gespeichert habe, nicht im Login-Formular als verstecktes Feld).
Ich teile Ihre Bedenken nicht vollständig:
Problem hinzugefügt, dass die URL angezeigt wurde durch den Browser bei der Anmeldung Änderungen, die für den Benutzer verwirrend ist und bricht Lesezeichen, Linkfreigabe, etc.
Die Weiterleitung an /login
und die anschließende Änderung der URL weist den Benutzer an, dass bevor er fortfahren kann, noch etwas anderes getan werden muss: Anmelden.
Da sich eine Anmeldeseite von der "Zielseite" völlig unterscheidet, kann ich nicht erkennen, dass dies dazu führt, dass Nutzer die Anmeldeseite anstelle der Zielseite mit Lesezeichen verknüpfen und / oder die Anmeldeseite teilen. t die Informationen enthalten, die sie trotzdem als Lesezeichen / Freigaben verwenden möchten.
Und wenn Sie sich Sorgen machen, dass 302 den Standard bricht (obwohl jeder einzelne Browser, den ich kenne, es gerne bricht), sollten Sie stattdessen 303 verwenden.
Beachten Sie, dass mickeyreiss korrekt ist, die Verwendung von AJAX Option 3 funktioniert ohne den Nachteil der abgebrochenen Schaltfläche. Dies bedeutet jedoch, dass der Benutzer JavaScript aktiviert haben muss. Wenn Sie Ihr Formular richtig programmieren, können Sie feststellen, ob JS vorhanden ist, falls nicht, verwenden Sie Option 1.
Beachten Sie, dass die 302-Antwort in Ordnung ist, aber möglicherweise Probleme mit Caches haben. Sie müssen sicherstellen, dass nichts zwischengespeichert wird, wenn Sie zwei völlig verschiedene Seiten / Formulare für denselben URI anzeigen möchten. (/ secret zeigt den Login und dann das eigentliche Geheimnis an.)
Ich verwende fast immer Option # 2, einfach weil der von einer URL zurückgegebene Inhalt konsistent ist. Während die Geheimnisse von heute hinter einem Login versteckt sind, möchten Sie es vielleicht morgen öffnen oder gemischt public / secret anzeigen, abhängig von der Authentifizierung unter der gleichen URL. In diesem Fall wird Option 2 am ehesten den Erwartungen von Google entsprechen. Alle Content-Köder und -Switches werden von Google abgelehnt und im Extremfall haben alle Ihre Seiten doppelte Seiteninhalte (zB Login-Formular).
Ich würde die Option mit AJAX wählen:
location.href
, um die gewünschte Seite festzulegen
Gehe zu, sonst kannst du eine Nachricht ausgeben, die besagt, dass die Anmeldung nicht erfolgt
gültig. _SESSION
Variable testen, wenn nicht auf die Anmeldeseite umgeleitet wird .. Tags und Links web-applications authentication rest http web