Al tener una aplicación web con una API REST (por ejemplo, our-app.com), queremos abrir nuestra API a aplicaciones web de terceros (por ejemplo, their-app.com). Después de algunas investigaciones, después de haber leído sobre OAuth, OpenID Connect, etc., dudo que sean realmente necesarias para nuestro uso previsto. Creo que la implementación más sencilla que se describe a continuación podría funcionar también, extendiendo nuestro mecanismo de inicio de sesión basado en sesión existente.
Más exactamente, queremos lograr lo siguiente:
- El usuario tiene una cuenta para nuestra aplicación web our-app.com y está conectado.
- El usuario visita their-app.com (en el mismo navegador).
- El usuario acepta compartir sus datos con sus-app.com .
- Ahora, their-app.com puede hacer solicitudes de API AJAX de origen cruzado autenticadas para our-app.com. Dado que el navegador envía la cookie de sesión existente, no es necesario iniciar sesión por separado si el usuario ya ha iniciado sesión en nuestro sitio.
¿Puede revisar mi implementación sugerida y señalar nuestras fallas de seguridad u otras desventajas? ¿Qué beneficios obtendríamos de usar, p. OAuth en su lugar?
- Sus-app.com se registran para usar nuestra API. Como resultado, "their-app.com" se agrega como un origen CORS permitido a nuestra base de datos.
- Un usuario visita their-app.com en su navegador.
- TheirApp solicita enlace para averiguar si el usuario ha iniciado sesión.
- Técnicamente, esta es una solicitud AJAX de "withCredentials".
- Dado que their-app.com es un origen registrado, nuestros servidores web permiten esta llamada a la API de origen cruzado. (Todas las solicitudes CORS de un origen desconocido se rechazarán en another-app.com).
- Si el usuario no ha iniciado sesión, o si el usuario ha iniciado sesión pero aún no ha otorgado acceso a sus-app.com, la respuesta incluirá una URL. Esta URL apunta a nuestra página de inicio de sesión (por ejemplo, enlace ). Sus aplicaciones deben abrir este enlace en una nueva pestaña, para permitir al usuario iniciar sesión.
- La página de inicio de sesión le pedirá un nombre de usuario / contraseña (si aún no ha iniciado sesión), lo que dará como resultado que se establezca una cookie de sesión, y luego le preguntará algo como "¿Desea que su.app.com acceda a sus datos?" Dado que todo esto sucede en una pestaña separada, la contraseña está a salvo de ser observada por su aplicación.
- Si el usuario otorga acceso, se agrega una entrada ("their-app.com", ID de usuario) a la base de datos, para recordar su decisión.
- Todas las solicitudes de origen cruzado a nuestra API se manejan de esta manera:
- Primero busque si el origen está registrado. Si no, rechazar.
- Luego busque la sesión del usuario si se proporcionó una cookie de sesión.
- Si un usuario ha iniciado sesión, pero aún no ha otorgado acceso al origen, rechazamos la solicitud y devolvemos un enlace como se describe anteriormente.
- Si un usuario ha iniciado sesión y ya ha otorgado acceso a un tercero, entonces procesamos la solicitud de la misma manera que las solicitudes del mismo origen desde nuestra propia aplicación web.
- Si no ha iniciado sesión, solo se puede acceder a los datos públicos.