Skip to content

[Relay][P0] Adoptar credenciales efímeras con scopes, DPoP y tickets WebSocket #44

Description

@0bkevin

Contexto auditado

T3 Connect usa token exchange, scopes por capacidad, access tokens DPoP de 30 minutos y replay storage para cada proof. El entorno emite tickets WebSocket breves y de propósito único. Referencias: Environment Authentication Profile, RelayTokens, DpopProofs y managedRelay client.

Se comparó contra Brio main y contra 967f4e5610f631bac9e4b9e69b07d956185491ca.

Brecha actual

Brio mejoró el transporte del secreto al mover tokens WebSocket del query string a un subprotocol role-bound, pero los tokens de device y connector siguen siendo bearer de larga vida. Quien obtiene uno puede reproducirlo hasta revocación. Tampoco hay scopes por operación, proof-of-possession, expiración corta, replay ledger ni ticket específico para abrir WebSocket.

Propuesta

  1. Definir scopes Relay separados, como agent:list, agent:connect, agent:manage, device:manage y activity:publish.
  2. Intercambiar la sesión de identidad por access tokens cortos ligados a una clave DPoP del dispositivo.
  3. Verificar htu, htm, iat, jti, thumbprint y ath; consumir el jti de forma atómica en almacenamiento compartido.
  4. Emitir tickets WebSocket single-purpose, de pocos minutos y ligados a agent/device/role.
  5. Mantener credenciales de connector y claves privadas en keychain/SecureStore/archivo 0600 según plataforma.
  6. Refrescar antes de expirar, clasificar errores de auth como bloqueados y despertar el supervisor cuando cambie la credencial.
  7. Hacer cutover explícito y revocar sesiones legacy; no mapear silenciosamente permisos antiguos a scopes nuevos.
  8. Mantener respuestas de credenciales con Cache-Control: no-store y sin secretos en logs/traces.

Criterios de aceptación

  • Un access token robado no funciona sin la clave DPoP.
  • Reutilizar el mismo proof falla incluso contra otra réplica.
  • Un token de lectura no puede unlink, recover, registrar devices ni abrir un túnel con otro role/agent.
  • Los tickets WebSocket expiran y no pueden reutilizarse.
  • Revocar device, unlink agent o rotar connector corta REST y sockets activos.
  • Mobile renueva tokens sin interrumpir una sesión sana y presenta reautenticación accionable si no puede.
  • Hay pruebas de replay, clock skew, scope escalation, wrong audience/URL/method, token theft, rotation y migración legacy.

Issue de ejecución enfocada para el objetivo amplio de #5.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions