Was ist der richtige HTTP-Statuscode, wenn Sie zu einer Anmeldeseite umleiten?

132

Wenn ein Benutzer nicht angemeldet ist und versucht, auf eine Seite zuzugreifen, für die eine Anmeldung erforderlich ist, wie lautet der richtige HTTP-Statuscode für eine Umleitung zur Anmeldeseite?

Ich frage , weil keiner der vom W3C festgelegten 3xx-Antwortcodes den Anforderungen zu entsprechen scheint :

10.3.1 300 Mehrfachauswahl

Die angeforderte Ressource entspricht einer beliebigen Reihe von Darstellungen mit jeweils einem bestimmten Standort, und es werden agentengesteuerte Verhandlungsinformationen (Abschnitt 12) bereitgestellt, damit der Benutzer (oder Benutzeragent) eine bevorzugte Darstellung auswählen und diese umleiten kann Anfrage an diesen Ort.

Sofern es sich nicht um eine HEAD-Anforderung handelt, MUSS die Antwort eine Entität enthalten, die eine Liste von Ressourcenmerkmalen und Standorten enthält, aus denen der Benutzer oder Benutzeragent die am besten geeignete auswählen kann. Das Entitätsformat wird durch den Medientyp angegeben, der im Headerfeld Inhaltstyp angegeben ist. Abhängig vom Format und den Fähigkeiten von

Der Benutzeragent kann die Auswahl der am besten geeigneten Auswahl automatisch durchführen. Diese Spezifikation definiert jedoch keinen Standard für eine solche automatische Auswahl.

Wenn der Server eine bevorzugte Darstellungsauswahl hat, MUSS er den spezifischen URI für diese Darstellung in das Feld Standort aufnehmen. Benutzeragenten KÖNNEN den Feldwert Standort für die automatische Umleitung verwenden. Diese Antwort kann zwischengespeichert werden, sofern nicht anders angegeben.

10.3.2 301 Permanent verschoben

Der angeforderten Ressource wurde eine neue permanente URI zugewiesen, und alle zukünftigen Verweise auf diese Ressource sollten eine der zurückgegebenen URIs verwenden. Clients mit Linkbearbeitungsfunktionen sollten Verweise auf den Request-URI nach Möglichkeit automatisch mit einem oder mehreren der neuen vom Server zurückgegebenen Verweise verknüpfen. Diese Antwort kann zwischengespeichert werden, sofern nicht anders angegeben.

Die neue permanente URI MUSS durch das Feld Standort in der Antwort angegeben werden. Sofern die Anforderungsmethode nicht HEAD war, SOLLTE die Entität der Antwort eine kurze Hypertextnotiz mit einem Hyperlink zu den neuen URIs enthalten.

Wenn der 301-Statuscode als Antwort auf eine andere Anforderung als GET oder HEAD empfangen wird, darf der Benutzeragent die Anforderung NICHT automatisch umleiten, es sei denn, dies kann vom Benutzer bestätigt werden, da dies die Bedingungen ändern kann, unter denen die Anforderung ausgegeben wurde.

  Note: When automatically redirecting a POST request after
  receiving a 301 status code, some existing HTTP/1.0 user agents
  will erroneously change it into a GET request.

10.3.3 302 Gefunden

Die angeforderte Ressource befindet sich vorübergehend unter einem anderen URI. Da die Umleitung gelegentlich geändert werden kann, sollte der Client den Anforderungs-URI weiterhin für zukünftige Anforderungen verwenden. Diese Antwort kann nur zwischengespeichert werden, wenn dies durch ein Cache-Control- oder Expires-Headerfeld angezeigt wird.

Der temporäre URI sollte durch das Feld Standort in der Antwort angegeben werden. Sofern die Anforderungsmethode nicht HEAD war, SOLLTE die Entität der Antwort eine kurze Hypertextnotiz mit einem Hyperlink zu den neuen URIs enthalten.

Wenn der 302-Statuscode als Antwort auf eine andere Anforderung als GET oder HEAD empfangen wird, darf der Benutzeragent die Anforderung NICHT automatisch umleiten, es sei denn, dies kann vom Benutzer bestätigt werden, da dies die Bedingungen ändern kann, unter denen die Anforderung ausgegeben wurde.

  Note: RFC 1945 and RFC 2068 specify that the client is not allowed
  to change the method on the redirected request.  However, most
  existing user agent implementations treat 302 as if it

waren eine 303-Antwort, die unabhängig von der ursprünglichen Anforderungsmethode ein GET für den Feldwert "Standort" durchführte. Die Statuscodes 303 und 307 wurden für Server hinzugefügt, die eindeutig klarstellen möchten, welche Art von Reaktion vom Client erwartet wird.

