Вход в систему на телевизорах и устройствах ввода с ограниченным доступом

Вы можете разрешить пользователям входить в ваше приложение с помощью своих учетных записей Google на устройствах с ограниченными возможностями ввода, например телевизорах, подключенных к Интернету.

Приложение отображает пользователю короткий код и URL-адрес для входа. Затем пользователь открывает URL-адрес для входа в веб-браузере, вводит код и предоставляет приложению разрешение на доступ к данным для входа пользователя. Наконец, приложение получает подтверждение, и пользователь входит в систему.

Чтобы использовать этот процесс входа, приложение должно работать на устройстве, которое соответствует следующим критериям:

  • Устройство должно быть способно отображать 40-значный URL-адрес и 15-значный код пользователя, а также инструкции для пользователя.
  • Устройство должно быть подключено к Интернету.

Получите идентификатор клиента и секрет клиента

Вашему приложению необходим идентификатор клиента OAuth 2.0 и секрет клиента, чтобы отправлять запросы к конечным точкам входа в Google.

Чтобы узнать идентификатор и секрет клиента вашего проекта, выполните следующие действия:

  1. Выберите существующие учетные данные OAuth 2.0 или откройте страницу «Учетные данные» .
  2. Если вы еще этого не сделали, создайте учетные данные OAuth 2.0 для своего проекта, щелкнув Создать учетные данные > Идентификатор клиента OAuth и предоставив информацию, необходимую для создания учетных данных.
  3. Найдите идентификатор клиента в разделе «Идентификаторы клиентов OAuth 2.0» . Для получения подробной информации щелкните идентификатор клиента.

Если вы создаете новый идентификатор клиента, выберите тип приложения «Телевизоры и устройства ограниченного ввода» .

Получите код пользователя и URL-адрес подтверждения.

Как только пользователь запрашивает вход с использованием учетной записи Google, вы получаете код пользователя и URL-адрес подтверждения, отправляя запрос HTTP POST на конечную точку устройства OAuth 2.0, https://oauth2.googleapis.com/device/code . Включите в запрос свой идентификатор клиента и список областей, которые вам нужны. Если вы хотите входить в систему только с помощью их учетных записей Google, запрашивайте только области profile и email ; или, если вы хотите запросить разрешение на вызов поддерживаемого API от имени пользователей, запросите необходимые области в дополнение к областям profile и email .

Ниже приведен пример запроса кода пользователя:

POST /device/code HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

client_id=YOUR_GOOGLE_CLIENT_ID&scope=email%20profile

Используя curl :

curl -d "client_id=YOUR_GOOGLE_CLIENT_ID&scope=email profile" https://oauth2.googleapis.com/device/code

Ответ возвращается в виде объекта JSON:

 {
  "device_code" : "4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8",
  "user_code" : "GQVQ-JKEC",
  "verification_url" : "https://www.google.com/device",
  "expires_in" : 1800,
  "interval" : 5
}

Ваше приложение отображает значения user_code и verification_url пользователю и в то же время опрашивает конечную точку входа с указанным interval до тех пор, пока пользователь не войдет в систему или не пройдет время, указанное в expires_in .

Отображение кода пользователя и URL-адреса подтверждения

После того как вы получите код пользователя и URL-адрес подтверждения от конечной точки устройства, отобразите их и попросите пользователя открыть URL-адрес и ввести код пользователя.

verification_url и user_code могут быть изменены. Спроектируйте свой пользовательский интерфейс таким образом, чтобы он мог справиться со следующими ограничениями:

  • user_code должен отображаться в поле, достаточно широком, чтобы вместить символы размером 15 W .
  • verification_url должен отображаться в поле, достаточно широком для обработки строки URL-адреса длиной 40 символов.

Обе строки могут содержать любые печатаемые символы из набора символов US-ASCII.

При отображении строки user_code не изменяйте ее каким-либо образом (например, меняя регистр или вставляя другие символы форматирования), поскольку ваше приложение может сломаться, если формат кода изменится в будущем.

Вы можете изменить verification_url , удалив схему из URL-адреса для целей отображения, если захотите. Если вы это сделаете, убедитесь, что ваше приложение может обрабатывать варианты «http» и «https». Не изменяйте иначе verification_url .

Когда пользователь переходит по URL-адресу подтверждения, он видит страницу, похожую на следующую:

Подключите устройство, введя код

После того как пользователь вводит код пользователя, на сайте входа в Google отображается экран согласия, подобный следующему:

Пример экрана согласия для клиента устройства

Если пользователь нажимает Разрешить , ваше приложение может получить токен идентификатора для идентификации пользователя, токен доступа для вызова API Google и токен обновления для получения новых токенов.

Получите идентификационный токен и обновите токен

После того как ваше приложение отобразит код пользователя и URL-адрес подтверждения, начните опрашивать конечную точку токена ( https://oauth2.googleapis.com/token ) с кодом устройства, полученным от конечной точки устройства. Опрашивайте конечную точку токена с интервалом в секундах, заданным значением interval .

Ниже приведен пример запроса:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

client_id=YOUR_GOOGLE_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&code=DEVICE_CODE&grant_type=http://oauth.net/grant_type/device/1.0

Используя curl :

curl -d "client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&code=YOUR_DEVICE_CODE&grant_type=http://oauth.net/grant_type/device/1.0" https://oauth2.googleapis.com/token

Если пользователь еще не одобрил запрос, ответ будет следующим:

{
  "error" : "authorization_pending"
}

Ваше приложение должно повторять эти запросы со скоростью, не превышающей значение interval . Если ваше приложение проводит опрос слишком быстро, ответ будет следующим:

{
  "error" : "slow_down"
}

Как только пользователь войдет в систему и предоставит вашему приложению доступ к запрошенным вами областям, ответ на следующий запрос вашего приложения будет включать в себя токен идентификатора, токен доступа и токен обновления:

{
  "access_token": "ya29.AHES6ZSuY8f6WFLswSv0HZLP2J4cCvFSj-8GiZM0Pr6cgXU",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "1/551G1yXUqgkDGnkfFk6ZbjMMMDIMxo3JFc8lY8CAR-Q",
  "id_token": "eyJhbGciOiJSUzI..."
}

После получения этого ответа ваше приложение может декодировать токен идентификатора, чтобы получить базовую информацию о профиле вошедшего в систему пользователя, или отправить токен идентификатора на внутренний сервер вашего приложения для безопасной аутентификации на сервере. Кроме того, ваше приложение может использовать токен доступа для вызова API Google , авторизованных пользователем.

Токены идентификатора и доступа имеют ограниченный срок действия. Чтобы пользователь оставался в системе после окончания срока действия токенов, сохраните токен обновления и используйте его для запроса новых токенов .

Получить информацию о профиле пользователя из токена идентификатора

Вы можете получить информацию о профиле вошедшего в систему пользователя, декодировав токен идентификатора с помощью любой библиотеки JWT-декодирования . Например, используя библиотеку JavaScript Auth0 jwt-decode :

var user_profile = jwt_decode(<var>id_token</var>);

// The "sub" field is available on all ID tokens. This value is unique for each
// Google account and can be used to identify the user. (But do not send this
// value to your server; instead, send the whole ID token so its authenticity
// can be verified.)
var user_id = user_profile["sub"];

// These values are available when you request the "profile" and "email" scopes.
var user_email = user_profile["email"];
var email_verified = user_profile["email_verified"];
var user_name = user_profile["name"];
var user_photo_url = user_profile["picture"];
var user_given_name = user_profile["given_name"];
var user_family_name = user_profile["family_name"];
var user_locale = user_profile["locale"];

Дополнительная информация