Apps conectadas (OAuth)
Un token que actúa como una persona, con su permiso, y que nunca puede más que ella.
Cuando lo que estás construyendo trabaja para una persona, lo que quieres no es una clave del espacio sino que esa persona te autorice. El resultado es un token que ve lo que ella ve. Para una integración sin persona detrás, usa una clave de API en su lugar.
La regla que gobierna todo
Una conexión nunca puede hacer más que la persona que la autorizó. Se aplica en dos momentos, no en uno:
- Al autorizar. La pantalla de consentimiento solo ofrece los permisos que esa persona podría conceder. Si no tiene puesto en Swarm, los permisos de Swarm no aparecen para marcar.
- En cada llamada. Cada aplicación vuelve a comprobar el token contra el rol y las membresías que esa persona tiene hoy. El token no las esquiva.
Por eso, si mañana esa persona pierde un acceso, la conexión también lo pierde, sin que nadie tenga que acordarse de revocarla.
El flujo
Es OAuth 2.1 estándar, código de autorización con PKCE. El resultado autoriza
el acceso a datos; no inicia sesión en tu producto, así que no hay
id_token, ni /userinfo, ni nonce.
| Paso | Endpoint |
|---|---|
| Descubrimiento | GET /.well-known/oauth-authorization-server |
| Consentimiento | GET https://auth.eel.software/oauth/authorize |
| Canje y refresco | POST https://auth.eel.software/api/oauth/token |
| Revocación | POST https://auth.eel.software/api/oauth/revoke |
Un cliente que hable el protocolo no necesita nada de esto escrito: pide el
endpoint de MCP sin credencial, recibe un 401 con WWW-Authenticate apuntando a
los metadatos, y desde ahí encuentra todo solo.
Lo que hay que saber antes de escribir código
- PKCE con S256 es obligatorio, y es la única prueba de identidad del cliente.
plainno se ofrece. - No hay secretos de cliente. Todos los clientes son públicos. No busques dónde pegar uno porque no existe.
- Tu
client_idpuede ser una URL. Si empieza porhttps://, Eel la lee como documento de metadatos y la recuerda durante una hora. Si prefieres registrarte, hay registro dinámico enPOST /api/oauth/register. - El
redirect_urise compara carácter por carácter. La única excepción es loopback, donde el puerto queda libre porque una app de escritorio no puede saber de antemano cuál le va a tocar.127.0.0.1,[::1]ylocalhostcuentan todos como loopback. - Toda respuesta de autorización trae
iss, también las de error. Un cliente conforme debe rechazar la que no lo traiga.
Duraciones
| Pieza | Dura |
|---|---|
| Código de autorización | 60 segundos, un solo uso |
Token de acceso (eel_at_) |
1 hora |
Token de refresco (eel_rt_) |
60 días, rotativo |
Cada refresco emite un par nuevo y consume el anterior. Reusar un refresco ya consumido revoca la familia entera. Refresca desde un solo hilo: si tu cliente refresca dos veces en paralelo, el resultado es una desconexión, y eso es preferible a que alguien más se quede con el acceso en silencio. El par nuevo siempre hereda los permisos de la familia: refrescar no permite reducirlos.
No hay endpoint de introspección. Un token no se puede consultar de antemano: se usa y se ve si responde.
Una conexión puede autorizar varios espacios
La pantalla de consentimiento ofrece una casilla por cada espacio que puedas conceder, no una sola opción: puedes marcar varios a la vez. El primero que marques queda como el espacio por defecto del token; los demás quedan igual de autorizados, cada uno con sus propios permisos, recortados a lo que tienes en ese espacio en concreto. Por eso una misma conexión puede ser de lectura y escritura en un espacio y de solo lectura en otro.
Una herramienta MCP puede pedir actuar en cualquiera de los espacios autorizados
con el argumento workspace (id o slug); sin él, actúa en el espacio por
defecto. La URL del conector también acepta ?workspace=<id> para preseleccionar
una casilla. Para la versión de este mismo procedimiento contada desde el lado
del asistente, ver Espacios de trabajo en
MCP y Conectar un
asistente.
Cambiar los espacios sin reconectar
Ampliar o quitar espacios de una conexión ya autorizada se hace en Nest, en
Apps conectadas, y no exige volver a autorizar nada desde el lado del
asistente: el token sigue siendo el mismo, con el mismo client_id y la misma
cadena de refresco. El cambio se aplica dentro de la misma ventana de 60
segundos que rige la revocación.
Quitar el espacio por defecto asciende al más antiguo de los que queden. Quitar el último equivale a revocar la conexión entera.
Ampliar los permisos sin reconectar
Una conexión lleva los permisos que se firmaron en su consentimiento. Un permiso que Eel publicó después no le llega solo, y sus herramientas no aparecen en el catálogo del asistente.
La persona que autorizó la conexión los aprueba en Nest, en Apps conectadas. Ese aprobado alcanza solo las aplicaciones que la conexión ya usa, recortado a lo que esa persona puede conceder hoy en cada espacio. Una conexión sin ningún permiso de escritura en una aplicación solo recibe lecturas nuevas de ella.
El token es el mismo y la cadena de refresco también: el cambio se aplica dentro de la misma ventana de 60 segundos. El asistente muestra las herramientas nuevas la próxima vez que se conecta. Si quieres verlas ya, desactiva y vuelve a activar el conector: no hace falta autorizarlo de nuevo.
Cuándo sí hace falta reconectar
Solo en estos casos:
- La primera conexión.
- Una conexión revocada del todo.
- Una cadena de refresco que ya expiró.
- Llegar a una aplicación que la conexión nunca ha tocado.
Achicar permisos, cambiar de espacios y ampliar permisos dentro de las aplicaciones que la conexión ya usa nunca lo exigen.
Revocar
Dos lugares, dos alcances:
- Cada persona, en Nest → Tu cuenta → Apps conectadas, revoca las suyas enteras, en todos los espacios donde estuvieran autorizadas.
- Un administrador, en Espacio de trabajo → Apps conectadas, ve las conexiones autorizadas en SU espacio y puede cortar cualquiera, pero solo ahí: si esa misma conexión también está autorizada en otro espacio, sigue viva ahí. Solo muere del todo cuando el espacio que corta era el último que le quedaba.
El corte tarda hasta 60 segundos en propagarse.