10.3.4 303 Siehe Andere

Die Antwort auf die Anforderung kann unter einem anderen URI gefunden werden und sollte mit einer GET-Methode für diese Ressource abgerufen werden. Diese Methode dient hauptsächlich dazu, dass die Ausgabe eines POST-aktivierten Skripts den Benutzeragenten zu einer ausgewählten Ressource umleitet. Der neue URI ist keine Ersatzreferenz für die ursprünglich angeforderte Ressource. Die 303-Antwort darf NICHT zwischengespeichert werden, aber die Antwort auf die zweite (umgeleitete) Anforderung kann zwischengespeichert werden.

Die verschiedenen URIs MÜSSEN durch das Feld Standort in der Antwort angegeben werden. Sofern die Anforderungsmethode nicht HEAD war, SOLLTE die Entität der Antwort eine kurze Hypertextnotiz mit einem Hyperlink zu den neuen URIs enthalten.

  Note: Many pre-HTTP/1.1 user agents do not understand the 303
  status. When interoperability with such clients is a concern, the
  302 status code may be used instead, since most user agents react
  to a 302 response as described here for 303.

10.3.5 304 Nicht geändert

Wenn der Client eine bedingte GET-Anforderung ausgeführt hat und der Zugriff zulässig ist, das Dokument jedoch nicht geändert wurde, MUSS der Server mit diesem Statuscode antworten. Die Antwort 304 DARF KEINEN Nachrichtentext enthalten und wird daher immer durch die erste leere Zeile nach den Headerfeldern beendet.

Die Antwort MUSS die folgenden Headerfelder enthalten:

  - Date, unless its omission is required by section 14.18.1 If a

Der taktlose Ursprungsserver befolgt diese Regeln, und Proxys und Clients fügen jeder Antwort, die ohne eine Antwort empfangen wurde, ein eigenes Datum hinzu (wie bereits in [RFC 2068], Abschnitt 14.19 angegeben). Die Caches funktionieren ordnungsgemäß.

  - ETag and/or Content-Location, if the header would have been sent
    in a 200 response to the same request
  - Expires, Cache-Control, and/or Vary, if the field-value might
    differ from that sent in any previous response for the same
    variant If the conditional GET used a strong cache validator (see

Abschnitt 13.3.3), die Antwort sollte keine anderen Entity-Header enthalten. Andernfalls (dh das bedingte GET hat einen schwachen Validator verwendet) darf die Antwort KEINE anderen Entitätsheader enthalten. Dies verhindert Inkonsistenzen zwischen zwischengespeicherten Entitätskörpern und aktualisierten Headern.

Wenn eine 304-Antwort eine Entität anzeigt, die derzeit nicht zwischengespeichert ist, MUSS der Cache die Antwort ignorieren und die Anforderung ohne die Bedingung wiederholen.

Wenn ein Cache eine empfangene 304-Antwort verwendet, um einen Cache-Eintrag zu aktualisieren, MUSS der Cache den Eintrag aktualisieren, um alle neuen Feldwerte wiederzugeben, die in der Antwort angegeben sind.

10.3.6 305 Proxy verwenden

Auf die angeforderte Ressource MUSS über den im Feld Standort angegebenen Proxy zugegriffen werden. Das Feld Standort gibt den URI des Proxys an. Es wird erwartet, dass der Empfänger diese einzelne Anforderung über den Proxy wiederholt. 305 Antworten MÜSSEN nur von Ursprungsservern generiert werden.

  Note: RFC 2068 was not clear that 305 was intended to redirect a
  single request, and to be generated by origin servers only.  Not
  observing these limitations has significant security consequences.

10.3.7 306 (nicht verwendet)

Der 306-Statuscode wurde in einer früheren Version der Spezifikation verwendet, wird nicht mehr verwendet und der Code ist reserviert.

10.3.8 307 Temporäre Weiterleitung

Die angeforderte Ressource befindet sich vorübergehend unter einem anderen URI. Da die Umleitung gelegentlich geändert werden kann, sollte der Client den Anforderungs-URI weiterhin für zukünftige Anforderungen verwenden. Diese Antwort kann nur zwischengespeichert werden, wenn dies durch ein Cache-Control- oder Expires-Headerfeld angezeigt wird.

Der temporäre URI sollte durch das Feld Standort in der Antwort angegeben werden. Sofern die Anforderungsmethode nicht HEAD war, sollte die Entität der Antwort eine kurze Hypertextnotiz mit einem Hyperlink zu den neuen URIs enthalten, da viele Benutzeragenten vor HTTP / 1.1 den 307-Status nicht verstehen. Daher sollte der Hinweis die Informationen enthalten, die ein Benutzer benötigt, um die ursprüngliche Anforderung für den neuen URI zu wiederholen.

