Integración multitenant (inicio de sesión único)
Prefacio
La multitenancia es un enfoque común para cualquier aplicación basada en la nube. La estrategia de instancia única para distintas organizaciones siempre es más eficiente en términos de mantenimiento y costes.
El componente Editor tiene como objetivo ayudar a crear y gestionar la representación visual de un mapa de asientos. Este documento cubre todos los casos en los que una plataforma de ticketing ofrece multitenancia y el modelo de integración deseado debe admitir ese tipo de escenario.
Objetivos
El objetivo principal es admitir modelos multitenant de forma fluida entre dos plataformas. seatmap.pro permite organizar espacios de trabajo separados para distintas organizaciones. Para alcanzar los objetivos existentes, necesitamos implementar la funcionalidad de SSO entre las dos plataformas.
Los tenants pueden representarse como organizaciones o clientes en términos del software de ticketing.
Integración
Definiciones
Aquí y en adelante, vamos a usar los siguientes términos:
- Ticketing Platform - TP - es una plataforma a integrar
- Seatmap.pro - SMP - la plataforma que consta de dos componentes principales:
- Editor - aplicación de UI para editar esquemas
- Booking - componente de API de la plataforma que gestiona la autenticación y la gestión de organizaciones
Modelo
Vinculamos a los usuarios a un tenant específico, de modo que definimos un ámbito o restricción para separar el acceso entre dos o más organizaciones.
Básicamente, un único tenant u organización puede contener varios usuarios.
Flujo principal
Consideremos el escenario inicial en el que un usuario autenticado en TP intenta abrir la UI de SMP Editor. Para omitir el paso de autenticación en el lado de SMP, el usuario debe tener tokens de autenticación. Para conectar las dos plataformas, necesitamos llevar a cabo los siguientes pasos:
- Para sincronizar las organizaciones, TP identifica la organización del usuario actual y comprueba que ya existe en el lado de SMP Booking y tiene algún ID.
- En caso de que una organización no exista en el lado de SMP Booking, TP debe crearla primero con la API de gestión de organizaciones
- Cuando se conoce el id de la organización, TP está lista para solicitar un código de sesión de un solo uso con el método autoLogin
- Como resultado de autoLogin, TP abre la UI de SMP Editor con el código obtenido; el Editor lo intercambia por una sesión al cargarse. Las integraciones legadas pueden en su lugar obtener y pasar directamente el token y el refreshToken
Crear una organización
Para crear una organización mediante programación, necesitas llamar a la management API en el lado de SMP Booking:
POST /api/private/management/v2.0/organizations/ HTTP/1.1
Host: {BOOKING_HOST}
Content-Type: application/json
X-API-Key: {tenantToken}
{
"name": "Organization Name",
"email": "jd@seatmap.pro",
"firstName": "John",
"lastName": "Doe",
"password": "{INITIAL_PASSWORD}",
"autologinEnabled": true
}
Este endpoint requiere tu tenant token en la cabecera X-API-Key; un token de organización se rechaza. La respuesta contendrá la organización creada con su ID, que necesitarás para operaciones posteriores. Define autologinEnabled como true para que la organización acepte la solicitud de autologin descrita más abajo; si se omite, es false.
El nombre de la organización y los datos del administrador son campos de primer nivel de un único objeto. El email identifica la cuenta de administrador de la organización, sin distinguir mayúsculas de minúsculas. Si ninguna cuenta usa ese email, se crea una con la contraseña indicada. Una cuenta existente pasa a ser la administradora solo cuando es la única cuenta con ese email, pertenece al menos a una organización, todas sus organizaciones pertenecen al tenant al que pertenece tu X-API-Key y no tiene un rol de administración de la plataforma (super admin o global admin); conserva su propia contraseña y el password indicado no se aplica. Con cualquier otra cuenta existente la solicitud falla con 409 Conflict y el código de error ACCOUNT_EMAIL_IN_USE, y no se crea nada: usa otro email para esa organización.
Solicitud de inicio de sesión automático
El método de inicio de sesión automático permite obtener una sesión de usuario. Ahora esto lo gestiona el sistema SMP Booking:
POST /api/public/v2.0/autologin/ HTTP/1.1
Host: {BOOKING_HOST}
Content-Type: application/json
Content-Length: 164
{
"login": "jd@seatmap.pro",
"firstName": "John",
"lastName": "Doe",
"token": "{PRIVATE_KEY}",
"responseType": "code"
}
Con "responseType": "code" (recomendado) la respuesta contiene un código de sesión de un solo uso en lugar de los tokens de sesión. El código es válido para un único intercambio y expira a los 60 segundos:
{
"success": true,
"code": "{ONE_TIME_CODE}",
"expiresIn": 60
}
Si se omite responseType, la respuesta incluye los tokens de sesión directamente:
{
"user": {
// User information
},
"success": true,
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
El inicio de sesión automático solo acepta cuentas de organización. Una cuenta con un rol de administración de la plataforma (super admin o global admin) recibe HTTP 403 y debe iniciar sesión en el Editor con su propia contraseña.
Abrir la aplicación Editor
Con el código de sesión, abre la aplicación SMP Editor en un iframe añadiendo el código como parámetro de URL ssoCode. El Editor intercambia el código por una sesión automáticamente al cargarse:
<iframe
src="{EDITOR_HOST}/app/?ssoCode={ONE_TIME_CODE}"
width="100%"
height="800px"
frameborder="0"
>
</iframe>
Solicita un código nuevo al endpoint de autologin cada vez que abras el Editor: el código se consume en la primera carga y no puede reutilizarse.
Si usaste la respuesta con tokens por defecto, añade el token y el refreshToken como parámetros de URL en su lugar:
<iframe
src="{EDITOR_HOST}/app/?token={token}&refreshToken={refreshToken}"
width="100%"
height="800px"
frameborder="0"
>
</iframe>
Ejemplo
Supongamos que necesitas abrir el Editor para un esquema de recinto concreto en la URL https://editor.seatmap.dev/app/venues/2/schemas/150, y la respuesta de autologin contenía el código k3P9wXbF2tR8yQ6mA1sD4gJ7hL0cV5nZ8xE2uT6iO4q.
La URL completa para usar en tu iframe sería:
https://editor.seatmap.dev/app/venues/2/schemas/150?ssoCode=k3P9wXbF2tR8yQ6mA1sD4gJ7hL0cV5nZ8xE2uT6iO4q
Y la implementación completa del iframe sería:
<iframe
src="https://editor.seatmap.dev/app/venues/2/schemas/150?ssoCode=k3P9wXbF2tR8yQ6mA1sD4gJ7hL0cV5nZ8xE2uT6iO4q"
width="100%"
height="800px"
frameborder="0"
>
</iframe>