37

He desarrollado un prototipo de aplicación de una sola página que usa Backbone en la interfaz y va a consumir desde una API RESTful del servidor para sus datos.Autenticación para usuarios en una aplicación de una sola página?

Viniendo desde el desarrollo de aplicaciones de servidor pesado (php y python), he disfrutado realmente el nuevo enfoque de diseño diferente con un cliente MVC grueso pero estoy confundido sobre la mejor manera de restringir la aplicación a usuarios autenticados que inician sesión.

Prefiero tener la aplicación en sí misma detrás de un inicio de sesión y también me gustaría implementar otros tipos de inicios de sesión (openid, fb connect, etc.) además del inicio de sesión nativo del sitio. No estoy seguro de cómo se hace esto y he estado buscando, sin éxito en la búsqueda de información que me lo haya dejado claro.

A grandes rasgos, ¿cuál es la mejor práctica actual para registrar usuarios y solicitarles que inicien sesión para usar su aplicación de una sola página?

Una vez que un usuario ha iniciado sesión, ¿cómo se autentican las solicitudes de API? ¿Puedo almacenar una sesión, pero cómo puedo detectar esta sesión en las llamadas a la API o tengo que pasar un token en cada llamada a la API? ¡Cualquier respuesta a esto sería muy apreciada!

+2

¿Qué hiciste finalmente? Elija una respuesta si se resolvió una de las respuestas existentes o agregue su propia solución. – tgkprog

Respuesta

7

Utilizamos la autenticación basada en cookies django y tenemos una página separada para el inicio de sesión y la aplicación de una sola página. Funciona bastante bien para nuestro caso de uso. Hemos utilizado un sistema de administración de sesiones basado en Backbone que describí aquí: backbone.js - handling if a user is logged in or not

+1

Hago algo similar a lo que está vinculado. Tengo un modelo que trata únicamente con la autenticación (inicio de sesión/cierre de sesión), verifica que en el lado del servidor y luego envíe una respuesta.El éxito o devolución de llamada de error envía un evento que mi aplicación y vistas están escuchando. A la vuelta del servidor, envío una sesión de cookies encriptadas que luego uso con cada llamada para verificar que estén autenticadas. – jmk2142

+1

@orangewarp: Lo que has descrito suena mucho (si no exactamente) como lo que necesitamos. Estamos usando knockout.js, no backbone.js. ¿Hay alguna forma de que pueda proporcionar más detalles sobre cómo implementó su solución? Tal vez algún código de ejemplo? ¡Gracias! – lmttag

4

Estamos usando Angular.js y también, tenemos una página separada para el inicio de sesión. La página separada carga una aplicación de una sola página (y segura), que llama al servidor usando la solicitud http XHR, enviando nombre de usuario y contraseña. Si el servidor autenticó las credenciales, el código de javascript establece una cookie. esta cookie se puede leer desde el "otro lado", es decir, la aplicación no segura. En la cookie solo ponemos el nombre de usuario y, por supuesto, ninguna contraseña u otra información segura. entonces podemos mostrar algo como '¿No Lior? Desconéctese en la aplicación no segura.

único que hay que tener en cuenta es para anular mecanismo de la cookie de angular para establecer una caducidad indefinida y, lo más importante, la ruta raíz:

$document[0].cookie = 'username=' + escape($scope.userName) + ";expires=Thu, 01 Jan 2970 00:00:00 GMT; Path=/"; 
7

La manera más relajante que he visto se basa en el cliente de OAuth fluyen credenciales, Básicamente, un punto final token que envía un nombre de usuario/contraseña a la que devuelve un token de acceso para esta sesión. Cada solicitud de Ajax después de eso agrega un encabezado de portador Authorization con el token. Puede almacenar el token en una variable global para mantenerlo hasta que la página se actualice/cierre, utilice el almacenamiento local para mantener a los usuarios conectados entre sesiones o las cookies de JavaScript. Si no te gusta la idea de los tokens, puedes usar el viejo método de cookies que se envía automáticamente con cualquier solicitud de ajax.

En cuanto a facebook/google, etc. Normalmente sigo el enfoque de stackoverflow donde asocio los userlogins externos a una cuenta. A continuación, use un baile oauth dance bastante normal (aunque puede reemplazar todas las solicitudes al servidor con solicitudes ajax con ligeras modificaciones, solo encuentro que realmente no hace mucha diferencia, ya que necesita redirecciones entre usted y el servidor). Normalmente publico una cookie encriptada para un inicio de sesión de Facebook, que luego convierto en un token usando un método similar al anterior (solo envíe la cookie con la solicitud en lugar del nombre de usuario/contraseña).

Cuestiones relacionadas