Wenn der 307-Statuscode als Antwort auf eine andere Anforderung als GET oder HEAD empfangen wird, darf der Benutzeragent die Anforderung NICHT automatisch umleiten, es sei denn, dies kann vom Benutzer bestätigt werden, da dies die Bedingungen ändern kann, unter denen die Anforderung ausgegeben wurde.

Ich benutze vorerst 302, bis ich die richtige Antwort finde .

Update & Fazit:

HTTP 302 ist besser, da bekannt ist, dass es die beste Kompatibilität mit Clients / Browsern aufweist.

Vidar Vestnes
quelle
1
Ich würde sagen, dass es absolut üblich wäre, eine 401- und eine Anmeldeseite ohne Weiterleitung zurückzugeben, aber ich bin mir nicht sicher, welche Optionen Sie haben.
Nick Craver
1
@Nick guter Punkt, aber ich würde Nebenwirkungen befürchten, wenn ich ein klassisches Login-System bauen würde.
Pekka
1
@ Pekka - Absolut einverstanden, es hängt davon ab, auf welcher Plattform dies ist, wie alles sauber gehandhabt werden kann, auch wenn es um Intranet oder Internet geht. Ich glaube ... Sie führen die Authentifizierung in einem Intranet normalerweise auf andere Weise durch. Zumindest nach meiner Erfahrung.
Nick Craver
@Nick With 401 "Die Antwort MUSS ein WWW-Authenticate-Header-Feld enthalten" - Wie kann ich dies mit einer MySQL-Datenbank kombinieren? Ist AuthType Basic und Digest nicht auf Apache-Konfigurationsdateien wie .htpassword usw. beschränkt?
Vidar Vestnes
Ich möchte eine benutzerdefinierte Anmeldeseite, nicht den grundlegenden Browser-Dialog, in dem nach Benutzername und Passwort gefragt wird ...
Vidar Vestnes

Antworten:

66

Ich würde sagen, 303 siehe andere 302 Gefunden:

Die angeforderte Ressource befindet sich vorübergehend unter einem anderen URI. Da die Umleitung gelegentlich geändert werden kann , SOLLTE der Client den Anforderungs-URI weiterhin für zukünftige Anforderungen verwenden. Diese Antwort kann nur zwischengespeichert werden, wenn dies durch ein Cache-Control- oder Expires-Headerfeld angezeigt wird.

passt meiner Meinung nach am besten zu einer Login-Seite. Ich überlegte zunächst, 303 see otherwas genauso gut funktionieren würde. Nach einigem Nachdenken, würde ich sagen , 302 Foundist mehr passend , weil die angeforderte Ressource wurde gefunden, gibt es nur eine andere Seite zu durchlaufen , bevor sie zugegriffen werden kann. Die Antwort wird standardmäßig nicht zwischengespeichert, was ebenfalls in Ordnung ist.

Pekka
quelle
4
Ich stimme zu, aber ich denke, 302 Gefunden zeigt an, dass die Ressource gefunden wurde, direkt unter einer anderen URL. Ex. Ich möchte / meine-Nachrichten / der Server mit einer 302 beantworten, weil "heute" meine Nachrichten in "/ login /" (anstelle von "/ messages /") liegen ... Ich benutze 302, aber ich fühle mich nicht Der Kontext stimmt zu 100% überein. Da die Anmeldeseite eine andere Ressource ist und nicht den gleichen Inhalt wie angefordert hat.
Vidar Vestnes
2
@PHP_Jedi wahr. 303 kann unter diesem Gesichtspunkt angemessener sein. 302 ist jedoch hinsichtlich der Clientkompatibilität zuverlässiger.
Pekka
1
Ja, ich denke, dass 303 besser zum Kontext passt, da darin steht "Die Antwort auf die Anfrage kann unter einem anderen URI gefunden werden". Dies sagt mir, dass nicht die Ressource selbst in einem anderen URI zu finden ist, sondern nur die Antwort auf diese Anfrage.
Vidar Vestnes
3
@PHP_Jedi Ich bin mir nicht sicher, ob es sich lohnt, so viel Zeit dafür zu investieren. Sowohl Clients als auch Server in der http-Welt müssen ohnehin extrem liberal und fehlertolerant sein, sodass es keinen wirklichen Unterschied gibt, ob Sie 302oder verwenden 303, außer dass dies 302besser bekannt ist. Ich finde den Detaillierungsgrad lobenswert und es ist immer gut, die Dinge richtig zu machen, aber zu viel Aufwand kann in diesem speziellen Bereich zwecklos sein.
Pekka
27
Zu Ihrer Information: Google gibt 302s heraus
David Murdoch
51

