2012-06-26 27 views
10

Estoy desarrollando una API que también tendrá un componente de autenticación/autorización.¿Debo devolver un código de respuesta 401 o 405 a un usuario de API REST sin suficiente acceso?

Cualquier persona, independientemente del estado de autenticación, podrá escribir (POST), pero dependiendo de si no está autenticado, autenticado como usuario normal o autenticado como administrador y a qué recurso está intentando acceder, voy a para devolver diferentes respuestas para GET, DELETE y PUT.

Estoy tratando de encontrar el código de respuesta más apropiado para un usuario que no está autenticado y/o autorizado.

Tenga en cuenta http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html:

no autorizada -> 401

Prohibida -> 403

Método no permitido -> 405

Vamos a usar a ejemplos específicos:

  • John Doe no está autenticado, en DELETE ¿debería recibir un 401 o un 405?
  • Amy está autenticada pero no autorizada, en DELETE ¿debería recibir un 403 o un 405?

(Tenga en cuenta que a pesar de que John y Amy están prohibidas o no autorizadas que no significa que enviaban capaz de acceder al mismo recurso con un verbo HTTP diferente.)

Gracias.

+0

Véase también http://stackoverflow.com/questions/3297048/403-forbidden-vs-401-unauthorized-http-responses – Ryan

+0

Así que John debería obtener un 401, Amy debería obtener un 403. – Ryan

+0

405 Método no permitido parece [totalmente sin relación] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html). – Ryan

Respuesta

11

405 Method Not Allowed solo deben usarse si usted no es compatible con el método. No se debe usar para indicar al cliente que no pueden usar este método.

Así que el único buen código HTTP en su caso sería 401 Unauthorized. Indica al cliente que el método existe y que necesitan iniciar sesión para acceder a él.

+3

Casi. Una vez que haya sido autenticado, pero no se le permite hacer la operación, será 403. –

+0

@JulianReschke, hmmm no estoy seguro. Para 403, la norma establece que "A diferencia de una respuesta 401 no autorizada, la autenticación no hará ninguna diferencia". Pero en este caso, la autenticación * haría * la diferencia, ya que permitiría acceder al recurso. –

+2

Laurent: "El servidor entendió la solicitud, pero se niega a autorizarla. Proporcionar diferentes credenciales de autenticación de usuario podría ser exitosa, pero las credenciales que se proporcionaron en la solicitud son insuficientes. La solicitud NO DEBE repetirse con las mismas credenciales". - http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p2-semantics-latest.html#status.403 –

7

En este caso, creo que proporciona algunos ejemplos de aclaración son útiles:

    método admitido
  • no autenticado + = 401
  • método no compatible
  • no autenticado + = 405
  • autenticados + autorizado + método admitido = 2xx
  • Authenticated + Authorized + Unsupported method = 405
  • Au thenticated + no autorizado método admitido + = 403
  • autenticados + método no compatible + no autorizada = 405

En otras palabras, desde el punto de vista de procedimiento:

  1. Compruebe si son compatibles métodos. De lo contrario: 405
  2. Si es compatible, verifique si el usuario está autenticado. Si no: 401
  3. Si está autenticado, verifique si el usuario está autorizado. Si no es así: 403
  4. Si autorizada: 2xx

EDIT: me encontré con este diagrama y pensé que podría ser útil para cualquier persona que pueda tropezar con este post. Click para agrandar.

enter image description here

original here.

+1

Guau, eso es increíblemente detallado. Ruego a los dioses desarrolladores que nunca necesitaré usar más del 5% de este diagrama de flujo. –

Cuestiones relacionadas