INFRAESTRUCTURA DE COTIZACIÓN

Conexión segura.
Cotización en tiempo real.

Consola de validación de identidad M2M y sesiones de Firebase y Cloudflare Worker, con acceso privado a los resultados de cada aseguradora.

Firebase Auth Cloudflare Worker Resultados privados R2

USO EN BANCO PLATA

Qué implementan el backend y la app

Secuencia que Banco Plata debe implementar para crear la sesión del puente y entregar los tokens correctos a su aplicación.

Responsabilidad del integrador
BACKEND

Backend de Banco Plata

Las credenciales M2M y el token de integración nunca salen del servidor.

  1. 1
    Obtener token Firebase M2MFirebase Auth · signInWithPassword

    El backend usa el correo y contraseña del usuario técnico dedicado y recibe un integrationIdToken.

  2. 2
    Usar ese token para llamar la FunctionAuthorization: Bearer {integrationIdToken}

    Llama sessionBootstrap y envía { endUserId, expiresInSeconds }. El endUserId se deriva de la sesión bancaria autenticada.

  3. 3
    Recibir las sesiones del puentefirebaseCustomToken + apiSessionToken

    La Function devuelve el token personalizado de Firebase y el token opaco del Worker con sus vencimientos.

4
Enviar los tokens a la appRespuesta HTTPS del endpoint autenticado /insurance/session.
Contrato que el backend entrega a la app { firebaseCustomToken, apiSessionToken, firebaseExpiresAt, apiExpiresAt }

No incluye credenciales M2M ni integrationIdToken.

firebaseCustomTokenPara Firebase SDK
apiSessionTokenPara las APIs del Worker
APP

App de Banco Plata

La app recibe dos tokens y mantiene separados sus usos.

  1. 5
    Iniciar Firebase SDKsignInWithCustomToken(firebaseCustomToken)

    Firebase SDK intercambia el token personalizado y administra Auth, renovación y acceso a RTDB.

  2. 6
    Conservar el token del WorkerapiSessionToken

    Se mantiene en memoria y se envía como Authorization: Bearer a /session/probe, /quote y /quote/{resultId}.

  3. 7
    Mostrar cotizacionesRTDB + Worker

    Escucha estados y primas en RTDB. Solicita el detalle privado al Worker solo cuando el usuario pulsa Ver detalle.

RECUPERACIÓN

Renovar la sesión del Worker

Se usa después de reiniciar la app cuando Firebase restauró al usuario, pero el token opaco ya no está en memoria.

  1. 8
    La app obtiene su token Firebase vigenteauth.currentUser.getIdToken()

    Envía ese token al endpoint autenticado del banco POST /insurance/session/refresh.

  2. 9
    El backend solicita la renovaciónrefreshApiSession

    El backend reenvía el token Firebase del usuario final como bearer. No vuelve a usar las credenciales M2M.

  3. 10
    El backend devuelve el token nuevo{ apiSessionToken, expiresAt }

    La app reemplaza el token anterior y continúa llamando las APIs del Worker.

Si no existe auth.currentUser o la Function responde m2m_required, se repite el flujo desde el paso 1.

Importante: correo y contraseña M2M, integrationIdToken y secreto interno permanecen en el backend. La demostración los ejecuta en el navegador únicamente para hacer visible la secuencia.

SESIÓN DE PRUEBA

Validar conexión M2M

Cargando entorno
01

Token de integración M2M

Autentica al usuario técnico en Firebase SDK antes de solicitar una sesión.

02

Sesiones del usuario

Crea la sesión de Firebase del usuario final y su token opaco para el Worker.

