Legal

OAuth 2.0 y SSO con OpenID Connect

Guía completa para integrar el inicio de sesión único con OpenID Connect en Advanza.

Last updated: 26 de agosto de 2026

Resumen

Advanza es una plataforma SaaS de marketing multiinquilino que admite OpenID Connect (OIDC) y OAuth 2.0 para autenticación segura e inicio de sesión único (SSO). Esta guía cubre los flujos admitidos, los endpoints, los scopes y las buenas prácticas para integrar la autenticación de Advanza en tus aplicaciones.

Protocolo: OpenID Connect 1.0 (construido sobre el Authorization Code Grant de OAuth 2.0)
Proveedor: Advanza (a través de OpenIddict 5.x)
Multiinquilino: Soporte completo: cada organización es un tenant independiente
Seguridad: Se requiere HTTPS, PKCE recomendado para SPAs, certificados para clientes confidenciales

Flujos de autenticación admitidos

Authorization Code Flow (recomendado)

El Authorization Code Flow de OAuth 2.0 es el flujo recomendado y más seguro para la mayoría de aplicaciones, incluidas las aplicaciones web y las aplicaciones de una sola página (SPA). Usa PKCE (Proof Key for Code Exchange) para clientes públicos, con el fin de evitar ataques de interceptación del código de autorización.

Recomendado para: Aplicaciones web, SPAs, apps móviles, integraciones de terceros

Refresh Token Flow

Usa refresh tokens para obtener nuevos access tokens sin necesidad de que el usuario vuelva a iniciar sesión. Los refresh tokens son válidos durante 14 días y pueden rotarse para mantener la seguridad.

Recomendado para: Sesiones de larga duración, servicios en segundo plano, acceso sin conexión

Client Credentials Flow (heredado)

El flujo Resource Owner Password Credentials de OAuth 2.0 se admite por compatibilidad con integraciones heredadas. Las integraciones nuevas deben usar el Authorization Code Flow en su lugar.

Recomendado para: Aplicaciones heredadas, herramientas internas (no recomendado para desarrollos nuevos)

Endpoints de la API

Todos los endpoints se alojan en https://api.advanza.ai

Endpoint de autorización

GET /connect/authorize

Inicia el flujo de autorización de OAuth. Redirige al usuario para que inicie sesión con su proveedor de identidad (Microsoft, Google, o email/contraseña).

Parámetros de consulta:

  • client_id (obligatorio): El ID de tu aplicación
  • redirect_uri (obligatorio): URL a la que redirigir tras la autenticación
  • response_type (obligatorio): Debe ser 'code'
  • scope (obligatorio): Lista de scopes separados por espacios (openid, email, profile, offline_access, roles)
  • code_challenge (obligatorio para SPA): Code challenge de PKCE
  • code_challenge_method (obligatorio junto con code_challenge): 'S256'
  • state (recomendado): Cadena aleatoria para prevenir ataques CSRF
  • tenant_id (opcional): Tenant específico en el que autenticarse

Endpoint de token

POST /connect/token

Intercambia un código de autorización por access tokens, ID token y, opcionalmente, un refresh token.

Formato de la petición: application/x-www-form-urlencoded

Parámetros:

  • grant_type (obligatorio): 'authorization_code', 'refresh_token', o 'password'
  • code (obligatorio para el flujo authorization code): Código de autorización obtenido de /authorize
  • client_id (obligatorio): El ID de tu aplicación
  • client_secret (obligatorio): El secreto de tu aplicación (mantenlo confidencial)
  • redirect_uri (obligatorio): Debe coincidir con la petición a /authorize
  • code_verifier (obligatorio para SPA): Code verifier de PKCE
  • refresh_token (para el flujo de refresco): El refresh token a intercambiar
  • username & password (para el flujo de contraseña): Credenciales del usuario

Endpoint de introspección de token

POST /connect/introspect

Valida e inspecciona el contenido de un access token o un refresh token.

Configuración de OpenID

GET /.well-known/openid-configuration

Endpoint estándar de metadatos OIDC. Devuelve información de descubrimiento, incluidos endpoints, claves públicas, scopes admitidos y tipos de grant.

Scopes

Solicita los scopes mediante el parámetro scope en la petición de autorización:

openid (obligatorio)

Solicita un ID token con la información de identidad del usuario (subject claim, nombre, ID de tenant, etc.)

email

Solicita la dirección de email del usuario y el estado de verificación del email

profile

Solicita información del perfil del usuario: name, given_name, family_name

offline_access

Solicita un refresh token para ampliar el acceso sin necesidad de volver a autenticarse

roles

Solicita los roles/permisos del usuario (por ejemplo, "Owner", "Editor", "Viewer")

Scope mínimo para iniciar sesión: openid email profile

Ejemplo: Authorization Code Flow con PKCE

Este ejemplo muestra el flujo recomendado para aplicaciones de una sola página (SPA) y apps móviles.

Paso 1: generar el desafío PKCE

Crea un code verifier y un code challenge en el lado del cliente:

// 1. Generate random code verifier (43-128 characters)
const codeVerifier = generateRandomString(128);

// 2. Create code challenge via SHA256 hash
const codeChallenge = await crypto.subtle.digest('SHA-256',
  new TextEncoder().encode(codeVerifier)
);

// 3. Base64-URL encode the challenge
const codeChallengeB64 = base64UrlEncode(codeChallenge);

// Store codeVerifier in sessionStorage for Step 3
sessionStorage.setItem('pkce_verifier', codeVerifier);

Paso 2: redirigir al endpoint de autorización

Dirige al usuario para que inicie sesión:

GET /connect/authorize?
  client_id={your_app_id}
  &redirect_uri=https://your-app.com/callback
  &response_type=code
  &scope=openid email profile
  &code_challenge={pkce_challenge}
  &state={random_state}

El usuario será redirigido a su proveedor de identidad (Microsoft, Google, o email/contraseña), completará la autenticación y volverá a tu redirect_uri con un código de autorización.

Paso 3: intercambiar el código por tokens

Desde tu backend, intercambia el código de autorización:

POST /connect/token
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&code={auth_code}
&client_id={your_app_id}
&client_secret={your_app_secret}
&redirect_uri=https://your-app.com/callback
&code_verifier={pkce_verifier}

Paso 4: respuesta con el token

Si todo va bien, recibes:

{
  "access_token": "eyJhbGciOiJSUzI1NiIs...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "DefxA1234567890...",
  "id_token": "eyJhbGciOiJSUzI1NiIs..."
}

Paso 5: verificar el ID token

Valida la firma del ID token usando la clave pública de /.well-known/openid-configuration, comprueba los claims de issuer y audience, y extrae la información del usuario.

Claims del token

Claims del ID token

El ID token (JWT) contiene la información de identidad del usuario:

{
  "sub": "550e8400-e29b-41d4-a716-446655440000",
  "email": "user@company.com",
  "email_verified": true,
  "name": "John Doe",
  "given_name": "John",
  "family_name": "Doe",
  "tenant_id": "12345678-1234-1234-1234-123456789012",
  "iss": "https://api.advanza.ai",
  "aud": "your_app_id",
  "iat": 1234567890,
  "exp": 1234571490
}

Claims principales:

  • sub: Identificador único del usuario (Guid)
  • email: Dirección de email del usuario
  • email_verified: Si el email está verificado
  • name, given_name, family_name: Nombre del usuario
  • tenant_id: Tenant/organización activo del usuario
  • iss: Emisor del token (siempre https://api.advanza.ai)
  • aud: Audiencia prevista (el ID de tu aplicación)
  • iat: Momento de emisión del token (timestamp Unix)
  • exp: Caducidad del token (timestamp Unix)

Claims del access token

El access token (JWT) contiene la información de autorización:

{
  "sub": "550e8400-e29b-41d4-a716-446655440000",
  "email": "user@company.com",
  "name": "John Doe",
  "tenant_id": "12345678-1234-1234-1234-123456789012",
  "roles": ["Owner"],
  "scope": "openid email profile offline_access roles",
  "iss": "https://api.advanza.ai",
  "aud": "your_app_id",
  "iat": 1234567890,
  "exp": 1234571490
}

Claims principales:

  • sub: ID del usuario
  • email, name: Información del usuario
  • tenant_id: Tenant activo (úsalo para el enrutamiento multiinquilino)
  • roles: Roles del usuario en el tenant
  • scope: Scopes concedidos
  • exp: Caducidad (normalmente 1 hora)

Usa el access token para: Inclúyelo en la cabecera Authorization (Authorization: Bearer {access_token}) al llamar a las APIs de Advanza o a tu backend.

Multiinquilino

Advanza es una plataforma multiinquilino. Cada usuario puede pertenecer a varias organizaciones (tenants). El claim tenant_id en el ID token y en el access token indica el contexto de tenant activo del usuario.

Tenant por defecto

En el primer inicio de sesión, se asigna al usuario un tenant por defecto. El claim tenant_id se rellenará con el ID de ese tenant.

Cambiar de tenant

Los usuarios con varias membresías de tenant pueden cambiar de tenant pasando el parámetro tenant_id deseado al endpoint de autorización:

GET /connect/authorize?
  client_id={your_app_id}
  &redirect_uri=https://your-app.com/callback
  &response_type=code
  &scope=openid email profile
  &tenant_id=12345678-1234-1234-1234-123456789012
  &code_challenge={pkce_challenge}

Enrutamiento por tenant

Usa el claim tenant_id para dirigir las peticiones al contexto de tenant correcto en tu backend:

// Extract tenant from token claims
const tenantId = tokenClaims.tenant_id;

// Route request to tenant context
const tenantContext = getTenantContext(tenantId);
const result = await performAction(tenantContext, action);

Buenas prácticas de seguridad

Usa HTTPS en producción

Todas las peticiones OAuth deben usar HTTPS para proteger credenciales y tokens.

PKCE para SPAs y apps móviles

Usa siempre PKCE (Proof Key for Code Exchange) para clientes públicos. Esto evita ataques de interceptación del código de autorización.

Mantén el client secret confidencial

Nunca expongas tu client secret en código del lado del cliente, en logs ni en el control de versiones. Úsalo solo en comunicación segura de backend a backend.

Valida el parámetro state

Genera y valida siempre el parámetro state para prevenir ataques CSRF.

Verifica las firmas de los tokens

Valida siempre las firmas del ID token y del access token usando la clave pública del endpoint de configuración OIDC antes de confiar en su contenido.

Almacena los refresh tokens de forma segura

Guarda los refresh tokens de forma segura (cookies HttpOnly o almacenamiento seguro, no localStorage). Establece tiempos de caducidad adecuados.

Gestiona la caducidad de los tokens

Los access tokens caducan a los 60 minutos. Implementa la lógica de refresco de tokens para mantener un acceso ininterrumpido.

Soporte

Si tienes preguntas, incidencias o necesitas ayuda con la integración, ponte en contacto con nuestro equipo de soporte:

Email: support@advanza.ai
Documentación: https://advanza.ai/docs
Estado: https://status.advanza.ai