Welchen HTTP-Code sollte ich für einen Authentifizierungsfehler eines Drittanbieters verwenden?

8

Ich erstelle eine Anwendung, die in Anwendungen von Drittanbietern integriert ist.

Zu diesem Zweck sendet der angemeldete Benutzer einen API-Schlüssel für die Integration durch Dritte.

Welche HTTP-Antwort sollte ich zurückgeben, falls der von ihnen übermittelte API-Schlüssel ungültig ist (und einen 401 vom Drittanbieter zurückgibt)?

Die Rückgabe eines 401 aus meiner Anwendung klingt verwirrend, da aus Sicht des Frontends unklar ist, ob sie von meiner Anwendung oder der Anwendung eines Drittanbieters nicht authentifiziert wurden.

Ich bin versucht, nur 400 zu vergeben - als hätten sie ein Formular mit einer ungültigen E-Mail-Adresse usw. gesendet.

Dwjohnston
quelle

Antworten:

8

Wenn ich einen Code auswählen müsste, würde ich wahrscheinlich 403 Forbidden zurückgeben.

RFC 7231 §6.5.3 beschreibt den 403-Code wie folgt:

Der Statuscode 403 (Verboten) zeigt an, dass der Server die Anforderung verstanden hat, sich jedoch weigert, sie zu autorisieren. Ein Server, der veröffentlichen möchte, warum die Anforderung verboten wurde, kann diesen Grund in der Antwortnutzlast (falls vorhanden) beschreiben.

Wenn in der Anforderung Authentifizierungsdaten angegeben wurden, hält der Server diese für unzureichend, um den Zugriff zu gewähren. Der Client sollte die Anforderung NICHT automatisch mit denselben Anmeldeinformationen wiederholen. Der Client kann die Anforderung mit neuen oder anderen Anmeldeinformationen wiederholen. Eine Anfrage kann jedoch aus Gründen verboten sein, die nicht mit den Anmeldeinformationen zusammenhängen.

Ein Ursprungsserver, der die aktuelle Existenz einer verbotenen Zielressource "verbergen" möchte, KANN stattdessen mit dem Statuscode 404 (Nicht gefunden) antworten.

Dieser Statuscode wird häufig als generische Antwort "Authentifizierung fehlgeschlagen" verwendet und löst wahrscheinlich keinen bestimmten Authentifizierungsmechanismus aus, z. B. 401 kann einen Browser dazu zwingen, eine Eingabeaufforderung für Benutzername / Kennwort anzuzeigen. Der spezifische Grund, warum die Authentifizierung fehlgeschlagen ist, kann im Antworttext entweder in maschinenlesbarer Form (z. B. JSON oder XML) oder als lesbares Dokument (z. B. HTML) beschrieben werden.

Code 400 ist hier nicht die schlechteste Wahl, aber eher allgemein.

user3840170
quelle
3

Sie können den Statuscode HTTP-Statuscode 407 (Proxy-Authentifizierung erforderlich) verwenden. Aus der Mozilla-Entwicklerreferenz :

Der Antwortcode für den HTTP 407-Proxyauthentifizierungs-erforderlichen Clientfehlerstatus gibt an, dass die Anforderung nicht angewendet wurde, da keine gültigen Authentifizierungsdaten für einen Proxyserver zwischen dem Browser und dem Server vorhanden sind, der auf die angeforderte Ressource zugreifen kann.

Ihre Backend-Anwendung verhält sich wie ein Proxy für die API eines Drittanbieters. In diesem Fall ist es in Ordnung, 407 zu verwenden.

