Micro Service - Outh2 Workflow con un SPA, Facebook Login y JWT

1

Introducción

Actualmente estamos tratando de encontrar una manera de implementar autenticación basada en token y autorización con Facebook Connect combinado con tal vez JWT dentro de la arquitectura de microservicios.

Contexto del sistema

  1. Aplicación SPA : una aplicación sencilla de una sola página que se alojará en algún lugar de un CDN.

  2. Microservicios : cada servicio individual se escribirá de acuerdo con la arquitectura de microservicio. Uno de esos servicios será el servicio de usuario que manejará todas las cosas relacionadas con el usuario (por ejemplo, tokens, información del usuario)

Requisitos

  1. El usuario debe poder autenticar contra nuestros servicios con un token de acceso a Facebook. En el futuro, también podremos integrar otras partes de la API gráfica de Facebook, en cuyo caso también necesitaríamos el token de acceso.

  2. Debe haber un mecanismo para autenticar y autorizar a un usuario en cualquier microservicio. Se llamarán múltiples servicios en secuencia, lo que permitiría que admitiéramos algún tipo de encadenamiento (por ejemplo, OAuth en nombre de ).

Algunas ideas sobre un posible flujo

  1. Facebook Connect SDK : autentíquese contra Facebook, lo que más tarde también permitiría posibles llamadas al api del gráfico.

  2. Token de acceso de usuario : el usuario recupera un token de acceso de corta duración de Facebook y lo envía a nuestro servicio de usuario.

  3. Verificación del servicio del usuario : el servicio del usuario verifica el token de acceso en Facebook.

  4. La verificación del servicio de usuario se ha realizado correctamente : el servicio de usuario solicita un token de acceso de larga duración del token de acceso de corta duración predeterminado que Facebook generó. Este token debe tener una validez de 60 días.

  5. Entrada de base de datos de servicio de usuario : el hash del token de acceso de larga duración se almacena en la base de datos. No veo ninguna razón particular por la que necesitaría el token en ausencia del usuario y, por lo tanto, evitaría el riesgo potencial de un token de acceso comprometido. No pensé mucho en el esquema de la base de datos, pero estaba pensando algo en tres tablas Account , Login y Claim para almacenar los datos específicos de inicio de sesión. Mientras que cada relación sería 1:n . El hash se almacenaría en la tabla Login para el proveedor de Facebook.

  6. Servicio de usuario & JWT : el servicio de usuario crea un nuevo JWT a partir de todas las reclamaciones relacionadas con este Account en particular. También puede haber algunos Logins / Claims adicionales de otros proveedores que no formarán parte de lo que Facebook entregará (por ejemplo, el administrador Login con las reclamaciones correspondientes). Además, también agregue el token de acceso de Facebook de larga duración al JWT.

  7. Almacenar JWT : envía el JWT recién creado al cliente y lo almacena dentro de local o session storage . En este punto, el token de acceso ya existente de Facebook en la cookie podría eliminarse, ¿supongo?

  8. SDK de Facebook : de alguna manera le dice al SDK de Facebook que debería revisar el JWT en el almacenamiento local con respecto al token de acceso de Facebook. Si alguno de los otros servicios recibe una solicitud, sucederá lo siguiente JWT es recibido por algún servicio aleatorio. El token JWT que contiene el token de acceso de Facebook se rellenaría mediante una criptografía de clave pública que evitaría una solicitud adicional al servicio del usuario. Si el token JWT ha caducado, toda la cadena de servicios falla y el usuario es redirigido a la página de inicio de sesión de facebook desde el SPA y todo el flujo comenzará de nuevo.

Mejoras & Comentarios

Estoy casi seguro de que pasé por alto algunas cosas clave, y por eso agradecería cualquier ayuda con respecto a posibles mejoras. También agradecería sus comentarios si esto pudiera hacerse de una manera más fácil y segura. Para la mayoría de las partes de la implementación, por supuesto, confiaríamos en las bibliotecas con tecnología de punta y no escribiríamos nada por nosotros mismos.

    
pregunta HansMusterWhatElse 10.01.2018 - 09:16
fuente

0 respuestas

Lea otras preguntas en las etiquetas