OAuth for Browserless and Input Constrained Devices
OAuth 2.0 “Device Flow” расширение позволяет использовать OAuth на девайсах, которые имеют выход в интернет, но не могут открыть браузер (например, расширения для TV).
Обычно, девайс говорит пользователю открыть какую-то ссылку на стороннем девайсе (например, на телефоне через чтение QR-кода) и получает access-токен таким образом.
Authorization Request
Девайс делает запрос к серверу авторизации для получения device code параметра:
POST /token HTTP/1.1
Host: authorization-server.com
Content-type: application/x-www-form-urlencoded
client_id=a17c21ed
Некоторые сервера авторизации позволяют добавлять параметр scope
, который будет показан пользователю.
Сервер возвращает сссылку, куда перенаправить пользователя и user_code
для него.
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"device_code": "NGU5OWFiNjQ5YmQwNGY3YTdmZTEyNzQ3YzQ1YSA",
"user_code": "BDWP-HQPK",
"verification_uri": "https://authorization-server.com/device",
"interval": 5,
"expires_in": 1800
}
Token Request
Пока пользователь не подтвердит доступ, девайс будет стучать на сервер авторизации со своим device_code
с заданным сервером interval
, пока сервер не вернет статус, отличный от error = authorization_pending
.
Пример запроса:
POST /token HTTP/1.1
Host: authorization-server.com
Content-type: application/x-www-form-urlencoded
grant_type=urn:ietf:params:oauth:grant-type:device_code&
client_id=a17c21ed&
device_code=NGU5OWFiNjQ5YmQwNGY3YTdmZTEyNzQ3YzQ1YSA
Если пользователь откажет в доступе, сервер вернет error = access_denied
. Если токен истек — получим error = expired_token
.
Если все ОК:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"access_token": "AYjcyMzY3ZDhiNmJkNTY",
"refresh_token": "RjY2NjM5NzA2OWJjuE7c",
"token_type": "bearer",
"expires": 3600
}
Security
user_code
должен быть не подвержен бруту, для запроса подтверждения доступа со стороны пользователя должен быть установлен rate limit.
Last updated
Was this helpful?