RESTful Login Failure: Rückgabe 401 oder benutzerdefinierte Antwort

103

Dies ist eine konzeptionelle Frage.

Ich habe eine Client- (mobile) Anwendung, die eine Anmeldeaktion für einen RESTful-Webdienst unterstützen muss. Da der Webdienst RESTful ist, bedeutet dies, dass der Client einen Benutzernamen / ein Kennwort vom Benutzer akzeptiert, diesen Benutzernamen / dieses Kennwort mit dem Dienst überprüft und dann nur daran denkt, diesen Benutzernamen / dieses Kennwort bei allen nachfolgenden Anforderungen zu senden.

Alle anderen Antworten in diesem Webdienst werden in einem JSON-Format bereitgestellt.

Die Frage ist, wenn ich den Webdienst einfach abfrage, um herauszufinden, ob ein bestimmter Benutzername / ein bestimmtes Kennwort gültig ist, ob der Webdienst immer mit JSON-Daten antwortet, die mir mitteilen, ob er erfolgreich oder nicht erfolgreich ist, oder ob er HTTP 200 mit guten Anmeldeinformationen und HTTP zurückgibt 401 bei schlechten Anmeldeinformationen.

Der Grund, den ich frage, ist, dass einige andere RESTful-Dienste 401 für fehlerhafte Anmeldeinformationen verwenden, selbst wenn Sie nur fragen, ob die Anmeldeinformationen gültig sind. Nach meinem Verständnis von 401-Antworten handelt es sich jedoch um eine Ressource, auf die Sie ohne gültige Anmeldeinformationen keinen Zugriff haben sollten. Die Anmelderessource SOLLTE jedoch für jedermann zugänglich sein, da der gesamte Zweck der Anmelderessource darin besteht, Ihnen mitzuteilen, ob Ihre Anmeldeinformationen gültig sind.

Anders ausgedrückt, es scheint mir, dass eine Anfrage wie:

myservice.com/this/is/a/user/action 

sollte 401 zurückgeben, wenn falsche Anmeldeinformationen angegeben werden. Aber eine Anfrage wie:

myservice.com/are/these/credentials/valid

sollte niemals 401 zurückgeben, da diese bestimmte URL (Anfrage) mit oder ohne gültige Anmeldeinformationen autorisiert ist.

Ich würde gerne einige berechtigte Meinungen dazu hören. Was ist die Standardmethode, um damit umzugehen, und ist die Standardmethode, um damit umzugehen, logisch angemessen?

Matt
quelle

Antworten:

127

Zuerst. 401 ist der richtige Antwortcode zum Senden, wenn eine fehlgeschlagene Anmeldung erfolgt ist.

401 Nicht autorisiert Ähnlich wie 403 Verboten, jedoch speziell zur Verwendung, wenn eine Authentifizierung erforderlich ist und fehlgeschlagen ist oder noch nicht bereitgestellt wurde. Die Antwort muss ein WWW-Authenticate-Headerfeld enthalten, das eine für die angeforderte Ressource geltende Herausforderung enthält.

Ihre Verwirrung darüber, myservice.com/are/these/credentials/valid401 zurückzusenden, wenn Sie nur eine Prüfung durchführen, beruht meiner Meinung nach auf der Tatsache, dass das Ausführen von booleschen Anforderungen in REST häufig durch die RESTful-Einschränkungen falsch ist. Jede Anfrage sollte eine Ressource zurückgeben. Boolesche Fragen in einem RESTful-Service zu stellen, ist eine schlüpfrige Angelegenheit für RPC.

Jetzt weiß ich nicht, wie sich die Dienste verhalten, die Sie sich angesehen haben. Eine gute Möglichkeit, dies zu lösen, besteht darin, ein Kontoobjekt zu haben, das Sie abrufen möchten. Wenn Ihre Anmeldeinformationen korrekt sind, erhalten Sie das Kontoobjekt. Wenn Sie keine Bandbreite nur für eine "Überprüfung" verschwenden möchten, können Sie einen HEAD für dieselbe Ressource ausführen.

Ein Kontoobjekt ist auch ein guter Ort, um all die lästigen booleschen Werte zu speichern, für die es sonst schwierig wäre, individuelle Ressourcen zu erstellen.

