Me gustaría implementar un flujo de autenticación sin contraseña para mi aplicación móvil que solo requiere que un usuario haga clic en un enlace en su correo electrónico para iniciar sesión. Similar a cómo Slack maneja la autenticación. Usaré node
y jwt
para esta implementación.
Creo que se me ha ocurrido un diseño seguro, pero estoy seguro de que me estoy perdiendo algo. Me encantaría alguna crítica de la comunidad.
Aquí vamos:
- El usuario abre la aplicación móvil.
- Verificamos si el usuario tiene un token en su almacenamiento local.
- Si lo hacen, agregamos ese token a sus encabezados y lo enviamos a la página de inicio de la aplicación.
- De lo contrario, les pedimos que ingresen su correo electrónico para comenzar
- Cuando hacen clic en "Enviar", POSTAMOS que
email address
al punto finalrequestMagicLink
en nuestro servidor. - El servidor comprueba la base de datos de un usuario con ese
email address
- Si encontramos un usuario con ese correo electrónico, tomamos el
id
de ese usuario - Si el usuario no existe, creamos un nuevo usuario y obtenemos ese
id
- Usamos JWT para generar un token con el
id
, y nuestrosecret
que caduca después de1 hour
- Enviamos ese token al usuario a través de un enlace en un correo electrónico.
- Al hacer clic, ese enlace envía una solicitud GET a nuestro servidor en el punto final
magicLogin
con eltoken
en un parámetro de consulta - Verificamos que el token sea correcto al usar JWT y nuestro
secret
. - Si falla la verificación, redirigimos al usuario a la pantalla donde le pedimos que comience su correo electrónico.
- Si tiene éxito, generamos un nuevo token JWT usando su
id
, y nuestrosecret
esedoesn't have an expiration
, luego lo devolvemos al usuario en los parámetros de una URL que los redirige a una página de éxito en nuestra aplicación. - La aplicación toma el token del parámetro y lo almacena en el almacenamiento local hasta que el usuario elija cerrar sesión y el usuario se redirige a la página de inicio.
- Todas las solicitudes a la api ahora contienen el token en los encabezados, y el usuario está listo.
EDITAR (añadiendo pensamiento adicional): Algo que estoy considerando para hacerlo más seguro: ¿Qué pasa si dividimos el token en 2 partes y enviamos la mitad al dispositivo móvil y la otra mitad al correo electrónico? De esa manera, solo el usuario con acceso a ese correo electrónico Y el acceso a ese dispositivo específico podrán autenticarse.