Mostrar depuración Sesiones, validaciones y vigencias
Configuración de demostración lista

    GUÍA DE INTEGRACIÓN

    Firebase + Cloudflare en cada plataforma

    El backend autenticado del banco entrega un token personalizado de Firebase y un token opaco para el Worker. La credencial M2M nunca se comparte con el cliente.

    1. Firebase Auth 2. Bearer Worker 3. Resultado privado
    1M2M · Crear sesionesRecibir las credenciales separadas e iniciar Firebase Auth.Ver código
    Web JS puroSDK web de Firebase
    const response = await fetch(`${bankApiUrl}/insurance/session`, {
      method: "POST",
      credentials: "include",
    });
    const session = await response.json();
    await signInWithCustomToken(auth, session.firebaseCustomToken);
    let apiSessionToken = session.apiSessionToken;
    Clave de API web de Firebase
    Identificador público del proyecto Firebase. Selecciona el proyecto, pero no autoriza al usuario de integración.
    Correo y contraseña de integración
    Credenciales exclusivas del servidor para el único usuario de integración de Firebase. Nunca deben incluirse en aplicaciones web o móviles.
    Token de ID de integración
    Token de Firebase de corta duración devuelto por el inicio de sesión. La Function verifica que su UID coincida con el UID de integración configurado.
    endUserId
    Identificador estable del usuario de Banco Plata seleccionado por el backend bancario confiable. Se convierte en el UID de Firebase del usuario final.
    firebaseCustomToken
    Token de un solo uso que el cliente intercambia con Firebase Auth para obtener su sesión de usuario final.
    apiSessionToken
    Token bearer opaco e independiente usado solo con las API del Worker. El Worker almacena únicamente su hash SHA-256 en KV.
    2Validar WorkerComprobar que el token opaco resuelve una sesión activa.Ver código
    Web JS puroAPI Fetch
    const response = await fetch(`${workerUrl}/session/probe`, {
      headers: { Authorization: `Bearer ${apiSessionToken}` },
    });
    if (response.status !== 200) throw new Error("Sesión del Worker rechazada");
    WORKER_URL
    Nombre de host público del Worker desplegado en Cloudflare. No existe hasta que el Worker se despliega y recibe una ruta.
    API_SESSION_TOKEN
    Token opaco sin procesar devuelto por el inicio de sesión. Debe conservarse en memoria y enviarse solo como credencial bearer al Worker.
    /session/probe
    Validación autenticada. Una respuesta 200 demuestra que el Worker encontró y validó la sesión de KV sin exponer la identidad del usuario.
    3Reparar sesiónUsar la sesión Firebase vigente para reemplazar un token Worker vencido.Ver código
    Web JS puroToken de ID de Firebase
    const firebaseIdToken = await auth.currentUser.getIdToken();
    // El backend bancario reenvía este token a refreshApiSession.
    const response = await fetch(`${bankApiUrl}/insurance/session/refresh`, {
      method: "POST",
      headers: { Authorization: `Bearer ${firebaseIdToken}` },
    });
    apiSessionToken = (await response.json()).apiSessionToken;
    END_USER_FIREBASE_ID_TOKEN
    Token de ID actual de Firebase obtenido después de intercambiar firebaseCustomToken. No es el token del usuario de integración.
    /insurance/session/refresh
    Endpoint del backend de Banco Plata que reenvía el token del usuario final a la Function refreshApiSession. El cliente nunca recibe el secreto interno del Worker.
    refreshApiSession
    Function de Firebase que valida la sesión del usuario final y solicita un token opaco de reemplazo para el Worker. Una desconexión temporal no requiere llamarla: Firebase SDK reconecta automáticamente. Después de reiniciar la aplicación, si Firebase restauró su sesión pero el token Worker en memoria se perdió, se usa esta Function. Si no existe auth.currentUser o responde m2m_required, debe repetirse el bootstrap M2M completo.
    m2m_required
    Indica que la identidad de Firebase ya no puede restaurar la sesión del Worker. Banco Plata debe repetir el inicio M2M confiable.
    4CotizarEnviar los datos mínimos del vehículo al Worker.Ver código
    Web JS puroPOST /quote
    const response = await fetch(`${workerUrl}/quote`, {
      method: "POST",
      headers: {
        Authorization: `Bearer ${apiSessionToken}`,
        "Content-Type": "application/json",
        "Idempotency-Key": crypto.randomUUID(),
      },
      body: JSON.stringify(quote),
    });
    const { globalId } = await response.json();
    Idempotency-Key
    Identificador único de la solicitud. Reutiliza el mismo valor únicamente al reintentar la misma cotización.
    Cuerpo de la cotización
    Datos mínimos del vehículo y conductor aceptados desde el cliente. El Worker agrega los campos controlados por el backend.
    globalId
    Identificador de la operación completa de cotización. Se usa para observar el estado global en RTDB y sus aseguradoras relacionadas.
    5Ver detallesRecuperar el JSON privado de una aseguradora usando su resultId.Ver código
    Web JS puroGET /quote/{resultId}
    const response = await fetch(`${workerUrl}/quote/${encodeURIComponent(resultId)}`, {
      headers: { Authorization: `Bearer ${apiSessionToken}` },
    });
    const insurerDetail = await response.json();
    RESULT_ID
    ID del registro de aseguradora referenciado por el registro global de RTDB, por ejemplo {globalId}-axa.
    Resultado privado
    JSON completo de la aseguradora almacenado en results/{uid}/{resultId}.json en R2. RTDB contiene únicamente el estado y resultId.
    Propiedad
    El Worker obtiene el UID de la sesión de API autenticada. Los clientes nunca envían el UID ni reciben una URL directa de R2.
    API Referencia OpenAPI 3.1Contratos, esquemas, autenticación, ejemplos y pruebas interactivas. Abrir referencia

    El contrato separa Firebase Auth, las Functions del puente y las rutas autenticadas del Worker.

    Descargar OpenAPI JSON