2012-07-30 8 views
55

Esta es una pregunta conceptual.Error de inicio de sesión RESTful: devolución 401 o respuesta personalizada

Tengo una aplicación cliente (móvil) que necesita admitir una acción de inicio de sesión contra un servicio web RESTful. Debido a que el servicio web es RESTful, esto equivale a que el cliente acepte un nombre de usuario/contraseña del usuario, verificando ese nombre de usuario/contraseña con el servicio, y luego simplemente recuerda enviar ese nombre de usuario/contraseña con todas las solicitudes posteriores.

Todas las demás respuestas en este servicio web se proporcionan en formato JSON.

La pregunta es, cuando me consultan el servicio web, simplemente para saber si un nombre de usuario/contraseña dada es válida, si el servicio web siempre responde con datos JSON diciéndome su éxito o fracaso, o debe volver HTTP 200 en buenas credenciales y HTTP 401 en malas credenciales.

La razón por la que pregunto es que algunos otros servicios RESTful usan 401 para las malas credenciales, incluso cuando usted solo está preguntando si las credenciales son válidas. Sin embargo, mi comprensión de las 401 respuestas es que representan un recurso al que se supone que no debe tener acceso sin credenciales válidas. Pero el recurso de inicio de sesión DEBE estar accesible para cualquier persona porque el propósito completo del recurso de inicio de sesión es decirle si sus credenciales son válidas.

Dicho de otra manera, me parece que una petición como:

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

debe devolver 401 si se proporcionan credenciales malas. Pero una petición como:

myservice.com/are/these/credentials/valid 

nunca debe devolver 401 debido a una URL concreta (petición) está autorizada con o sin credenciales válidas.

Me gustaría escuchar opiniones justificadas de una forma u otra sobre esto. ¿Cuál es la forma estándar de manejar esto, y es la forma estándar de manejar esto lógicamente apropiado?

Respuesta

71

Primero apagado. 401 es el código de respuesta adecuado para enviar cuando ha ocurrido un inicio de sesión fallido.

401 Unauthorized Similar a 403 Forbidden, pero específicamente para su uso cuando se requiere autenticación y no ha podido o no ha sido proporcionada. La respuesta debe incluir un campo de encabezado WWW-Authenticate que contenga un desafío aplicable al recurso solicitado.

Su confusión sobre, myservice.com/are/these/credentials/valid el envío de vuelta 401 cuando se acaba de hacer una verificación, creo que se basa en el hecho de que el hacer peticiones booleanas en REST menudo está mal por las restricciones de descanso. Cada solicitud debe devolver un recurso. Hacer preguntas booleanas en un servicio RESTful es una balandra resbaladiza hasta RPC.

Ahora no sé cómo se comporta el servicio que miraba. Pero una buena forma de resolver esto es tener algo así como un objeto de Cuenta, que intentas OBTENER. Si sus credenciales son correctas, obtendrá el objeto Account, si no quiere perder ancho de banda solo para hacer una "comprobación", puede hacer HEAD con el mismo recurso.

Un objeto de cuenta también es un buen lugar para almacenar todos los molestos valores booleanos que de otra manera sería complicado crear recursos individuales.

+1

Su punto sobre la devolución de recursos parece válido y tal vez sea el movimiento correcto aquí. En cuanto a afirmar que 401 es la respuesta adecuada, agradecería alguna explicación allí. He leído las especificaciones HTTP, como las incluyó aquí, pero eso para mí no es una confirmación directa y obvia de su afirmación. A saber, NO se requiere autenticación para preguntar acerca de la validez de las credenciales; sin embargo, lo que incluyó dice "específicamente para su uso cuando se requiere autenticación". – Matt

+2

Su forma de verlo es correcta. No necesita ser autenticado para poder solicitar su objeto de Cuenta. Pero necesita autenticarse con éxito para poder recibir el recurso, y ahí es donde se aplica 'la autenticación es necesaria y ha fallado o no se ha proporcionado todavía', ya que no solicita la validez de las credenciales, sino de un recurso específico basado en las credenciales que usted proporciona – Cleric

+0

Correcto, supongo que expresé mi comentario ambiguamente. SI se devuelve un recurso de cuenta, estoy en su misma página, estoy de acuerdo con su postura. Cuando pregunté nuevamente sobre el 401 me refiero solo al caso en el que estoy pidiendo validez. Entiendo que esto es "incorrecto" desde un enfoque REST, pero me gustaría llegar a una conclusión por el bien de esta pregunta. Entonces, si hago lo incorrecto y pido validez como retorno booleano, ¿sería inapropiado devolver un 401 dado que la autenticación no es realmente necesaria para esa solicitud/consulta? – Matt

Cuestiones relacionadas