Administrar
Configurar proveedores de identidad
El cableado paso a paso de cada proveedor de identidad — dónde encontrar el ID de cliente y el secreto, qué forma tiene la URL del emisor, y la única URI de redirección que tienes que registrar. Cubre Microsoft, Google y cualquier proveedor OIDC estándar.
9 min de lectura
Control de acceso explica qué hace un proveedor. Esta página es el cableado: los valores exactos que pide cada proveedor y dónde encontrarlos.
La URI de redirección va primero
Todos los proveedores, sin excepción, necesitan un valor registrado de su lado: la URL a la que devuelven al usuario tras iniciar sesión.
https://tu-host-del-agente/auth/callback
El panel muestra el valor exacto en cada proveedor que abras, en Acceso → Inicio de sesión, con un botón de copiar. Úsalo: no lo escribas a mano.
Note
Regístralo después de configurar tu propio dominio del agente en la página Instalar en Excel. Hasta entonces el panel muestra el host predeterminado, y la URI de redirección cambia en cuanto configures uno real, dejando de coincidir con la que registraste. Los proveedores comparan esta cadena carácter por carácter: un https:// que falta, una barra final o un puerto distinto producen el mismo error poco útil de "redirect_uri mismatch".
Microsoft — cuentas de trabajo o centro educativo
Usa el proveedor Entra ID. Cubre las cuentas que viven en un directorio de Microsoft (tu@tu-empresa.com), no las direcciones personales de Outlook o Hotmail.
- En el portal de Azure, ve a Microsoft Entra ID → Registros de aplicaciones → Nuevo registro.
- En URI de redirección, elige Web y pega la URL de callback del panel.
- Copia el ID de aplicación (cliente) y el ID de directorio (inquilino) de la página de información general.
- En Certificados y secretos → Nuevo secreto de cliente, crea un secreto y copia su valor al momento: Azure no vuelve a mostrarlo.
- En ConnXL, añade el proveedor Entra, pega el ID de cliente y el de inquilino, y apunta el secreto de cliente a tu propio almacén de secretos.
Quién puede iniciar sesión es una elección aparte en ese proveedor:
- Solo mi organización de Microsoft — el emisor queda fijado a tu inquilino. A cualquiera de fuera se le rechaza antes de comprobar ninguna otra regla.
- Cualquier organización de Microsoft — acepta directorios de otras empresas, sujeto a tus reglas de audiencia. Requiere dos cosas en tu registro de aplicación que ConnXL no puede configurar ni detectar: el registro debe aceptar cuentas de cualquier directorio organizacional (multi-tenant), y debe pedir el claim opcional
xms_edoven el token de acceso (Configuración de token → Agregar claim opcional). Sin lo primero, Microsoft rechaza por su cuenta los inicios de sesión externos; sin lo segundo, se rechaza cada inicio de sesión de nuestro lado, porque ese claim es la única señal de que un email pertenece realmente a quien lo presenta.
Microsoft — cuentas personales
Usa el proveedor Cuenta personal de Microsoft para direcciones de outlook.com, hotmail.com y live.com. No están en ningún directorio de Entra, así que el proveedor Entra nunca las aceptará.
La configuración es igual que arriba con una diferencia: en Nuevo registro, elige como tipos de cuenta admitidos Solo cuentas personales de Microsoft (o «cualquier directorio organizacional y cuentas personales de Microsoft» si quieres ambas poblaciones). No hay emisor que introducir: todas las cuentas personales de Microsoft viven en un único directorio propiedad de Microsoft, así que ConnXL fija ese emisor por ti.
Note
Esto deja entrar a cualquiera con una cuenta gratuita de Microsoft. Combínalo con la lista de dominios permitidos, o con una audiencia de usuarios concretos, salvo que tu complemento sea realmente público.
Microsoft — cualquier cuenta
Usa el proveedor Microsoft (cualquier cuenta) cuando tus usuarios son una mezcla de directorios de trabajo/escuela y cuentas personales, y quieres un único botón de inicio de sesión para todos. No hay tenant ni emisor que introducir: el inicio de sesión pasa por el endpoint common de Microsoft, y ConnXL verifica el emisor de cada token contra el tenant en el que ese mismo token fue emitido.
La configuración es el mismo registro de aplicación de arriba, con dos ajustes que son ambos obligatorios (ConnXL no puede establecer ni detectar ninguno, y equivocarse en uno falla como un error opaco de Microsoft):
- En Nuevo registro (o después en Autenticación → Tipos de cuenta admitidos), elige Cuentas en cualquier directorio organizativo y cuentas personales de Microsoft. Cualquier opción más estrecha hace que la propia Microsoft rechace una de las dos clases de cuenta.
- En Configuración de token → Agregar notificación opcional → ID, añade
xms_edov. Los emails de cuentas de trabajo solo se aceptan cuando Microsoft atestigua el propietario del dominio; sin la notificación, todo inicio de sesión con cuenta de trabajo se rechaza en nuestro lado (las cuentas personales no se ven afectadas: su dirección es la identidad verificada de la cuenta).
Note
Como el proveedor de cuentas personales, esto deja entrar a cualquiera con cualquier cuenta de Microsoft. Usa la lista de dominios permitidos o una audiencia de usuarios concretos para acotarlo, y prefiere el proveedor Entra ID normal cuando todos tus usuarios viven en directorios conocidos.
Usa el proveedor Google. No hay emisor que introducir: Google tiene exactamente uno, compartido por todas las cuentas de Google.
- En la consola de Google Cloud, ve a APIs y servicios → Credenciales → Crear credenciales → ID de cliente de OAuth.
- Tipo de aplicación Aplicación web; añade la URL de callback en URIs de redirección autorizados.
- Copia el ID de cliente y el secreto de cliente.
El equivalente a la elección «quién puede iniciar sesión» de Microsoft vive del lado de Google, en Pantalla de consentimiento de OAuth → Tipo de usuario:
- Interno — solo cuentas de tu organización de Google Workspace.
- Externo — cualquier cuenta de Google de internet. Mientras la app esté en Pruebas tienes un tope de 100 usuarios de prueba nombrados; publicarla lo elimina.
Note
Una app de Google Externa y publicada acepta todas las cuentas de Google que existen. ConnXL no tiene un interruptor por organización para Google porque el emisor de Google no lleva ninguna organización: restringe con la lista de dominios permitidos.
Cualquier otro proveedor (OIDC genérico)
Usa el proveedor OpenID Connect para todo lo demás. No tiene límite: conecta Okta y Auth0 y tu propio Keycloak a la vez, cada uno con su botón de inicio de sesión.
Necesita tres cosas: la URL del emisor, un ID de cliente y un secreto de cliente. ConnXL lee el documento /.well-known/openid-configuration del emisor para descubrir los endpoints de autorización, token y JWKS, así que nunca los introduces.
El emisor debe ser una URL https:// con host: un dominio a secas se rechaza. El selector Configurar para, junto al campo, cambia el ejemplo a la forma de tu proveedor:
| Field | Type | Description |
|---|---|---|
OktaOptional | emisor | Normalmente https://tu-org.okta.com, o https://tu-org.okta.com/oauth2/default si usas un servidor de autorización propio. Applications → Create App Integration → OIDC → Web Application. |
Auth0Optional | emisor | El dominio de tu tenant, p. ej. https://tu-tenant.us.auth0.com. Applications → Create Application → Regular Web Application. |
KeycloakOptional | emisor | Con el realm en la ruta: https://id.tu-empresa.com/realms/tu-realm. Clients → Create client → OpenID Connect, con client authentication activado. |
AWS CognitoOptional | emisor | https://cognito-idp.<región>.amazonaws.com/<id-del-user-pool>. Ojo: si el pool permite auto-registro, cualquiera puede crearse una cuenta. |
Ping IdentityOptional | emisor | https://auth.pingone.com/<id-de-entorno> para PingOne. |
Cualquier otro proveedor que cumpla el estándar funciona igual: si publica un documento de descubrimiento, ConnXL puede usarlo.
Ámbitos
Deja la lista de ámbitos vacía salvo que tu proveedor necesite más que los predeterminados. ConnXL siempre pide lo necesario para identificar al usuario; los ámbitos extra solo sirven cuando tu IdP exige uno explícito para entregar el claim del email.
Seguridad a nivel de fila (intercambio de token)
Todo lo anterior sirve para que alguien inicie sesión. Esta sección va de lo que pasa después: llevar esa identidad hasta tu propia base de datos, para que una consulta devuelva sus filas y las de nadie más.
El modo de autenticación Intercambio de token de inicio de sesión de una conexión HTTP lo hace posible. En lugar de reenviar el token de Microsoft tal cual, el agente emite un JWT de vida corta a partir de la identidad que acaba de validar, lo firma con un secreto que aportas tú, y lo envía como bearer token en cada petición que hace la función.
El token emitido lleva sub, email y name del usuario de Excel con la sesión iniciada, más role, aud, iss, iat y exp. PostgREST —la API REST que Supabase genera sobre tu base de datos— y Hasura aceptan exactamente esa forma, así que tus políticas de Row-Level Security se aplican por usuario: cada petición desde una celda llega como la persona que escribió la fórmula, no como una única cuenta de servicio compartida.
Cuál de los dos modos de usuario elegir
user_token— reenvío directo. Elígelo cuando tu API valida los tokens de Microsoft por sí misma: ya tiene configurados el emisor, la audiencia y las claves de firma, y lee la identidad de quien llama directamente del token que reenvía el agente.user_token_exchange— intercambio de token. Elígelo cuando tu API valida sus propios JWT y no sabe nada de Microsoft: PostgREST, Supabase, Hasura o cualquier servicio que verifique un secreto HS256 compartido. El agente es el puente entre ambos mundos.- Ambos modos envían la credencial como
Authorization: Bearer <token>. Si tu API la lee de otra cabecera, pon ese nombre en el campouserTokenHeaderde la conexión: el token se envía entonces sin prefijo en esa cabecera. Déjalo vacío para el comportamiento por defecto.
Receta: filas por usuario desde Supabase
- Localiza el secreto de firma. En tu panel de Supabase, ve a Project Settings → API → JWT Secret. Ese es el secreto con el que PostgREST verifica cada token que le llega.
- Guárdalo como referencia. Pon el valor en tu propio almacén de secretos y apunta a él el campo
exchangeSecretde la conexión —secret://env/SUPABASE_JWT_SECRET, o cualquiera de los demás backends que se listan en Conexiones. El valor en sí nunca llega a ConnXL. - Crea la conexión. Tipo HTTP API, URL base
https://<project-ref>.supabase.co/rest/v1, autenticación Intercambio de token de inicio de sesión, audienciaauthenticated. - Añade la cabecera
apikey. PostgREST quiere la anon key de tu proyecto en cada petición además del bearer token. Añádela como cabecera extra en la conexión — nombreapikey, valor la anon key, de nuevo como referenciasecret://. Sin ella Supabase rechaza la llamada antes siquiera de mirar el JWT. - Escribe la política. Activa RLS en la tabla y ánclala a un claim del token emitido:
create policy "own rows" on documents for select using (auth.jwt()->>'sub' = user_id);Usa auth.jwt()->>'email' en su lugar cuando tus filas se identifiquen por dirección de correo y no por el subject id del proveedor.
Los campos del intercambio
| Field | Type | Description |
|---|---|---|
exchangeSecretRequired | secret://… | Referencia al secreto HS256 con el que se firma el token — en Supabase, Project Settings → API → JWT Secret. Es de solo escritura: una vez guardado, el panel únicamente muestra que hay un secreto puesto, nunca su valor. |
exchangeAudienceRequired | string | El claim aud que lleva el token emitido. Supabase y PostgREST esperan authenticated. |
exchangeIssuerOptional | string | El claim iss. Déjalo vacío salvo que el servicio receptor fije un emisor concreto. |
exchangeTtlSecondsOptional | number | Cuánto tiempo sigue siendo válido un token emitido, entre 60 y 600 segundos. Por defecto 300. |
exchangeRoleOptional | string | Un claim role fijo en cada token emitido. Por defecto authenticated, que es lo que Supabase espera de quien tiene la sesión iniciada. |
Tu agente pasa a emitir tokens para tu propio proyecto
Ese es justo el sentido del modo, y conviene tenerlo presente: cualquiera que pueda llamar a una función sobre esta conexión obtiene un token emitido a su nombre. Tres cosas lo acotan:
- El secreto se queda en tu infraestructura. El agente resuelve la referencia
secret://en el momento de la ejecución, en tu host. ConnXL guarda la referencia, nunca el valor, y ningún token emitido se registra en los logs. - Los tokens duran poco. Diez minutos es el techo, cinco el valor por defecto: suficiente para un recálculo, demasiado poco para que compense guardarlo.
- El usuario debe tener la sesión iniciada en Excel. No hay salida anónima: una celda que llame a una de estas funciones sin nadie con la sesión iniciada falla con un error de inicio de sesión, en lugar de emitir en silencio un token con claims vacíos.
Cuando el inicio de sesión no funciona
- «redirect_uri mismatch» — la URL registrada no coincide con la que muestra el panel, carácter por carácter. Cópiala de nuevo.
- «redirect_uri mismatch» que se queja de
http://frente ahttps://(Entra lo muestra comoAADSTS500112) — el TLS termina en un balanceador de carga o proxy inverso delante del agente, y el agente no confía en las cabeceras reenviadas por defecto. DefineCONNXL_TRUSTED_PROXY=1en el host del agente para que el callback se construya comohttps://. - El inicio de sesión funciona pero el complemento igual te rechaza — la autenticación funcionó, la autorización no. Revisa los dominios permitidos/denegados y la audiencia en Control de acceso.
- Todos los inicios de sesión de Entra fallan en modo «cualquier organización» — falta el claim opcional
xms_edoven el registro de aplicación. - No pasa nada al pulsar el botón de inicio de sesión — el agente debe servir HTTPS de confianza; Excel se niega a cargar un complemento, o su diálogo de inicio de sesión, desde un host no confiable.