Was ist der geeignete HTTP-Statuscode, der zurückgegeben werden soll, wenn ein Benutzer versucht, sich mit einem falschen Benutzernamen / Passwort, aber korrektem Format anzumelden?

76

Eine ähnliche Frage wird hier gestellt: Was ist ein geeigneter HTTP-Statuscode, der von einem REST-API-Service für einen Validierungsfehler zurückgegeben werden kann?

Die Antwort im obigen Thread lautet: "Wenn der URI beispielsweise ein ISO-8601-Datum haben soll und Sie feststellen, dass er im falschen Format vorliegt oder sich auf den 31. Februar bezieht, würden Sie einen HTTP 400 zurückgeben. Das Gleiche gilt, wenn Sie dies erwarten." wohlgeformtes XML in einem Entitätskörper und es kann nicht analysiert werden. "

Was passiert jedoch, wenn der Benutzer korrekt formatierte Daten übermittelt hat? Damit meine ich, dass der Benutzer eine einfache alphabetische Zeichenfolge / einen Text für den Benutzernamen und das Passwort eingereicht hat (was für meine Anwendung vollkommen gültig ist). Das einzige Problem ist, dass das Passwort nicht mit dem Benutzernamen übereinstimmt. In diesem Fall ist 400 falsch, da es sich um eine vollkommen gültige und wohlgeformte Syntax handelt.

Ein 401 wäre falsch (wie hier vorgeschlagen: Welcher HTTP-Statuscode für Benutzername oder Passwort war falsch? ), Da der Benutzer nicht versucht, auf eine Seite zuzugreifen, sondern lediglich versucht, sich anzumelden und Daten einzugeben, die nicht übereinstimmen.

Wenn Sie auf den ersten Beitrag zurückblicken, auf den ich verlinkt habe, heißt es in der zweiten Antwort, dass 422 die richtige Antwort ist (und für mich richtig aussieht). Ich verwende jedoch Django Rest Framework und 422 ist nicht Teil der Statuscodes (a Eine Liste der Statuscodes, die Teil von DRF sind, finden Sie hier: http://www.django-rest-framework.org/api-guide/status-codes/#client-error-4xx )

404 sieht auch nicht richtig aus, weil die Daten erfolgreich akzeptiert und nicht abgelehnt wurden.

Was ist die wirklich richtige Antwort, die verwendet werden sollte?

user2719875
quelle

Antworten:

105

Der richtige HTTP-Code wäre tatsächlich 401. Aus dem RFC :

Der Statuscode 401 (nicht autorisiert) zeigt an, dass die Anforderung nicht angewendet wurde, da keine gültigen Authentifizierungsdaten für die Zielressource vorliegen. Der Server, der eine 401-Antwort generiert, MUSS ein WWW-Authenticate-Headerfeld (Abschnitt 4.1) senden, das mindestens eine für die Zielressource geltende Herausforderung enthält.

Wenn die Anforderung Authentifizierungsdaten enthielt, zeigt die Antwort 401 an, dass die Autorisierung für diese Anmeldeinformationen verweigert wurde. Der Benutzeragent KANN die Anforderung mit einem neuen oder ersetzten Autorisierungsheaderfeld wiederholen (Abschnitt 4.2).

sjagr
quelle
Oh, du hast recht, 401 ist das, was ich verwenden sollte. Wow, ich kann nicht glauben, dass ich den zweiten Teil der Erklärung verpasst habe. Vielen Dank. Ich werde diese Frage in 8 Minuten als richtig markieren, wenn es mir erlaubt.
user2719875
Von dem Teil, den Sie zitieren, zeigt eine 401-Antwort an, dass die Anforderung nicht angewendet wurde . Daher wurde nicht einmal ein Anmeldeversuch unternommen , da zunächst eine Autorisierung auf einer niedrigeren Ebene erforderlich ist. Dies kann normalerweise passieren, wenn mehrere Sicherheitsebenen verschachtelt sind. Dies ist eine gültige Antwort, um die Anforderung anzugeben, mit einer äußeren Ebene zu authentifizieren, bevor versucht wird, mit einer inneren Ebene zu authentifizieren.
Spektren
@spectras "Die Anforderung wurde nicht angewendet, da keine gültigen Authentifizierungsdaten für die Zielressource vorliegen." Ich verweise jedoch auf den zweiten Teil, in dem die Anforderung Authentifizierungsdaten enthielt und abgelehnt wurde, einen separaten Fall und Abschnitt . Wenn Sie jedoch Haare darüber teilen möchten, schlagen Sie stattdessen möglicherweise einen besseren Statuscode vor.
Sjagr
2
@sjagr> Eigentlich habe ich kommentiert, weil ich Ihre Antwort auf meine Frage zu derselben Frage hier verlinkt habe : stackoverflow.com/a/32897804/3212865 . Der Hauptpunkt ist, dass die Frage verschiedene Kommunikationsebenen verwechselt und die orthogonalste Antwort tatsächlich 200 ist. Dies bedeutet, dass „die Anforderung erfolgreich verarbeitet wurde und ein entsprechender Anmeldeversuch unternommen wurde, um das Ergebnis im Inhalt der Antwort zu finden“ . Der Versuch, einen Fehler auf Anwendungsebene in einem Statuscode auf Transportebene auszudrücken, ist ein Konstruktionsfehler.
Spektren
6
Ich denke, diese Antwort ist falsch. Die Anforderung für eine begleitende WWW-AuthenticateImplikation 401 besteht darin, zur Authentifizierung über HTTP Basic oder ähnliches aufzufordern. Für fehlgeschlagene Anmeldungen (in einem typischen Cookie-basierten Anmeldeszenario) sollten Sie 403 verwenden, wie in dieser Antwort erläutert: webmasters.stackexchange.com/questions/24443/…
Callum
-16

Ich denke, dass es gut sein wird, den Antwortstatuscode 200 einzustellen . Um einen Angriff auf die Wortliste zu verhindern. In riesigen massiven Cyberkriminellen konnte nicht identifizieren, welche Anfrage und Antworten richtig sind)))

Levon
quelle
3
Dafür sind Ratenbegrenzung und Timeouts / Blacklisting gedacht.
T1960CT
3
Ein "Cyberkrimineller" kann stattdessen den Körper der Antwort analysieren.
Dionyziz