wake-up-neo.com

RESTful Login Failure: Rückgabe 401 oder benutzerdefinierte Antwort

Dies ist eine konzeptionelle Frage.

Ich habe eine Client-Anwendung (für Mobilgeräte), die eine Anmeldeaktion für einen RESTful-Webdienst unterstützen muss. Da der Webdienst REST-fähig ist, bedeutet dies, dass der Client einen Benutzernamen/ein Kennwort vom Benutzer akzeptiert, diesen Benutzernamen/dieses Kennwort mit dem Dienst überprüft und sich dann nur daran erinnert, 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, ob der Webdienst, wenn ich den Webdienst abfrage, nur um herauszufinden, ob ein bestimmter Benutzername/ein bestimmtes Kennwort gültig ist, immer mit JSON-Daten antwortet, die mir den Erfolg oder Misserfolg des Webdiensts mitteilen, oder ob er HTTP 200 bei guten Anmeldeinformationen und HTTP zurückgibt 401 auf schlechte 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 der 401-Antworten handelt es sich jedoch um eine Ressource, auf die Sie ohne gültige Anmeldeinformationen keinen Zugriff haben sollten. Die Login-Ressource sollte jedoch für jeden zugänglich sein, da der gesamte Zweck der Login-Ressource darin besteht, Ihnen mitzuteilen, ob Ihre Anmeldeinformationen gültig sind.

Anders ausgedrückt scheint mir 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. Wie wird das normalerweise gehandhabt, und wie ist es logisch angebracht, damit umzugehen?

86
Matt

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

401 Unauthorized Ähnlich wie 403 Forbidden, 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 Abfrage enthält.

Ihre Verwirrung über, myservice.com/are/these/credentials/valid das Zurücksenden von 401, wenn Sie nur eine Prüfung durchführen, basiert 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 Anforderung sollte eine Ressource zurückgeben Boolesche Fragen in einem RESTful-Service sind eine schlüpfrige Aufgabe für RPC.

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

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

105
Cleric

401 sollte nur gesendet werden, wenn für die Anforderung ein Berechtigungsheaderfeld erforderlich ist und die Berechtigung fehlschlägt. Da die Login-API keine Autorisierung erfordert, 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-Authentifizierungsheaderfeld (Abschnitt 14.47) enthalten, das eine für die angeforderte Ressource geltende Abfrage enthält. Der Kunde KANN die Anfrage mit einem geeigneten Authorization-Header-Feld 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 Antwort 401 dieselbe Herausforderung enthält wie die vorherige Antwort 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. *

16
vinksharma