webentwicklung-frage-antwort-db.com.de

HTTP 401 Unauthorized oder 403 Forbidden für einen "behinderten" Benutzer?

Ein Authentifizierungsdienst ermöglicht das Deaktivieren von Benutzerkonten (eine Art Soft-Delete).

Wenn der Server dann eine Authentifizierungsanforderung für einen deaktivierten Benutzer erhält, die ansonsten gültig wäre, sollte der Server 401 oder 403 zurückgeben? Mit beiden Statuscodes würde ich eine Nachricht zurückgeben, die angibt, dass das Konto deaktiviert wurde.

Zum schnellen Nachschlagen relevante Zitate aus HTTP/1.1-Spezifikation (Hervorhebung meiner):

401 Nicht autorisiert

Die Anforderung erfordert eine Benutzerauthentifizierung. Die Antwort MUSS ein WWW-Authenticate-Headerfeld (Abschnitt 14.47) enthalten, das eine für die angeforderte Ressource geltende Abfrage enthält. Der Client KANN die Anforderung mit einem geeigneten Feld für den Autorisierungsheader wiederholen (Abschnitt 14.8). Wenn die Anforderung bereits Berechtigungsnachweise enthielt, zeigt die Antwort 401 an, dass die Berechtigung für diese Berechtigungsnachweise verweigert wurde . Wenn die 401-Antwort dieselbe Herausforderung wie die vorherige Antwort enthält und der Benutzeragent bereits mindestens einmal versucht hat, sich zu authentifizieren, MUSS dem Benutzer die Entität angezeigt werden, die in der Antwort angegeben wurde , da diese Entität möglicherweise relevante Diagnoseinformationen enthält. Die HTTP-Zugriffsauthentifizierung wird unter "HTTP-Authentifizierung: Standard- und Digest-Zugriffsauthentifizierung" [43] erläutert.

403 Verboten

Der Server hat die Anfrage verstanden, lehnt sie jedoch ab. Die Autorisierung wird nicht helfen und die Anfrage SOLLTE NICHT wiederholt werden . Wenn die Anforderungsmethode nicht HEAD und der Server öffentlich machen möchte, warum die Anforderung nicht erfüllt wurde, MUSS sie den Grund für die Ablehnung in der entity . Wenn der Server dem Client diese Informationen nicht zur Verfügung stellen möchte, kann stattdessen der Statuscode 404 (Not Found) verwendet werden.

26
Dolph

Basierend auf eine E-Mail geschrieben von Roy T. Fielding gibt es anscheinend einen Fehler in der aktuellen HTTP-Spezifikation.

Die Art und Weise, wie die Spezifikation gelesen werden soll , ist wie folgt (unter Verwendung von Anführungszeichen aus der obigen E-Mail):

401 "Nicht authentifiziert" :

sie können dies nicht tun, weil Sie sich nicht authentifiziert haben

403 "Nicht autorisiert" :

der Benutzeragent hat gültige Anmeldeinformationen gesendet, hat jedoch keinen Zugriff

Im Fall eines behinderten Benutzers ist 403 die richtige Antwort (und 404 ist auch eine Option).

42
Dolph

Ich habe zwei verschiedene Antworten, was in diesem Fall zurückgegeben werden soll.

Semantische Wahl - 401 Nicht autorisiert. In diesem Fall hat Ihr Client Anmeldeinformationen bereitgestellt, und die Anforderung wurde aufgrund der spezifischen Anmeldeinformationen abgelehnt. Wenn der Client es erneut mit einem anderen Satz von Anmeldeinformationen versucht oder das Konto in Zukunft erneut aktiviert wird, ist dieselbe Anforderung möglicherweise erfolgreich.

Sicherheitswahl - 404 nicht gefunden. Viele Dienste geben bei Fehlern einfach eine 404 zurück, um Informationslecks zu vermeiden. Github fällt mir sofort ein.

Von Allgemeine API-Informationen in den Entwicklerdokumenten von github:

Nicht authentifizierte Anforderungen geben 404 zurück, um jeglichen Verlust privater Informationen zu verhindern.

Für etwas, das ich als öffentlicher Dienst bereitgestellt habe, würde ich wahrscheinlich 404 verwenden, um einem Angreifer keine Hinweise auf seine Anmeldeinformationen zu geben. Wenn es nur für den internen Verbrauch oder zum Testen gedacht wäre, würde ich wahrscheinlich 401 zurückgeben.

11
aalpern

technisch sind beide richtig, es kommt wirklich darauf an, wie viel Sie preisgeben möchten.

das Zurücksenden eines 401 sagt dem Anrufer, dass das Konto nicht gültig ist, was korrekt ist, aber wenn Ihre API dann erneut aufgerufen wird, um einen Benutzer mit denselben Anmeldeinformationen zu registrieren, bei denen der Anruf ebenfalls fehlschlagen würde. Das könnte für den Anrufer nicht von Nutzen sein.

es hängt also wirklich davon ab, wie Ihre API verwendet wird und wer/was die Zielgruppe ist.

2
Antony Scott