sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cuál es la mejor manera de autenticar y autorizar una solución web y API como MERN Stack?

La mejor estrategia de autorización depende del alcance de sus aplicaciones a corto o largo plazo.

Web monolítica o simple con inicio de sesión privado

Por ejemplo, si solo tiene una web simple (MERN) con un backend simple (api rest) o una aplicación monolítica como esta ejemplo de mern con un inicio de sesión interno o privado en su organización, su estrategia de autorización podría ser tan simple como:

  • (1*) /login express route que recibe usuario/contraseña, los valida en la base de datos y devuelve el token jwt clásico y una serie de opciones (rutas de reacción) a las que el usuario debe tener acceso
  • la aplicación web (reaccionar) debe representar páginas cuyas rutas coincidan con las rutas recibidas
  • la aplicación web debe enviar el token recibido a cualquier invocación de punto final de descanso de API
  • cuando api recibe la invocación de reaccionar web, debe validar la existencia del token como encabezado. Si no existe, debe devolver un error 403.
  • (2*) Si existe el token, debe intentar validarlo (bien formado, no caducado, firma correcta, etc.).
  • (3*)Si es un token válido, debe realizar una última validación:¿El usuario con rol de "invitado" puede ejecutar un DELETE? a un punto final /user/100 .
  • (4*) La solución clásica es tener algunas tablas en su base de datos como:usuario, funciones, funciones_usuario, permiso_función, opción_permiso. La tabla de opciones debe haber registrado todos sus puntos finales de API y su método. También esto podría usarse para crear la relación entre el usuario <:> rutas web. Compruebe esto

Requisitos modernos

Las organizaciones modernas y grandes requieren:

  • Inicios de sesión en redes sociales
  • Usuarios internos/externos
  • Inicios de sesión no interactivos (robots, programadores, etc.)
  • Varias aplicaciones web
  • Varias aplicaciones móviles
  • Mucho Resto Api

Para este caso, la aplicación MERN no es una buena opción porque es TODO EN UNO. La estrategia común para implementar los requisitos anteriores es tener varios artefactos implementados en varios servidores:

  • aplicación web (react, vue, angular, linkstart, etc.)
  • apis rest (nodejs + expres, java, python, etc.)
  • autenticación/autorización:plataforma/proveedor oauth2, Plataformas de Identidad/Acceso, etc

Si este es tu caso, debes dividir tu aplicación MERN en varios artefactos desplegables:web, api y seguridad.

Oauth2

No importa si solo te preocupa iniciar sesión o cómo garantizar la autenticación y autorización para tus webs, apis y quizás tus aplicaciones móviles, necesitarás:OAUTH2

Podrías desarrollar tu propia plataforma de seguridad teniendo en cuenta (1*), (2*), (3*) y (4*) o usar algo como:

  • autor0
  • llavero, etc.

Más detalles aquí:https://stackoverflow.com/a/62049409

Tus preguntas

  • ¿Qué método crees que es mejor?
    • Creo que si usa auth0, ahorrará tiempo y esfuerzo. Con auth0, solo necesita una aplicación rápida simple, con algunos puntos finales como /login, /callback, etc. O si usa auth0 + pasaporte.js, estos puntos finales son administrados por pasaporte.js
    • Te aconsejo que revises cómo funciona el flujo OAUTH2 antes de usar auth0 con/sin pasaporte. Este enlace me ayudó mucho.
  • ¿Cuál es la diferencia entre 2 y 3,
    • Como leí, auth0 y otras plataformas ofrecen un servicio de administración de usuarios o pueden conectarse a su servicio de usuarios (AD/LDAP, base de datos, API, etc.). Entonces
  • ¿Hay alguna manera de implementar reglas en el pasaporte (por ejemplo, redirigir a los nuevos usuarios en el primer inicio de sesión)
    • Sí. Puede agregar algo de lógica cuando la devolución de llamada se redirige en su nodojs con o sin pasaporte.
  • Si implemento Passport con MongoDB y mi base de datos tiene cientos de usuarios, ¿cómo puedo administrarlos?
    • Hoy en día, la base de datos admite muchas filas. Entonces, para su base de datos de producción, intente optimizarla o monitorearla. Otra opción es contratar a un administrador de base de datos para realizar estas tareas.

Referencias