Вы можете разрешить пользователям входить в ваше приложение со своими учетными записями 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=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"];
Дополнительная информация
- Чтобы пользователи оставались в системе после окончания срока действия токена идентификатора, см. раздел Обновление токена доступа .
- Если вам необходимо пройти аутентификацию на внутреннем сервере, см. раздел Аутентификация на внутреннем сервере для получения информации о том, как сделать это безопасно.