Телевизоры, приставки и командная строка
Телевизору непросто показать страницу входа, а инструменту командной строки не стоит спрашивать пароль. В потоке для устройств устройство показывает короткий код, а человек вводит его в Lobby своей среды на телефоне или компьютере, где он уже выполнил вход.
Зарегистрируйте приложение
В Usher Console откройте среду, затем Приложения → Новое приложение → Телевизор или командная строка. Приложение получит ID клиента и не получит секрета: устройство не может хранить его в тайне.
Как проходит вход
# 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": "…" }- Опрашивайте вежливо. Выжидайте
intervalсекунд между запросами. На слишком частые запросы приходит ответslow_down. - Останавливайтесь, когда просят.
access_deniedозначает, что человек отказался;expired_token— что прошло десять минут. Запросите новый код. - Показывайте и адрес. Не все могут отсканировать QR-код: покажите
verification_uriи код, разбитый на группы, например6L95-PBQQ.
На странице /device Lobby показывает человеку, какое приложение запрашивает доступ и к чему. Lobby советует продолжать, только если человек сам начал вход и на его устройстве показан тот же код.
Привязка токенов к устройству (DPoP)
Токен, скопированный с устройства, по-прежнему остается токеном. С DPoP (RFC 9449) устройство хранит закрытый ключ и с каждым запросом отправляет новое подписанное доказательство. Токен, привязанный к этому ключу, без него бесполезен.
- Запрашивайте привязанные токены: отправляйте заголовок
DPoPс запросами токенов, и Usher привяжет выданное к вашему ключу (token_typeбудетDPoP). - Требуйте их: включите Требовать DPoP при создании приложения. Тогда Usher не выдаст ему ни одного токена без доказательства.
- Используйте их с
Authorization: DPoP <token>и доказательством для этого запроса. - Библиотеки: большинство библиотек OAuth с поддержкой DPoP делают все это за вас (например, параметр
DPoPвopenid-client).