Iskander Raimbayev
quelle
Auf derselben Seite heißt es: "Dieser Status wird mit einer Proxy-AuthenticateKopfzeile gesendet , die Informationen zur korrekten Autorisierung enthält." Was denkst du sollte drin stehen? In RFC 7235 heißt es außerdem: "Der Client kann die Anforderung mit einem neuen oder ersetzten Proxy-Authorization-Header-Feld wiederholen." Es scheint also Teil eines sehr spezifischen Mechanismus zu sein, der für die Situation des Fragestellers nicht gilt.
user3840170
2
"... ein Proxyserver, der sich zwischen dem Browser und dem Server befindet, der auf die angeforderte Ressource zugreifen kann" nicht ganz die gleiche Situation, die das OP beschreibt. Dies würde gelten, wenn der OP-eigene Dienst den Benutzer, der eine Ressource vom Drittanbieter-Dienst anfordert, nicht authentifizieren würde ...
Zohar Peled
2

407das ist nicht richtig. In diesem Fall ist Ihr Code der Proxy und wird authentifiziert. Es ist ein fremdes System, das nicht authentifiziert ist.

401ist vernünftig, aber es ist irreführend, was nicht authentifiziert ist, da der Client bei Ihrem System authentifiziert ist. Dies funktioniert auch nicht, wenn Ihre ausländische Authentifizierung erst nach einem 100Continue zurückgestellt wird.

400 ist nicht korrekt, da die Anforderung im Format gültig war, die Authentifizierung jedoch beim Fremdagenten fehlgeschlagen ist.

Alle anderen 4xxAntworten werden hier leicht als nicht zutreffend abgetan.

Damit bleibt 403Verboten, was meiner Meinung nach Ihre einzige echte Option in diesem Fall ist:

403Verboten Der Client hat keine Zugriffsrechte auf den Inhalt. Das heißt, es ist nicht autorisiert, sodass der Server die Angabe der angeforderten Ressource verweigert. Im Gegensatz zu 401 ist die Identität des Clients dem Server bekannt. In diesem Fall kann es auch geeignet sein, auch mit einer Statusmeldung zu antworten, die die "Grundursache" des Fehlers angibt. Es hängt wirklich von der Sicherheitsbereitschaft Ihrer Anwendung ab.

Meine $ .02

Ja
quelle
1

Ich würde mit 400 gehen, es erfüllt die semantische Anforderung. Der Benutzer hat einige schlechte Daten angegeben. Wie Sie sagen, impliziert ein 401/403 ein Problem zwischen dem Benutzer und Ihrer Site, nicht zwischen Ihrer Site und einer anderen Anwendung.

In Abschnitt 1 des HTTP 1.1-RFC heißt es:

Einführung

Jede HTTP-Nachricht (Hypertext Transfer Protocol) ist entweder eine Anforderung oder eine Antwort. Ein Server überwacht eine Verbindung auf eine Anforderung, analysiert jede empfangene Nachricht, interpretiert die Nachrichtensemantik in Bezug auf das identifizierte Anforderungsziel und antwortet auf diese Anforderung mit einer oder mehreren Antwortnachrichten. Ein Client erstellt Anforderungsnachrichten, um bestimmte Absichten zu kommunizieren, überprüft empfangene Antworten, um festzustellen, ob die Absichten ausgeführt wurden, und bestimmt, wie die Ergebnisse zu interpretieren sind. Dieses Dokument definiert die HTTP / 1.1-Anforderungs- und Antwortsemantik in Bezug auf die in [RFC7230] definierte Architektur.

Ergo ist die Definition von Statuscodes zwischen einem Client und einem Server. Für mich bedeutet dies, dass Sie diejenige auswählen, die für andere Interaktionen (Server zu Server, Backend usw.) am besten geeignet ist.

Alle anderen hier angebotenen Exoten werden den Verbraucher des Dienstes nur verwirren.

stringy05
quelle
0

Es ist immer gut, 403 zu senden

aber bei Bedarf können Sie json info- hinzufügen

[Serializable]
[DataContract]
class Response
{
    [DataMember]
    public bool IsSuccess { get; set; }
    [DataMember]
    public string Message { get; set; }
    [DataMember]
    public object ResponseData { get; set; }

    public Response(bool status, string message, object data)
    {
        IsSuccess = status;
        Message = message;
        ResponseData = data;
    }
}

