Вы можете разрешить пользователям входить в ваше приложение с помощью своих учетных записей Google на устройствах с ограниченными возможностями ввода, например телевизорах, подключенных к Интернету.
Приложение отображает пользователю короткий код и URL-адрес для входа. Затем пользователь открывает URL-адрес для входа в веб-браузере, вводит код и предоставляет приложению разрешение на доступ к данным для входа пользователя. Наконец, приложение получает подтверждение, и пользователь входит в систему.
Чтобы использовать этот процесс входа, приложение должно работать на устройстве, которое соответствует следующим критериям:
- Устройство должно быть способно отображать 40-значный URL-адрес и 15-значный код пользователя, а также инструкции для пользователя.
- Устройство должно быть подключено к Интернету.
Получите идентификатор клиента и секрет клиента
Вашему приложению необходим идентификатор клиента OAuth 2.0 и секрет клиента, чтобы отправлять запросы к конечным точкам входа в Google.
Чтобы узнать идентификатор и секрет клиента вашего проекта, выполните следующие действия:
- Выберите существующие учетные данные OAuth 2.0 или откройте страницу «Учетные данные» .
- Если вы еще этого не сделали, создайте учетные данные OAuth 2.0 для своего проекта, щелкнув Создать учетные данные > Идентификатор клиента OAuth и предоставив информацию, необходимую для создания учетных данных.
- Найдите идентификатор клиента в разделе «Идентификаторы клиентов 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
должен отображаться в поле, достаточно широком, чтобы вместить символы размером 15W
. -
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"];
Дополнительная информация
- Чтобы пользователи оставались в системе после окончания срока действия токена идентификатора, см. раздел Обновление токена доступа .
- Если вам необходимо пройти аутентификацию на внутреннем сервере, см. раздел Аутентификация на внутреннем сервере для получения информации о том, как сделать это безопасно.