Descargo de responsabilidad: soy nuevo en la escuela de pensamiento REST, y estoy tratando de entenderlo.
Entonces, estoy leyendo esta página, Errores comunes de REST , y he descubierto que estoy completamente desconcertado porque la sección sobre sesiones es irrelevante. Esto es lo que dice la página:
No debería ser necesario que un cliente "inicie sesión" o "inicie una conexión". La autenticación HTTP se realiza automáticamente en cada mensaje. Las aplicaciones del cliente son consumidores de recursos, no servicios. Por lo tanto, no hay nada para iniciar sesión. Supongamos que está reservando un vuelo en un servicio web REST. No crea una nueva conexión de "sesión" al servicio. En su lugar, le pide al "objeto creador del itinerario" que le cree un nuevo itinerario. Puede comenzar a completar los espacios en blanco, pero luego obtener un componente totalmente diferente en otra parte de la web para completar algunos otros espacios en blanco. No hay sesión, por lo que no hay problema de migrar el estado de la sesión entre clientes. Tampoco hay problema de "afinidad de sesión"
De acuerdo, entiendo que la autenticación HTTP se realiza automáticamente en cada mensaje, pero ¿cómo? ¿Se envía el nombre de usuario / contraseña con cada solicitud? ¿Eso no solo aumenta el área de superficie de ataque? Siento que me falta parte del rompecabezas.
Sería malo tener un servicio REST, por ejemplo, /session
que acepte una solicitud GET, donde pasaría un nombre de usuario / contraseña como parte de la solicitud, y devuelva un token de sesión si la autenticación fue exitosa, eso podría ser entonces pasó junto con las solicitudes posteriores? ¿Tiene sentido desde el punto de vista REST, o es que falta el punto?
Respuestas:
Para ser RESTful, cada solicitud HTTP debe llevar suficiente información por sí misma para que su destinatario la procese para estar en completa armonía con la naturaleza sin estado de HTTP.
Sí, el nombre de usuario y la contraseña se envían con cada solicitud. Los métodos comunes para hacerlo son la autenticación de acceso básica y la autenticación de acceso de resumen . Y sí, un espía puede capturar las credenciales del usuario. Por lo tanto, uno cifraría todos los datos enviados y recibidos utilizando Transport Layer Security (TLS) .
Esto no sería RESTful ya que tiene un estado, pero es bastante común, ya que es una conveniencia para los usuarios; un usuario no tiene que iniciar sesión cada vez.
Lo que describe en un "token de sesión" se conoce comúnmente como cookie de inicio de sesión . Por ejemplo, si intentas iniciar sesión en tu Yahoo! cuenta hay una casilla de verificación que dice "mantenerme conectado durante 2 semanas". Esto es esencialmente decir (en sus palabras) "mantenga vivo mi token de sesión durante 2 semanas si inicio sesión correctamente". Los navegadores web enviarán dichas cookies de inicio de sesión (y posiblemente otras) con cada solicitud HTTP que usted le solicite.
fuente
No es raro que un servicio REST requiera autenticación para cada solicitud HTTP. Por ejemplo, Amazon S3 requiere que cada solicitud tenga una firma derivada de las credenciales del usuario, la solicitud exacta que se debe realizar y la hora actual. Esta firma es fácil de calcular en el lado del cliente, puede ser verificada rápidamente por el servidor y es de uso limitado para un atacante que la intercepta (ya que se basa en la hora actual).
fuente
Muchas personas no entienden los principales REST muy claramente, el uso de un token de sesión no significa que siempre tenga estado, la razón para enviar un nombre de usuario / contraseña con cada solicitud es solo para la autenticación y lo mismo para enviar un token (generado por inicio de sesión proceso) solo para decidir si el cliente tiene permiso para solicitar datos o no, ¡solo viola las convenciones REST cuando usa un nombre de usuario / contraseña o tokens de sesión para decidir qué datos mostrar! en su lugar, debe usarlos solo para la autenticación (para mostrar datos o no)
en su caso, digo SÍ, esto es RESTy, ¡pero trate de evitar el uso de sesiones php nativas en su API REST y comience a generar sus propios tokens hash que caducan en un período de tiempo determinado!
fuente
No, no se pierde el punto. ClientLogin de Google funciona exactamente de esta manera con la notable excepción de que se le indica al cliente que vaya a la "/ sesión" utilizando una respuesta HTTP 401. Pero esto no crea una sesión, solo crea una forma para que los clientes se autentiquen (temporalmente) sin pasar las credenciales de forma clara, y para que el servidor controle la validez de estas credenciales temporales como mejor le parezca.
fuente
"Autorización:" encabezado HTTP enviado por el cliente. Ya sea básico (texto sin formato) o resumen.
La idea de la sesión es hacer con estado aplicaciones que utilizan el protocolo sin estado (HTTP) y el cliente mudo (navegador web), por el mantenimiento del estado del lado del servidor. Uno de los principios de REST es "Cada recurso es direccionable de manera única utilizando una sintaxis universal para usar en enlaces hipermedia" . Las variables de sesión son algo a lo que no se puede acceder a través de URI. La aplicación verdaderamente RESTful mantendría el estado del lado del cliente, enviando todas las variables necesarias por HTTP, preferiblemente en el URI.
Ejemplo: búsqueda con paginación. Tendrías URL en forma
Tiene mucho en común con las URL marcables
fuente
Creo que su sugerencia está bien, si desea controlar el tiempo de vida de la sesión del cliente. Creo que la arquitectura RESTful lo alienta a desarrollar aplicaciones sin estado. Como @ 2pence escribió "cada solicitud HTTP debe llevar suficiente información por sí misma para que su destinatario la procese para estar en completa armonía con la naturaleza sin estado de HTTP" .
Sin embargo, no siempre es así, a veces la aplicación necesita saber cuándo el cliente inicia o cierra sesión y debe mantener recursos como bloqueos o licencias basados en esta información. Vea mi pregunta de seguimiento para un ejemplo de tal caso.
fuente