Kleriker
quelle
2
Ihr Standpunkt zur Rückgabe von Ressourcen scheint gültig zu sein, und vielleicht ist das hier der richtige Schritt. Was die Feststellung betrifft, dass 401 die richtige Antwort ist, würde ich mich über eine Erklärung freuen. Ich habe die HTTP-Spezifikation gelesen, wie Sie hier angegeben haben, aber das ist für mich keine direkte und offensichtliche Bestätigung Ihrer Behauptung. Die Authentifizierung ist nämlich NICHT erforderlich, um nach der Gültigkeit von Anmeldeinformationen zu fragen. Was Sie jedoch angegeben haben, lautet "speziell für die Verwendung, wenn eine Authentifizierung erforderlich ist".
Matt
3
Ihre Sichtweise ist richtig. Sie müssen nicht authentifiziert sein, um nach Ihrem Kontoobjekt fragen zu können. Sie müssen sich jedoch erfolgreich authentifizieren, um die Ressource empfangen zu können. Dies authentication is required and has failed or has not yet been providedgilt auch, da Sie nicht nach der Gültigkeit der Anmeldeinformationen fragen, sondern nach einer bestimmten Ressource, die auf den von Ihnen angegebenen Anmeldeinformationen basiert.
Kleriker
2
Ich verstehe, warum Sie einen "Check-Call" durchführen möchten, und dafür würde ich 401 weiterhin als geeigneten Antwortcode für eine fehlgeschlagene Authentifizierung heraufstufen, selbst wenn für den Anruf keine Authentifizierung erforderlich ist, um aufrufbar zu sein. Ein 204 No Content mag ebenfalls geeignet sein, fühlt sich aber etwas mehrdeutig an.
Kleriker
4
Ich sehe nicht, wie dies korrekt sein kann, es sei denn, Sie verwenden die Standard- oder Digest-Authentifizierung. Gemäß dem zitierten Teil der Spezifikation: "Die Antwort muss eine WWW-Authentifizierung enthalten" - und wenn Sie sich auf Abschnitt 14.47 beziehen: "Der HTTP-Zugriffsauthentifizierungsprozess wird unter" HTTP-Authentifizierung: Standard- und Digest-Zugriffsauthentifizierung "beschrieben. Dies impliziert Für mich ist 401 nicht geeignet, wenn Sie eine typische E-Mail- / Passwortüberprüfung verwenden.
Jonah
1
Ich denke, dies könnte falsch sein. Ich habe sowohl Web- als auch Mobile-Clients implementiert und fange 401 ab, um zum Anmeldebildschirm umzuleiten. Wenn sich jedoch bereits jemand auf dem Anmeldebildschirm befindet und falsche Anmeldeinformationen übermittelt, hat die Antwort ebenfalls 401 und versucht erneut, umzuleiten. Es sollte einen anderen Statuscode für den fehlgeschlagenen Versuch geben, sich beim expliziten Versuch zu authentifizieren. Vielleicht eine schlechte Anfrage oder sogar ein Serverfehler?
Japheth Ongeri - Inkalimeva
28

401 sollte nur gesendet werden, wenn die Anforderung ein Autorisierungsheaderfeld benötigt und die Autorisierung fehlschlägt. Da für die Login-API keine Autorisierung erforderlich ist, ist 401 meiner Meinung nach der falsche Fehlercode

Gemäß dem Standard hier https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

* 10.4.2 401 Nicht autorisiert

Die Anforderung erfordert eine Benutzerauthentifizierung. Die Antwort MUSS ein WWW-Authenticate-Headerfeld (Abschnitt 14.47) enthalten, das eine Herausforderung enthält, die für die angeforderte Ressource gilt. 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 Anmeldeinformationen 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. *

Vinksharma
quelle
8
Ich stimme Ihnen darin zu, aber wie lautet der alternative Antwortstatus, den Sie senden möchten? Ich habe sowohl Web- als auch Mobile-Clients implementiert und fange 401 ab, um zum Anmeldebildschirm umzuleiten. Aber wenn sich bereits jemand auf dem Anmeldebildschirm befindet und falsche Anmeldeinformationen übermittelt, hat die Antwort ebenfalls 401 und wird versuchen, erneut umzuleiten ... was würden Sie tun?
Japheth Ongeri - Inkalimeva
0

Geben Sie 409 mit einer korrekten Fehlermeldung zurück.

Garnelenwagen
quelle