javascript - Autentificación de usuarios en aplicaciones Knockout.js
(3)
(Me dijeron en Twitter que estoy siendo demasiado vago aquí, así que intentaré editar)
Estoy empezando a usar Knockout.js para una aplicación con un back-end de PHP (una API que escupe resultados JSON). Partes de la aplicación requerirán que los usuarios estén autenticados para usarlos (es una aplicación para votar sobre quién "ganó" una transacción en particular en una liga de béisbol de fantasía)
Me pregunto cómo las personas manejan la autenticación mediante el uso de API y frameworks del lado del servidor como Knockout. Puedo escribir fácilmente el código PHP que acepta las credenciales, las valida y devuelve una respuesta. Simplemente no sé cómo mantener ese estado de que el usuario está "autenticado" mediante Knockout.
Agregue a eso el problema de mantener ese "estado autenticado" en más de una página, y me pregunto cómo sería posible. En PHP puede almacenar esas cosas dentro de la sesión o incluso utilizando cookies.
Tengo mucha experiencia con PHP, por lo que no me preocupa la parte de API de este pequeño proyecto paralelo. Soy un principiante con Knockout.js (y estoy a medio camino entre el principiante y el intermedio con Javascript), así que cualquier consejo sobre cómo puedo lograr esto sería muy apreciado.
Almacenar la cookie es una gran idea. Hacerlo simple es la clave.
No almacenar el estado autenticado. Trabaja con códigos de respuesta, como lo harías con cualquier otra API.
En última instancia, el proceso de backend (simplificado al extremo) sería algo como esto:
- Se recibe una solicitud de la parte frontal / cliente
- ¿Esta solicitud requiere privilegios?
- No goto 4
- Si goto 3
- Es el usuario identificado
- No, responde con 401.
- Sí, pero tiene privilegios insuficientes, responda con 403
- Si goto 4
- Enviar respuesta
En la parte frontal / cliente:
- Enviar una solicitud a la API
- Es la respuesta HTTP 200
- Si goto 4
- No goto 3
- Fue un 401
- Sí, mostrar pantalla de inicio de sesión
- No, error de disparo
- Mostrar resultados
Este podría no ser el mejor diseño de UX que existe, si de repente te encuentras con una pantalla de inicio de sesión inesperada. Sin embargo, esto puede ser evitado, al permitir que el usuario se autentique en cualquier momento, pero no lo requiere hasta que sea absolutamente necesario. (Y para una máxima suavidad, debe poder reproducir la solicitud que falló una vez que la autenticación se realizó correctamente).
Por supuesto, para solicitudes posteriores, esto requiere que tenga una sesión ejecutándose en el servidor o que su capa de transporte pueda adjuntar de forma transparente un token OAuth o similar a las solicitudes después de la autenticación.
Esencialmente, esto es lo mismo que almacenar el estado autenticado, pero es más transparente y no asume en ningún momento que el estado es lo que dice la bandera. Digamos, por ejemplo, que usa sesiones que almacena en un memcached, que segfaults y reinicia. Esto significa que sus sesiones se han ido y que ya no se autenticó a nadie que haya sido autenticado. Si su extremo frontal todavía tiene el valor authenticated = true
y confía en él, las cosas se romperán.
ACTUALIZAR:
Después de dormir en esta noche, me doy cuenta de que debe diferenciar entre 401 y 403. Como puede haber usuarios de diferentes niveles, necesita 403 para decirle al cliente / cliente que a pesar de que este usuario puede estar autenticado, todavía no tiene acceso. .
Puede almacenar el estado autenticado utilizando una cookie, enviando una cookie en el encabezado de respuesta de cualquier solicitud autenticada (es decir, inicio de sesión). El navegador lo guardará y lo enviará en los encabezados de las solicitudes posteriores. No hay necesidad de gestionar eso manualmente en tu aplicación.
Necesitaría diseñar sus modelos Knockout.js para manejar las respuestas de error de la API cuando no esté autorizado, pero de todas formas lo estaría haciendo incluso sin autenticación.
(Si necesita saber en su aplicación si el usuario ha iniciado sesión sin realizar una solicitud de API, puede verificar la cookie (manualmente en JS o con una biblioteca como jquery-cookie )