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

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

Вы можете разрешить пользователям входить в ваше приложение со своими учетными записями 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=CLIENT_ID&scope=email%20profile

Использование curl :

curl -d "client_id=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-адрес и ввести код пользователя.

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

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

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

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

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

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

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

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

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

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

Получите токен ID и обновите токен

После того как ваше приложение отобразит код пользователя и 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=CLIENT_ID&client_secret=CLIENT_SECRET&code=DEVICE_CODE&grant_type=http://oauth.net/grant_type/device/1.0

Использование curl :

curl -d "client_id=CLIENT_ID&client_secret=CLIENT_SECRET&code=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 , авторизованных пользователем.

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

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

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

var user_profile = jwt_decode(id_token);

// 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"];

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