El token de acceso y quién llega al relay
Un relay tiene un propietario y un token de acceso. Quien tenga el token tiene el control total del relay y, a través de sus agentes, de la cuenta de usuario con la que se ejecuta el relay. No hay cuentas de usuario, roles ni claves por dispositivo. Esta página explica de dónde sale el token, cómo lo presenta un navegador o un script, quién puede conectarse, qué es accesible sin él y qué hacer si se filtra.
El token #
oar setup crea el token (uno aleatorio en una configuración nueva, 43
caracteres aleatorios entre letras, dígitos, - y _) y lo escribe en
auth en el archivo de configuración, config., en la carpeta de
estado de OAR. Fuera de Windows, el relay mantiene ese archivo legible solo para
ti. Consulta config.json y
Dónde se guardan los secretos.
Sin un auth en la configuración, el relay crea un token aleatorio en cada
arranque, lo imprime en su registro y no lo guarda. Si arrancas el relay con
--token <value>, ese token se usa solo durante esa ejecución; nunca se guarda
y forma parte de la línea de comandos. Tus agentes leen el token de
config. (consulta Los agentes y el token), así que usa un token
guardado allí si quieres que los agentes funcionen.
oar url imprime la dirección con el token actual, por ejemplo
http://. Trata esa dirección como una
contraseña.
Formas de presentarlo #
| Forma | La usa |
|---|---|
La parte ?token= de la dirección de la página |
Un navegador, la primera vez. La página saca el token de la barra de direcciones y lo envía al relay en una cabecera; el relay responde con la cookie de inicio de sesión descrita abajo. Nuevo en 0.9.11 Solo funciona en la dirección de la página: las direcciones de la API, de archivos y de recursos no aceptan ?token= |
| El cuadro de inicio de sesión, Enter your access token to connect (Introduce tu token de acceso para conectarte), y luego Connect (Conectar) | Un navegador sin cookie. Un token incorrecto muestra Invalid token (Token no válido); un cuadro vacío muestra Please enter a token (Introduce un token) |
Una cabecera Authorization: Bearer <token> |
Scripts y llamadas a la API |
| La cookie de inicio de sesión | Un navegador que ya inició sesión antes |
El token nunca se lee del cuerpo de una solicitud ni, desde 0.9.11, de la query
de una solicitud. Si una solicitud lleva a la vez una cabecera y la cookie, el
relay usa la cabecera. Un valor incorrecto no se pasa por alto: una cabecera
incorrecta se rechaza aunque la cookie sea correcta. La conexión en vivo
(Socket.IO) lee el token del campo auth. de la conexión o de la cookie,
no de una cabecera ni de su query.
Un token en la dirección
La primera solicitud de la página, /, lleva el token en su
dirección. Así, el token puede acabar en el historial del navegador, en los
registros de un proxy inverso o un túnel delante del relay y en cualquier sitio
donde copies la dirección. La página lo quita de la barra de direcciones tras
cargarse e inicia sesión con una cabecera, y ninguna otra solicitud toma el
token de la dirección. Siempre que puedas, usa el cuadro de inicio de sesión o
una cabecera.
Scripts que usaban ?token=
Hasta 0.9.10 el relay aceptaba ?token= en cada solicitud. Un script que pide
con él direcciones de la API, de archivos o de recursos recibe ahora 401:
envía Authorization: Bearer <token> en su lugar. Un cliente de Socket.IO pasa
el token como auth.. Consulta Notas de actualización.
La cookie de inicio de sesión #
Tras un token válido, el relay fija una cookie llamada copilot_ que dura 30 días. Esto también
ocurre con un script que envía el token en una cabecera. Es
HttpOnly, así que los scripts de la página no pueden leerla, y Same.
Se marca como Secure cuando se llega al relay por HTTPS. Si llega una
solicitud con una cookie que ya no coincide con el token, el relay responde 401
y borra la cookie, y el navegador muestra el cuadro de inicio de sesión. La
cookie contiene el propio token.
Cerrar sesión y revocar un dispositivo #
La app no tiene un botón para cerrar sesión en el relay, y el relay no guarda una lista de dispositivos con sesión iniciada. Como la cookie contiene el propio token, no se puede revocar un solo dispositivo. En tu propio navegador, borra la cookie en los ajustes del sitio del navegador. Para dejar fuera a todos los dispositivos, incluido uno que hayas perdido, cambia el token (siguiente sección).
Rotar el token #
oar setup --new-token
Esto escribe un token nuevo y reinicia el relay (en una terminal pregunta antes; consulta oar setup). Qué ocurre:
- Navegadores con sesión iniciada. El token antiguo deja de funcionar
cuando el relay se ha reiniciado. El reinicio corta la conexión en vivo, y la
siguiente solicitud de cada navegador falla: el relay borra su cookie y el
navegador muestra el cuadro de inicio de sesión. Vuelve a iniciar sesión con
la dirección de
oar urlo con el token nuevo. - Hasta el reinicio. Si rechazas el reinicio, el relay en ejecución sigue
aceptando el token antiguo hasta
oar restart. - Relays emparejados. Un relay que tiene guardado tu token, porque emparejaste los dos, recibe Token not accepted (Token no aceptado). Vuelve a añadir el relay allí con el token nuevo; consulta Relays remotos. Quitar un emparejamiento en este relay no revoca un token que el otro lado ya tiene, así que rotar el token es la forma de dejar fuera a ese relay.
relay-. Mientras un puerto o token cambiado espera al reinicio,previous. json oar setupguarda el puerto y el token antiguos en este archivo de la carpeta de datos (texto plano, legible solo para ti), para queoar status,oar stopyoar restartsigan encontrando el relay en ejecución. No es un periodo de gracia: el archivo no cambia nada de lo que acepta el relay, y los comandosoarlo borran en cuanto el relay responde con los ajustes nuevos. El token antiguo deja de funcionar solo cuando el relay se reinicia.- Los enlaces compartidos y los enlaces de vista previa tienen sus propios tokens y no se ven afectados.
Editar auth a mano en el archivo funciona igual; oar restart lo
aplica.
Quién puede conectarse #
localhost en la configuración decide dónde escucha el relay:
localhost |
Opción de configuración | El relay escucha en | Accesible desde |
|---|---|---|---|
true (el valor predeterminado) |
oar setup --local, o responder 1 |
127. |
Solo esta máquina |
| cualquier otro valor | oar setup --lan, o responder 2 |
0. (todas las interfaces) |
Cualquier dispositivo que llegue a la dirección y el puerto de la máquina |
Solo el booleano true y el texto "true" (en mayúsculas o minúsculas) cuentan
como local. false, null, 1, "yes" y cualquier otro valor abren el relay
a la red; el valor predeterminado solo se aplica cuando falta la clave.
oar setup escribe la clave como true o false. Un cambio necesita
oar restart.
oar setup, oar url y oar status leen la clave de otra forma: para ellos
solo el booleano false cuenta como acceso LAN, y oar doctor muestra
localhost solo con false. Con un valor como null o "no" el relay
escucha en todas las interfaces mientras esos comandos informan this machine
only (solo esta máquina). Limita la clave a true o false. Consulta
config.json.
En una LAN, el token es la única barrera: el relay no comprueba de dónde viene
una solicitud. Con el acceso this machine only, un teléfono no puede
conectarse hasta que actives el acceso LAN o uses un túnel. localhost no
afecta a los túneles gestionados, que se conectan hacia fuera desde la máquina.
Un relay que está detrás de un proxy o un túnel en la misma máquina puede quedarse
en this machine only. Qué proxies le merecen confianza al relay para sus
cabeceras X- lo fija trust (predeterminado loopback); eso
decide si trata una conexión como HTTPS y marca la cookie como Secure.
Qué necesita el token #
Todo lo que lee o cambia tus conversaciones, archivos, ajustes o agentes necesita el token. Estas son las excepciones, y la lista completa.
| Ruta | ¿Necesita el token? | Qué da |
|---|---|---|
/ y / |
No | La app web y su cuadro de inicio de sesión |
Los archivos de script, estilo e iconos de la app web, /, / |
No | La app en sí, que no contiene ninguno de tus datos |
/ |
No | El manifiesto de instalación. Lleva el nombre de la app que fijas en Settings (Ajustes) |
/ |
No | La página de una conversación compartida |
/ y sus rutas de presencia, archivos subidos e imágenes generadas |
No, pero sí un token de enlace válido y no revocado | Acceso de solo lectura a esa conversación. Consulta Compartir |
| Enlaces de vista previa en el host de vistas previas | No, pero sí un token de vista previa válido | Solo la app de la vista previa; el host de vistas previas no sirve el relay. Consulta Vistas previas |
/ (todas las demás rutas) |
Sí | Conversaciones, ajustes, archivos, estado, vistas previas, emparejamiento |
| La conexión en vivo (Socket.IO) | Sí, y Nuevo en 0.9.11 un navegador debe abrirla desde la propia dirección del relay | Las actualizaciones en vivo de la app. Consulta allowed para un proxy que reescribe el host |
| La conexión de los workers con el relay | Sí | La usan los propios procesos de tus agentes en esta máquina |
| Archivos de tus unidades y del workspace, archivos subidos e imágenes generadas por su propia dirección | Sí | Un espectador de un enlace compartido no puede cargarlos así; las rutas compartidas de arriba sirven los que usa esa conversación. Consulta Multimedia y archivos |
No hay ningún endpoint de salud o de versión sin autenticación: /,
al que llama oar status, necesita el token.
Los enlaces compartidos y los enlaces de vista previa son públicos por diseño. El token aleatorio del enlace es su única protección, así que ciérralos o revócalos cuando termines. Los archivos que sirve el relay se envían con una política de sandbox, así que un archivo HTML o SVG servido no puede ejecutar scripts en el origen del relay.
La conexión de los workers solo responde a solicitudes de la propia máquina del
relay que no haya reenviado ningún proxy ni túnel; todo lo demás se rechaza con
403 antes de comprobar el token. Los enlaces compartidos a través de un túnel
no se ven afectados. Consulta
La protección de rutas del worker de sesión.
Protecciones en el inicio de sesión #
- Para el inicio de sesión y la conexión en vivo, el relay compara los tokens en tiempo constante.
- Nuevo en 0.9.11 Diez tokens incorrectos bloquean una dirección durante un
minuto. Diez tokens incorrectos desde una misma dirección de cliente en un
minuto, en una cabecera, la cookie, el cuadro de inicio de sesión o el
handshake de una conexión en vivo, hacen que el relay responda a esa dirección
429conRetry-hasta que pase el minuto, incluido el token correcto. El cuadro de inicio de sesión dice Too many failed sign-in attempts. Try again in 42 seconds. (Demasiados intentos de inicio de sesión fallidos. Vuelve a intentarlo en 42 segundos.). El mismo valor incorrecto repetido cuenta una vez, así que una pestaña con una cookie antigua no te bloquea. El relay registra una línea que empieza porAfter [auth]cuando rechaza una dirección. - Las solicitudes de la propia máquina del relay que no haya reenviado ningún proxy ni túnel nunca se cuentan ni se bloquean, así que los workers del relay y las herramientas de los agentes siguen funcionando.
- La dirección del cliente es aquella en la que el relay confía. Detrás de un proxy en otra máquina en el que el relay no confía, todos los clientes tienen la dirección del proxy, y los tokens incorrectos de un cliente los bloquean a todos.
- El bloqueo frena los intentos de adivinar; no sustituye a un buen token.
Mantén el token largo y aleatorio:
oar setupgenera uno; no lo cambies por una palabra corta. - El único límite de frecuencia en rutas que no necesitan token es el de los
pings de presencia de las conversaciones compartidas: 24 cada 10 segundos por
enlace compartido y dirección de cliente. Nuevo en 0.9.11 La dirección del
cliente sigue a
trust, como el bloqueo, así que un cliente no puede elegir la suya enviandoProxy X-.Forwarded- For - El token no se escribe en el registro, salvo cuando la configuración no tiene
ninguno y el relay crea uno temporal al arrancar.
oar startyoar urllo imprimen en tu terminal.
Los agentes y el token #
Tus agentes se ejecutan como procesos del usuario con el que se ejecuta el
relay, en la máquina del relay. No reciben credenciales propias: para hablar con
el relay leen el propio token del relay de config. y lo envían como lo
haría el propietario. El relay no pone el token en el entorno ni en el prompt de
un agente, pero un agente se ejecuta con el mismo usuario del sistema operativo,
así que puede leer el archivo y, con él, el token. Lo mismo vale para todo lo
que ejecute un agente. Da por hecho que todos los agentes que ejecutas conocen
el token, y ejecuta agentes solo con un usuario al que confiarías el relay.
El relay no comunica a los agentes el token de un relay emparejado: los agentes llegan a un relay emparejado a través de este relay, que añade el token guardado (Relays remotos). Un agente también actúa con los permisos del usuario con el que se ejecuta el relay, así que cualquier cosa que el propietario del relay pueda hacer en la máquina se le puede pedir a un agente.
HTTP sin cifrar en una LAN #
Con acceso LAN y una dirección http://, el token y la cookie cruzan la red sin
cifrar. Cualquiera que pueda observar ese tráfico puede leer el token. Úsalo en
una red de confianza o pon HTTPS delante. Con HTTP sin cifrar, la cookie no se
marca como Secure.
Instalar OAR como app y las notificaciones push necesitan HTTPS o localhost,
así que ninguna de las dos funciona con una dirección LAN sin cifrar: consulta
Instalar como app y
Notificaciones.
Si crees que el token se filtró #
- Ejecuta
oar setup --new-y deja que reinicie el relay. Todos los navegadores pierden la sesión. Si rechazas el reinicio, ejecutatoken oar restart: hasta entonces el token antiguo sigue funcionando. - Vuelve a iniciar sesión con la dirección de
oar url. - En cada relay que emparejaste con este, vuelve a añadir este relay con el token nuevo (Relays remotos).
- Comprueba dónde se guardó el token: scripts, historial de la shell, la
dirección que pegaste en un chat y copias o copias de seguridad de
config..json - Detén o renueva los enlaces compartidos en Settings → Sharing (Ajustes → Compartir) (Tus enlaces compartidos) y cierra las vistas previas que no reconozcas. Esos tienen sus propios tokens.
- Si alguien pudo usar el relay mientras estaba expuesto, revisa lo que hicieron sus agentes. Quien tiene el token puede iniciar agentes que ejecutan comandos como el usuario del relay.