He tenido el mismo problema que usted describe. Se puede acceder al sitio web que estoy construyendo desde un teléfono móvil y desde el navegador, por lo que necesito una API que permita a los usuarios registrarse, iniciar sesión y realizar algunas tareas específicas. Además, necesito admitir la escalabilidad, el mismo código que se ejecuta en diferentes procesos / máquinas.
Debido a que los usuarios pueden CREAR recursos (también conocidos como acciones POST / PUT), debe proteger su API. Puede usar oauth o puede crear su propia solución, pero tenga en cuenta que todas las soluciones pueden romperse si la contraseña es realmente fácil de descubrir. La idea básica es autenticar a los usuarios utilizando el nombre de usuario, la contraseña y un token, también conocido como apitoken. Este apitoken se puede generar usando node-uuid y la contraseña se puede cifrar usando pbkdf2
Luego, debe guardar la sesión en algún lugar. Si lo guarda en la memoria en un objeto plano, si mata el servidor y lo reinicia nuevamente, la sesión se destruirá. Además, esto no es escalable. Si usa haproxy para equilibrar la carga entre máquinas o si simplemente usa trabajadores, este estado de sesión se almacenará en un solo proceso, por lo que si el mismo usuario es redirigido a otro proceso / máquina, deberá autenticarse nuevamente. Por lo tanto, debe almacenar la sesión en un lugar común. Esto se hace típicamente usando redis.
Cuando el usuario se autentica (nombre de usuario + contraseña + apitoken) genera otro token para la sesión, también conocido como accesstoken. De nuevo, con nodo-uuid. Enviar al usuario el token de acceso y el ID de usuario. El ID de usuario (clave) y el token de acceso (valor) se almacenan en redis con el tiempo de caducidad, por ejemplo, 1 h.
Ahora, cada vez que el usuario realice cualquier operación utilizando la API de descanso, deberá enviar el ID de usuario y el token de acceso.
Si permite que los usuarios se registren utilizando la API de resto, deberá crear una cuenta de administrador con un apitoken de administrador y almacenarlos en la aplicación móvil (cifrar nombre de usuario + contraseña + apitoken) porque los nuevos usuarios no tendrán un apitoken cuando Se registran.
La web también usa esta api pero no es necesario que uses apitokens. Puede usar express con una tienda de redis o usar la misma técnica descrita anteriormente pero omitiendo el cheque de apitoken y devolviendo al usuario el userid + accesstoken en una cookie.
Si tiene áreas privadas, compare el nombre de usuario con los usuarios permitidos cuando se autentiquen. También puede aplicar roles a los usuarios.
Resumen:
Una alternativa sin apitoken sería usar HTTPS y enviar el nombre de usuario y la contraseña en el encabezado de Autorización y almacenar en caché el nombre de usuario en redis.