Flujo de autorización de dispositivos
El problema: dispositivos sin teclado
El tipo de concesión más común de OAuth 2.0 — Authorization Code con PKCE — asume que el cliente puede abrir un navegador, mostrar una página de inicio de sesión y aceptar entrada de teclado del usuario. Esta suposición falla para toda una categoría de dispositivos:
| Dispositivo | Por qué falla OAuth estándar |
|---|---|
| Smart TVs | Sin teclado; los teclados en pantalla son incómodos |
| Herramientas CLI | Sin navegador; interfaz solo de terminal |
| Consolas de juegos | Entrada por mando; introducir URLs y credenciales es impráctico |
| Dispositivos IoT | Sin pantalla en absoluto, o pantalla mínima |
| Señalización digital / quioscos | Entorno bloqueado; sin navegación en browser |
| Dongles de streaming (Chromecast, Fire Stick) | Solo control remoto; sin teclado |
Estos dispositivos necesitan autenticar usuarios, pero no pueden alojar un formulario de inicio de sesión. El usuario necesita autenticarse en otro lugar — en su teléfono o laptop — y el dispositivo necesita enterarse de que la autenticación fue exitosa.
Esto es exactamente lo que resuelve el Device Authorization Grant de OAuth 2.0 (RFC 8628).
Cómo funciona el flujo de dispositivos
El Device Authorization Grant introduce un patrón de dispositivo secundario: el dispositivo cliente muestra un código corto, el usuario introduce ese código en un dispositivo con navegador (su teléfono o laptop), y el dispositivo cliente realiza polling al servidor de autorización hasta que el usuario completa la autenticación.
El flujo paso a paso
Paso 1: El cliente solicita códigos de dispositivo y usuario
POST /api/oauth/device HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
client_id=tv-app-client-id
&scope=openid profile emailPaso 2: El servidor devuelve los códigos
{
"device_code": "GmRhmhcxhwAzkoEqiMEg_DnyEysNkuNhszIySk9eS",
"user_code": "WDJB-MJHT",
"verification_uri": "https://auth.example.com/device",
"verification_uri_complete": "https://auth.example.com/device?user_code=WDJB-MJHT",
"expires_in": 600,
"interval": 5
}| Campo | Descripción |
|---|---|
device_code | Una cadena larga y aleatoria que el cliente usa cuando realiza polling. Nunca se muestra al usuario. |
user_code | Un código corto y legible que el usuario introduce en la página de verificación. |
verification_uri | La URL que el usuario visita para introducir el código. |
verification_uri_complete | La URL completa con el código de usuario pre-rellenado (para códigos QR). |
expires_in | Cuánto tiempo son válidos los códigos (segundos). Predeterminado: 600 (10 minutos). |
interval | Intervalo mínimo de polling en segundos. El cliente no debe realizar polling más rápido. |
Paso 3: El usuario se autentica en su dispositivo secundario
El dispositivo cliente muestra el user_code y la verification_uri al usuario. El usuario abre la URL en su teléfono o laptop, introduce el user_code, inicia sesión con sus credenciales e aprueba el dispositivo.
Paso 4: El cliente realiza polling
Mientras el usuario se autentica, el cliente realiza polling al endpoint de tokens:
POST /api/auth/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
grant_type=urn:ietf:params:oauth:grant-type:device_code
&device_code=GmRhmhcxhwAzkoEqiMEg_DnyEysNkuNhszIySk9eS
&client_id=tv-app-client-idRespuestas posibles durante el polling:
| Respuesta | Significado |
|---|---|
authorization_pending | El usuario aún no ha completado la autenticación — continúa el polling |
slow_down | El cliente está realizando polling demasiado rápido — aumenta el intervalo en 5 segundos |
access_denied | El usuario rechazó la solicitud — detén el polling |
expired_token | Los códigos han expirado — reinicia el flujo |
| Tokens emitidos | La autenticación fue exitosa |
Paso 5: Recibir tokens
{
"access_token": "eyJhbGciOiJSUzI1NiJ9...",
"token_type": "Bearer",
"expires_in": 900,
"refresh_token": "rt_7fKp2mXa9qN3vB8yR4tL1wC6jD5sE0uH",
"id_token": "eyJhbGciOiJSUzI1NiJ9...",
"scope": "openid profile email"
}El CLI de Auris (@auris/cli) utiliza el Device Flow para el comando auris login. Cuando ejecutas auris login, la CLI imprime la URL y el código, y el polling ocurre automáticamente en segundo plano. Una vez que completas el inicio de sesión en tu navegador, el CLI recibe los tokens sin que tengas que hacer nada más.
Propiedades de seguridad
- Los
user_codeson cortos y legibles por humanos — diseñados para introducirse manualmente, no copiarse - El
device_codees largo y aleatorio — previene la adivinación por fuerza bruta - Ambos códigos expiran (10 minutos por defecto)
- El servidor aplica el intervalo de polling para prevenir el abuso
- MFA se aplica normalmente — si el usuario tiene TOTP configurado, debe completarlo durante la autenticación del dispositivo