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ónredirect_uri(obligatorio): URL a la que redirigir tras la autenticaciónresponse_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 PKCEcode_challenge_method(obligatorio junto con code_challenge): 'S256'state(recomendado): Cadena aleatoria para prevenir ataques CSRFtenant_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 /authorizeclient_id(obligatorio): El ID de tu aplicaciónclient_secret(obligatorio): El secreto de tu aplicación (mantenlo confidencial)redirect_uri(obligatorio): Debe coincidir con la petición a /authorizecode_verifier(obligatorio para SPA): Code verifier de PKCErefresh_token(para el flujo de refresco): El refresh token a intercambiarusername & 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.)
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 usuarioemail_verified: Si el email está verificadoname, given_name, family_name: Nombre del usuariotenant_id: Tenant/organización activo del usuarioiss: 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 usuarioemail, name: Información del usuariotenant_id: Tenant activo (úsalo para el enrutamiento multiinquilino)roles: Roles del usuario en el tenantscope: Scopes concedidosexp: 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