Dies ist ein Missbrauch des HTTP-Umleitungsmechanismus. Wenn der Benutzer nicht autorisiert ist, muss Ihre App zurückkehren 401 Unauthorized. Falls der Benutzer autorisiert ist, aber keinen Zugriff auf die angeforderte Ressource hat, 403 Forbiddenmuss er zurückgegeben werden.

Sie sollten die Weiterleitung auf der Clientseite durchführen, z. B. per Javascript. Statuscode für die Umleitung, da die erforderliche Autorisierung nicht vorhanden ist . Die Verwendung von 30x entspricht nicht HTTP.

Wie man über HTTP-Statuscodes nachdenkt von Mark Nottingham

401 Nicht autorisiert löst den Anforderungsauthentifizierungsmechanismus von HTTP aus.

401 UnauthorizedFür den Statuscode muss ein WWW-AuthenticateHeader vorhanden sein, der verschiedene Authentifizierungstypen unterstützt:

WWW-Authentifizierung: <Typ> Realm = <Real>

Inhaber, OAuth, Basic, Digest, Cookie usw.

filip26
quelle
20
Ein 401 ist in einigen Fällen möglicherweise nicht als A server generating a 401 (Unauthorized) response MUST send a WWW-Authenticate header field( RFC ) geeignet , und nicht alle Anmeldesysteme verwenden diesen Header.
Starbeamrainbowlabs
6
Angenommen, Sie aktualisieren eine geschützte Seite. clientseitiges Javascript muss nicht geändert werden, und der Browser öffnet ein Anmeldefenster, anstatt den Benutzer zur Anmeldeseite umzuleiten. Die einzige Möglichkeit besteht darin, einen 30-fachen Code zu verwenden.
Claude Brisson
2
Golang kann 401 nicht zur Umleitung verwenden. Das heißt, wir sollten 30 * für Weiterleitungen verwenden.
EIMEI
4
@EIMEI Nach Ihrer Überlegung wäre das Internet zum Scheitern verurteilt, wenn eine andere Sprache oder Bibliothek Sie zur Verwendung von 401 zwingen würde. Mein Punkt ist: Was Sie sagen, deutet auf ein Problem mit Golang hin (obwohl ich es überraschend finde, dass es ein solches Design hätte, das es unmöglich macht, 401s zu senden!)
Greg
2
@starbeamrainbowlabs Im WWW-Authenticate-Header ist ein Entwurf für die Cookie-basierte HTTP-Authentifizierung als Option enthalten. Siehe: tools.ietf.org/html/draft-broyer-http-cookie-auth-00
aef
12

Ich denke, die geeignete Lösung ist der HTTP 401-Header (nicht autorisiert).

http://en.wikipedia.org/wiki/HTTP_codes#4xx_Client_Error

Der Zweck dieses Headers ist genau dies. Anstatt auf eine Anmeldeseite umzuleiten, lautet der richtige Vorgang jedoch wie folgt:

  • Benutzer, die nicht angemeldet sind, versuchen, auf eine Seite mit eingeschränkter Anmeldung zuzugreifen.
  • System identifiziert Benutzer ist nicht protokolliert
  • Das System gibt den HTTP 401-Header zurück und zeigt das Anmeldeformular in derselben Antwort an (keine Umleitung).

Dies ist eine gute Vorgehensweise, z. B. das Bereitstellen einer nützlichen 404-Seite mit Sitemap-Links und einem Suchformular.

Wir sehen uns.

Davis Peixoto
quelle
20
Im RFC heißt es: "Die Antwort MUSS ein WWW-Authenticate-Headerfeld (Abschnitt 14.46) enthalten, das eine für die angeforderte Ressource geltende Herausforderung enthält." Eine 401-Antwort ist wirklich nur anwendbar, wenn ein HTTP-Authentifizierungsschema verwendet wird.
bshacklett
4
In diesem Fall wäre 403 besser, da es besagt, dass der Zugriff einfach verboten ist und der Autorisierungsheader nicht hilft
olanod
@bshacklett WWW-Authenticate kann zusammen mit vielen Authentifizierungsschemata (z. B. Bearer, OAuth) verwendet werden. Siehe developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… und iana.org/assignments/http-authschemes/http-authschemes.xhtml
filip26
Im WWW-Authenticate-Header ist ein Entwurf für die Cookie-basierte HTTP-Authentifizierung als Option enthalten. Siehe: tools.ietf.org/html/draft-broyer-http-cookie-auth-00
aef