Und dann fügen Sie in der Antwort auch die folgenden Informationen hinzu

 return Json(new Response(false, "Login Failed, The user name or password provided is incorrect.", null));

Wenn eine Anfrage gestellt wird, können Sie die Anmeldeschaltfläche deaktivieren - und nur wenn eine Aktualisierung vorgenommen wird, kann die Schaltfläche aktiviert werden - clientseitige Logik.

Anurag.Desai
quelle
0

Das 424 - Failed Dependencypasst in diesem Fall ganz gut.

Der Statuscode 424 (Failed Dependency) bedeutet, dass die Methode nicht für die Ressource ausgeführt werden konnte, da die angeforderte Aktion von einer anderen Aktion abhing und diese Aktion fehlgeschlagen ist.

Javier Pérez Batista
quelle
Es ist von RFC4918 tools.ietf.org/html/rfc4918 . 11.4 Seite 78
Javier Pérez Batista
0

Ich neige mich zu 407. 407 Proxy-Authentifizierung erforderlich Dieser Code ähnelt 401 (nicht autorisiert), gibt jedoch an, dass sich der Client zuerst beim Proxy authentifizieren muss. Der Proxy MUSS ein Proxy-Authenticate-Header-Feld (Abschnitt 14.33) zurückgeben, das eine Herausforderung enthält, die für den Proxy für die angeforderte Ressource gilt. Der Client kann die Anforderung mit einem geeigneten Proxy-Authorization-Header-Feld wiederholen (Abschnitt 14.34). Die HTTP-Zugriffsauthentifizierung wird unter "HTTP-Authentifizierung: Standard- und Digest-Zugriffsauthentifizierung" erläutert. wie Iskander erwähnte.

Es weist den Benutzer am besten darauf hin, wo das Problem liegen könnte. Sie können auch fortfahren und den Proxy-Autorisierungsheader so implementieren, dass er vollständig mit den Spezifikationen übereinstimmt.

Wenn Sie 400 verwenden, kratzt sich Ihr Kunde am Kopf und sucht nach dem, was er beim Erstellen der Anfrage falsch macht.

Die Verwendung von 401 oder 403 ist sinnvoller, um sie für Ihre eigene API-Authentifizierung und -Autorisierung aufzubewahren.

502 weist den Benutzer darauf hin, dass das Problem vorgelagert ist, sodass er möglicherweise hängen bleibt, bis Sie es beheben.

Tomas Fornara
quelle
0

Ich würde mit 401 stehen. Der 401 401 Unauthorized-Fehler ist ein HTTP-Statuscode. Dies bedeutet, dass die Seite, auf die der Benutzer zugreifen wollte, erst geladen werden kann, wenn sich der Benutzer zum ersten Mal mit einer gültigen Benutzer-ID und einem gültigen Kennwort anmeldet. Wenn sich der Benutzer gerade angemeldet und den Fehler 401 Unauthorized erhalten hat, bedeutet dies, dass die vom Benutzer eingegebenen Anmeldeinformationen aus irgendeinem Grund ungültig waren. In unserem Fall war der von ihnen übermittelte API-Schlüssel ungültig. Es gibt ein Aktivitätsdiagramm, das ich verwendet habe, als ich eine Verwechslung mit den Fehlercodes habe.

Hier unten ist der Link für das gleiche:

https://i.stack.imgur.com/ppsbq.jpg

redhatvicky
quelle
-1

In diesem Fall wurde der Zwischenserver erfolgreich protokolliert, und der Upstream-Server weigert sich, die Authentifizierung aufgrund des ungültigen Schlüssels durchzuführen. Es scheint, dass der 502-Code (Bad Gateway) für diese Situation geeignet ist, da dieser Code für einen Server steht, der als Gateway fungiert (Ihr) und eine ungültige Antwort vom Upstream-Server (Drittanbieter) erhält.

kcats
quelle
Ein 5xx ist hier definitiv nicht die richtige Antwort. Dies ist ein Benutzerfehler, kein Serverfehler.
Dwjohnston