FB Oauth CSRF security, sitio web de PHP

6

Estoy experimentando con el inicio de sesión de terceros, utilizando Twitter y Facebook.

Después de obtener el token de acceso de estas partes y confirmar su validez, luego emito mi propio token JWT que se usa dentro de mi grupo de aplicaciones. Lo único por lo que uso el token de terceros es obtener una dirección de correo electrónico y una identificación de usuario, no interactúo con la red social de ninguna otra manera, excepto por la revalidación. Básicamente es solo para que los usuarios no tengan que ingresar una nueva contraseña.

Tengo varios servicios, cada uno en un subdominio diferente. Estos servicios se adhieren en cierta medida a la filosofía de los microservicios, y cada uno es responsable del alcance limitado de la funcionalidad (por ejemplo, UAC, entidad de negocios, etc.)

El único propósito del token JWT es reducir la complejidad de la verificación de autenticación entre los otros servicios, lo que no debe ser consciente del proveedor de Oauth. Tampoco quiero identificar qué proveedor eligieron en el JWT visible públicamente.

Instalé un SDK de terceros (aprobado oficialmente) en el microservicio UAC, con el que estoy interactuando a través de la solicitud AJAX.

EDITAR: Flujo actualizado, para mayor claridad

  1. Desde la capa de presentación: requiere la URL de autorización del módulo UAC. En el lado del módulo UAC, el SDK maneja la creación de tokens CSRF y, lamentablemente, también el almacenamiento (al menos el SDK de FB lo hace). El token CSRF se establece en sesión.
  2. Redirigir al usuario a la página de autenticación de FB, el usuario autoriza, se envía de vuelta a mi capa de presentación con un token CSRF para comparar
  3. Aquí es donde se produce la comprobación de CSRF DEBE , pero el token original no se establece en la sesión actual, en cambio está en el módulo UAC
  4. Desde la capa de presentación - lado del servidor: tome el token Oauth y el token CSRF, envíelo al módulo UAC
  5. Aquí es donde se produce la comprobación de CSRF PODRÍA , pero la comunicación servidor-servidor no tiene la sesión. Aquí es donde omito la comprobación de CSRF engañando al SDK para que acepte cualquier token de CSRF que haya recibido
  6. Valide el token de Oauth, cambie por uno de larga duración, obtenga datos de usuarios, cree una entidad de usuario en mi base de datos, emita JWT, listo.
  7. JWT se establece desde la capa de presentación - lado del servidor con SetCookie. Esta cookie utiliza HttpOnly y Secure (pero ese no es realmente el problema aquí)

En los términos más simples : quiero lograr la misma funcionalidad que Oauth habitual con estos proveedores, pero debo dividir el proceso entre dos subdominios. Ninguno de estos debería tener sesión de PHP si es posible, excepto por el breve momento en que FB SDK me obliga a usar uno.

Lo que he intentado hasta ahora : cambié un poco la arquitectura, y en lugar de hablar directamente con el módulo UAC desde javascript, rebote la solicitud a través del servidor en la capa de presentación, y en eso sesión guardo el token CSRF original. Cuando más tarde el usuario vuelva de la página de autenticación FB, puedo realizar la comprobación. Todavía tengo que engañar al SDK en el lado UAC, pero eso es después de que verifiqué el CSRF (aunque no a través del propio SDK) ¿Puedo seguir adelante con este enfoque? ¿Es esto riesgoso de alguna manera, porque envío el token CSRF entre servidores?

    
pregunta Slytherin 06.02.2017 - 19:38
fuente

0 respuestas

Lea otras preguntas en las etiquetas