2012-06-26 12 views
10

Ich entwickle eine API, die auch eine Authentifizierungs-/Autorisierungskomponente haben wird.Sollte ich 401 oder 405 Response-Code an einen REST-API-Benutzer ohne ausreichenden Zugriff zurückgeben?

Jeder, unabhängig vom Authentifizierungsstatus, kann schreiben (POST), aber abhängig davon, ob Sie nicht authentifiziert, als normaler Benutzer authentifiziert oder als Administrator authentifiziert sind und auf welche Ressource Sie zugreifen möchten um verschiedene Antworten für GET, DELETE und PUT zurückzugeben.

Ich versuche, den am besten geeigneten Antwortcode für einen Benutzer herauszufinden, der nicht authentifiziert und/oder autorisiert ist.

Beachten Sie http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html:

Unauthorized -> 401

Verboten -> 403

Methode nicht erlaubt -> 405

Lassen Sie sich ein spezifischen Beispiele verwenden:

  • John Doe ist nicht authentifiziert, auf DELETE sollte er eine 401 oder eine 405 erhalten?
  • Amy ist authentifiziert aber nicht autorisiert, auf DELETE sollte sie eine 403 oder eine 405 erhalten?

(Beachten Sie, dass, obwohl John und Amy sind verboten oder nicht autorisiert das bedeutet nicht, sie in der Lage Arent die gleiche Ressource mit einem anderen HTTP-Verb zuzugreifen.)

Dank.

+0

Siehe auch http://stackoverflow.com/questions/3297048/403-forbidden-vs-401-unauthorized-http-responses – Ryan

+0

So John sollte 401 erhalten, sollte Amy 403. – Ryan

+0

405 Methode nicht erlaubt scheint [völlig unabhängig] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html). – Ryan

Antwort

11

405 Method Not Allowed sollte nur verwendet werden, wenn Sie die Methode nicht unterstützen. Es sollte nicht verwendet werden, um den Client mitzuteilen, dass sie diese Methode nicht verwenden können.

Also der einzige gute HTTP-Code in Ihrem Fall wäre 401 Unauthorized. Sie gibt dem Client an, dass die Methode existiert und dass sie sich anmelden muss, um darauf zugreifen zu können.

+3

Fast. Sobald Sie authentifiziert wurden, aber nicht dürfen, ist es 403. –

+0

@JulianReschke, hmmm nicht sicher. Für 403 gibt der Standard an, dass "Im Gegensatz zu einer nicht autorisierten Antwort 401 die Authentifizierung keinen Unterschied macht". Aber in diesem Fall würde das Authentifizieren * einen Unterschied machen, da es den Zugriff auf die Ressource erlauben würde. –

+2

Laurent: "Der Server hat die Anfrage verstanden, weigert sich aber, sie zu autorisieren. Die Angabe verschiedener Benutzerauthentifizierungsdaten ist zwar erfolgreich, aber alle in der Anfrage angegebenen Anmeldeinformationen sind nicht ausreichend. Die Anfrage SOLLTE NICHT mit denselben Anmeldedaten wiederholt werden." - http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p2-semantics-latest.html#status.403 –

7

In diesem Fall denke ich einige Beispiele für Klärung zu sorgen sind nützlich:

  • Unauthenticated + unterstützte Methode = 401
  • Unauthenticated + nicht unterstützte Methode = 405
  • authentifizierte + Autorisierte + Unterstützte method = 2xx
  • Authentifiziert + Autorisiert + Nicht unterstützte Methode = 405
  • Au thenticated + Unerlaubte + unterstützte Methode = 403
  • authentifiziert + Unerlaubte + nicht unterstützte Methode = 405

Mit anderen Worten, von einem prozeduralen Standpunkt:

  1. prüfen, ob Methoden unterstützt werden. Wenn nicht: 405
  2. Wenn unterstützt, überprüfen Sie, ob der Benutzer authentifiziert ist. Wenn nicht: 401
  3. Wenn authentifiziert, überprüfen Sie, ob der Benutzer berechtigt ist. Falls nicht: 403
  4. Wenn berechtigt: 2xx

EDIT: stieß ich auf diesem Diagramm und dachte, dass es für jeden nützlich sein könnten sonst die über dieses Thema stolpern könnten. Klicken um zu vergrößern.

enter image description here

Original-here.

+1

Wow, das ist unglaublich detailliert. Ich bete zu den Entwicklergöttern, dass ich nie mehr als 5% dieses Flussdiagramms verwenden muss. –