2009-10-24 22 views
30

Estoy escribiendo una pequeña aplicación que expone una API HTTP REST-ish simple. Estoy atascado tratando de decidir cómo señalar una falla debido a la falta de autorización.Error de autenticación de señalización en una API RESTful

La aplicación no tiene una API para la autenticación, sino que depende de la presencia de una cookie que contiene un token de sesión obtenido por el cliente a través de otro servicio. La aplicación verifica la sesión y usa la identidad obtenida a través del proceso de verificación para realizar la autorización específica de la aplicación. No hay forma de que un cliente se autentique directamente en esta aplicación.

Mi problema es que el código de estado HTTP obvio para rechazar solicitudes no autorizadas, "401 no autorizado", se especifica en términos del encabezado "WWW-Authenticate". Ver rfc2616 sec 10.4.2.

la respuesta debe incluir un campo de cabecera WWW-Authenticate (sección 14,47) que contiene un desafío aplicable al recurso solicitado.

No puedo creer que este sea un problema poco común. ¿Es común simplemente sobrecargar 401 para incluir usos más generales? ¿Qué pasa con los navegadores que muestran diálogos de autenticación/e (que por cierto no he visto en mis pruebas, por lo que tal vez no suceda con los POST)?

En pocas palabras: ¿está bien utilizar 401 en este contexto, o hay una solución mejor?

+5

No es una API RESTful si está utilizando una cookie. Los servicios REST son apátridas por definición. –

+0

Punto justo: Cambié mi descripción a REST-ish, en lugar de RESTful. ¿Cree que la respuesta es implementar correctamente la autenticación por solicitud o abandonar mi intento de RESTishness? – j0ni

+0

Es difícil de decir, depende de su aplicación. El enfoque REST tiene algunas ventajas. Si quieres seguir usando la sesión del lado del servidor, devolvería 403 como dijo Tvanfosson. –

Respuesta

30

Normalmente, se habían enviado a un 401 si el cliente puede autenticar y resolver el problema, pero ya que no proporciona una manera de autenticar en la API, me sugeriría devolver un error 403 (prohibido) en su lugar. Esto no requerirá el encabezado e indicará al cliente que no puede acceder al servicio.

+2

Si el método de solicitud no era HEAD y el servidor desea hacer público por qué no se ha cumplido la solicitud, DEBERÍA describir el motivo de la denegación en la entidad. Si el servidor no desea poner esta información a disposición del cliente, se puede usar el código de estado 404 (No encontrado). (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) – vquintans

+1

@vquintans 404 no encontrado parece que podría ser ambiguo en este caso. Supongamos que el cliente solicita un recurso en particular que puede existir o no, pero que no tiene la cookie. ¿Cómo interpretarías el error 404? Falló porque el recurso no estaba disponible o con un error de autenticación. Me quedaría con la respuesta que indica claramente la necesidad de autorización. – tvanfosson

+0

Sí, estoy de acuerdo. Pero en cualquier caso, creo que es interesante destacar esa posibilidad de la RFC. – vquintans

8

Volver algo como esto:

HTTP/1.1 401 Unauthorized 
Location: https://example.com/auth-app/login