Televisores, consolas y herramientas de línea de comandos
En un televisor no es fácil mostrar una página de inicio de sesión, y una herramienta de línea de comandos no debería pedir una contraseña. Con el flujo de dispositivo, el dispositivo muestra un código corto, y la persona lo escribe en el Lobby del entorno desde su teléfono o su computadora, donde ya inició sesión.
Registra la app
En Usher Console, abre el entorno y luego Aplicaciones → Nueva aplicación → TV o línea de comandos. La app recibe un ID de cliente y ningún secreto: un dispositivo no puede guardarlo.
El flujo
# 1. the device asks for a code
curl -s -X POST https://acme.usherid.com/api/auth/device/code \
-d client_id=YOUR_CLIENT_ID -d scope='openid email offline_access'
# → { "device_code": "…", "user_code": "6L95PBQQ",
# "verification_uri": "https://acme.usherid.com/device",
# "verification_uri_complete": "https://acme.usherid.com/device?user_code=6L95PBQQ",
# "expires_in": 600, "interval": 5 }
# 2. it shows the code (and a QR code of verification_uri_complete), then polls
curl -s -X POST https://acme.usherid.com/api/auth/oauth2/token \
-d grant_type=urn:ietf:params:oauth:grant-type:device_code \
-d device_code=… -d client_id=YOUR_CLIENT_ID
# → { "error": "authorization_pending" } until the person allows it,
# then { "access_token": "…", "id_token": "…", "refresh_token": "…" }- Consulta con calma. Espera
intervalsegundos entre consultas. Si consultas más rápido, la respuesta esslow_down. - Detente cuando te lo indiquen.
access_deniedsignifica que la persona lo rechazó;expired_token, que pasaron diez minutos. Pide un código nuevo. - Muestra también la dirección. No todos pueden escanear un código QR: muestra
verification_uriy el código, separado así:6L95-PBQQ.
En /device, el Lobby le muestra a la persona qué app lo pide y para qué. Le indica que continúe solo si fue ella quien lo inició y si su dispositivo muestra el mismo código.
Vincula los tokens al dispositivo (DPoP)
Un token copiado de un dispositivo sigue siendo un token. Con DPoP (RFC 9449), el dispositivo guarda una clave privada y envía una prueba firmada nueva con cada solicitud. Un token vinculado a esa clave no sirve de nada sin ella.
- Pide tokens vinculados: envía un encabezado
DPoPcon tus solicitudes de token, y Usher vincula lo que emite a tu clave (token_typeesDPoP). - Exígelos: activa Requerir DPoP al crear la app. Así, Usher no le emite ningún token sin una prueba.
- Úsalos con
Authorization: DPoP <token>, más una prueba para esa solicitud. - Bibliotecas: la mayoría de las bibliotecas de OAuth compatibles con DPoP hacen todo esto por ti (por ejemplo, la opción
DPoPdeopenid-client).