В этом документе объясняется, как реализовать авторизацию OAuth 2.0 для доступа к API данных YouTube через приложения, работающие на таких устройствах, как телевизоры, игровые консоли и принтеры. В частности, этот процесс предназначен для устройств, которые либо не имеют доступа к браузеру, либо имеют ограниченные возможности ввода.
OAuth 2.0 позволяет пользователям делиться определёнными данными с приложением, сохраняя при этом свои имена пользователей, пароли и другую информацию в тайне. Например, телевизионное приложение может использовать OAuth 2.0 для получения разрешения на выбор файла, хранящегося на Google Диске.
Поскольку приложения, использующие этот поток, распределены по отдельным устройствам, предполагается, что они не могут хранить секреты. Они могут обращаться к API Google, пока пользователь находится в приложении или когда приложение работает в фоновом режиме.
Альтернативы
Если вы пишете приложение для такой платформы, как Android, iOS, macOS, Linux или Windows (включая универсальную платформу Windows), которая имеет доступ к браузеру и полноценные возможности ввода, используйте протокол OAuth 2.0 для мобильных и настольных приложений . (Вам следует использовать этот протокол, даже если ваше приложение представляет собой инструмент командной строки без графического интерфейса.)
Если вы хотите разрешить пользователям входить в систему только с помощью их учетных записей Google и использовать токен JWT ID для получения базовой информации о профиле пользователя, см . раздел Вход в систему на телевизорах и устройствах с ограниченными возможностями ввода .
Предпосылки
Включите API для вашего проекта
Любое приложение, которое вызывает API Google, должно включить эти API в API Console.
Чтобы включить API для вашего проекта:
- Open the API Library в Google API Console.
- If prompted, select a project, or create a new one.
- Найдите и включите API данных YouTube на странице «Библиотека». Найдите другие API, которые будет использовать ваше приложение, и включите их.
Создать учетные данные авторизации
Любое приложение, использующее OAuth 2.0 для доступа к API Google, должно иметь учётные данные авторизации, которые идентифицируют приложение на сервере OAuth 2.0 Google. Ниже описано, как создать учётные данные для вашего проекта. Затем ваши приложения смогут использовать эти учётные данные для доступа к API, которые вы включили для этого проекта.
- Go to the Credentials page.
- Нажмите «Создать клиента» .
- Выберите тип приложения «Телевизоры и устройства с ограниченным вводом» .
- Назовите своего клиента OAuth 2.0 и нажмите «Создать» .
Определить области доступа
Области действия позволяют вашему приложению запрашивать доступ только к тем ресурсам, которые ему необходимы, а также позволяют пользователям контролировать объём предоставляемого им доступа. Таким образом, между количеством запрашиваемых областей действия и вероятностью получения согласия пользователя может существовать обратная зависимость.
Прежде чем приступить к внедрению авторизации OAuth 2.0, мы рекомендуем вам определить области, на доступ к которым вашему приложению потребуется разрешение.
API данных YouTube v3 использует следующие области действия:
Объем | Описание |
---|---|
https://www. googleapis. com/ auth/ youtube | Управляйте своим аккаунтом YouTube |
https://www. googleapis. com/ auth/ youtube. channel-memberships. creator | Посмотрите список текущих активных участников канала, их текущий уровень и дату, когда они стали участниками. |
https://www. googleapis. com/ auth/ youtube. force-ssl | Просмотр, редактирование и окончательное удаление ваших видео, оценок, комментариев и субтитров на YouTube. |
https://www. googleapis. com/ auth/ youtube. readonly | Просмотр вашего аккаунта YouTube |
https://www. googleapis. com/ auth/ youtube. upload | Управляйте своими видео на YouTube |
https://www. googleapis. com/ auth/ youtubepartner | Просмотр и управление вашими активами и связанным с ними контентом на YouTube |
https://www. googleapis. com/ auth/ youtubepartner-channel-audit | Просмотр конфиденциальной информации вашего канала YouTube, актуальной во время процесса аудита с партнером YouTube |
См. список разрешенных областей для установленных приложений или устройств.
Получение токенов доступа OAuth 2.0
Несмотря на то, что ваше приложение работает на устройстве с ограниченными возможностями ввода, для завершения процесса авторизации пользователям необходим отдельный доступ к устройству с более широкими возможностями ввода. Процесс включает следующие этапы:
- Ваше приложение отправляет запрос на сервер авторизации Google, который определяет области, к которым ваше приложение будет запрашивать разрешение на доступ.
- Сервер отвечает несколькими фрагментами информации, используемыми на последующих этапах, такими как код устройства и код пользователя.
- Вы отображаете информацию, которую пользователь может ввести на отдельном устройстве для авторизации вашего приложения.
- Ваше приложение начинает опрашивать сервер авторизации Google, чтобы определить, авторизовал ли пользователь ваше приложение.
- Пользователь переключается на устройство с расширенными возможностями ввода, запускает веб-браузер, переходит по URL-адресу, отображенному на шаге 3, и вводит код, который также отображается на шаге 3. Затем пользователь может предоставить (или запретить) доступ к вашему приложению.
- Следующий ответ на ваш опросный запрос содержит токены, необходимые вашему приложению для авторизации запросов от имени пользователя. (Если пользователь отказал в доступе к вашему приложению, ответ не содержит токенов.)
Изображение ниже иллюстрирует этот процесс:
В следующих разделах эти шаги подробно описаны. Учитывая разнообразие возможностей и сред выполнения устройств, в примерах, представленных в этом документе, используется утилита командной строки curl
. Эти примеры легко переносить на различные языки программирования и среды выполнения.
Шаг 1: Запросите коды устройства и пользователя
На этом этапе ваше устройство отправляет HTTP-запрос POST на сервер авторизации Google по адресу https://oauth2.googleapis.com/device/code
, который идентифицирует ваше приложение, а также области доступа, к которым оно хочет получить доступ от имени пользователя. Этот URL-адрес следует получить из документа Discovery , используя значение метаданных device_authorization_endpoint
. Включите следующие параметры HTTP-запроса:
Параметры | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
client_id | Необходимый Идентификатор клиента для вашего приложения. Вы можете найти это значение в . | ||||||||||||||||
scope | Необходимый Список областей действия, разделенных пробелами, которые определяют ресурсы, к которым ваше приложение может получить доступ от имени пользователя. Эти значения используются в окне согласия, которое Google отображает пользователю. См. список разрешенных областей действия для установленных приложений или устройств. Области действия позволяют вашему приложению запрашивать доступ только к тем ресурсам, которые ему необходимы, а также позволяют пользователям контролировать объём предоставляемого им доступа. Таким образом, существует обратная зависимость между количеством запрашиваемых областей действия и вероятностью получения согласия пользователя. API данных YouTube v3 использует следующие области действия:
Документ «Области действия API OAuth 2.0» содержит полный список областей действия, которые можно использовать для доступа к API Google. |
Примеры
В следующем фрагменте показан пример запроса:
POST /device/code HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded client_id=client_id&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.force-ssl
В этом примере показана команда curl
для отправки того же запроса:
curl -d "client_id=client_id&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.force-ssl" \ https://oauth2.googleapis.com/device/code
Шаг 2: Обработка ответа сервера авторизации
Сервер авторизации вернет один из следующих ответов:
Успешный ответ
Если запрос действителен, вашим ответом будет JSON-объект, содержащий следующие свойства:
Характеристики | |
---|---|
device_code | Уникальное значение, которое Google присваивает для идентификации устройства, на котором запущено приложение, запрашивающее авторизацию. Пользователь будет авторизовать это устройство с другого устройства с более широкими возможностями ввода. Например, пользователь может использовать ноутбук или мобильный телефон для авторизации приложения, работающего на телевизоре. В этом случае device_code идентифицирует телевизор.Этот код позволяет устройству, на котором запущено приложение, безопасно определять, предоставил ли пользователь доступ или запретил его. |
expires_in | Время (в секундах), в течение которого коды device_code и user_code остаются действительными. Если за это время пользователь не завершит процесс авторизации, а ваше устройство не выполнит опрос для получения информации о решении пользователя, вам может потребоваться перезапустить этот процесс с шага 1. |
interval | Интервал времени (в секундах), в течение которого устройство должно ждать между запросами на опрос. Например, если значение равно 5 , устройство будет отправлять запрос на сервер авторизации Google каждые пять секунд. Подробнее см. в шаге 3 . |
user_code | Значение с учётом регистра, которое определяет для Google области действия, к которым приложение запрашивает доступ. Ваш пользовательский интерфейс предложит пользователю ввести это значение на отдельном устройстве с расширенными возможностями ввода. Затем Google использует это значение для отображения правильного набора областей действия при запросе доступа к вашему приложению. |
verification_url | URL-адрес, по которому пользователь должен перейти на отдельном устройстве, чтобы ввести user_code и предоставить или запретить доступ к вашему приложению. Это значение также будет отображаться в вашем пользовательском интерфейсе. |
В следующем фрагменте показан пример ответа:
{ "device_code": "4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8", "user_code": "GQVQ-JKEC", "verification_url": "https://www.google.com/device", "expires_in": 1800, "interval": 5 }
Ответ о превышении квоты
Если количество запросов на код устройства превысило квоту, связанную с вашим идентификатором клиента, вы получите ответ 403, содержащий следующую ошибку:
{ "error_code": "rate_limit_exceeded" }
В этом случае используйте стратегию отсрочки, чтобы уменьшить частоту запросов.
Шаг 3: Отобразите код пользователя
Отобразите пользователю значения verification_url
и user_code
, полученные на шаге 2. Оба значения могут содержать любой печатный символ из набора символов US-ASCII. Отображаемый пользователю контент должен предлагать ему перейти по адресу verification_url
на отдельном устройстве и ввести user_code
.
Разрабатывайте свой пользовательский интерфейс (UI), учитывая следующие правила:
-
user_code
-
user_code
должен отображаться в поле, поддерживающем 15 символов размера «W». Другими словами, если кодWWWWWWWWWWWWWWW
отображается корректно, ваш пользовательский интерфейс корректен, и мы рекомендуем использовать это строковое значение при тестировании отображения кодаuser_code
в вашем пользовательском интерфейсе. -
user_code
чувствителен к регистру и не должен изменяться каким-либо образом, например, путем изменения регистра или вставки других символов форматирования.
-
-
verification_url
- Пространство, в котором отображается
verification_url
должно быть достаточно широким для размещения строки URL длиной 40 символов. - Не изменяйте параметр
verification_url
каким-либо образом, за исключением случаев, когда требуется удалить схему для отображения. Если вы планируете удалить схему (например,https://
) из URL для отображения, убедитесь, что ваше приложение поддерживает оба варианта:http
иhttps
.
- Пространство, в котором отображается
Шаг 4: Опрос сервера авторизации Google
Поскольку пользователь будет использовать отдельное устройство для перехода по адресу verification_url
и предоставления (или запрета) доступа, запрашивающее устройство не получает автоматического уведомления о том, что пользователь отвечает на запрос доступа. Поэтому запрашивающему устройству необходимо опрашивать сервер авторизации Google, чтобы определить, ответил ли пользователь на запрос.
Запрашивающее устройство должно продолжать отправлять запросы на опрос до тех пор, пока не получит ответ, указывающий на то, что пользователь ответил на запрос доступа, или пока не истечёт срок действия device_code
и user_code
полученных на шаге 2. interval
, возвращаемый на шаге 2, определяет время ожидания (в секундах) между запросами.
URL-адрес опрашиваемой конечной точки: https://oauth2.googleapis.com/token
. Запрос на опрос содержит следующие параметры:
Параметры | |
---|---|
client_id | Идентификатор клиента для вашего приложения. Вы можете найти это значение в . |
client_secret | Секретный ключ клиента для указанного client_id . Это значение можно найти в . |
device_code | Код device_code , возвращаемый сервером авторизации на шаге 2 . |
grant_type | Установите это значение на urn:ietf:params:oauth:grant-type:device_code . |
Примеры
В следующем фрагменте показан пример запроса:
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded client_id=client_id& client_secret=client_secret& device_code=device_code& grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Adevice_code
В этом примере показана команда curl
для отправки того же запроса:
curl -d "client_id=client_id&client_secret=client_secret& \ device_code=device_code& \ grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Adevice_code" \ -H "Content-Type: application/x-www-form-urlencoded" \ https://oauth2.googleapis.com/token
Шаг 5: Пользователь отвечает на запрос доступа
На следующем изображении показана страница, похожая на ту, которую видят пользователи, переходящие по адресу verification_url
, который вы отобразили на шаге 3 :
После ввода user_code
и входа в Google, если он еще не вошел в систему, пользователь увидит экран согласия, подобный показанному ниже:
Шаг 6: Обработка ответов на запросы опросов
Сервер авторизации Google отвечает на каждый запрос опроса одним из следующих ответов:
Доступ предоставлен
Если пользователь предоставил доступ к устройству (нажав Allow
на экране согласия), ответ содержит токен доступа и токен обновления. Токены позволяют вашему устройству получать доступ к API Google от имени пользователя. (Свойство scope
в ответе определяет, к каким API устройство может получить доступ.)
В этом случае ответ API содержит следующие поля:
Поля | |
---|---|
access_token | Токен, который ваше приложение отправляет для авторизации запроса API Google. |
expires_in | Оставшееся время жизни токена доступа в секундах. |
refresh_token | Токен, который можно использовать для получения нового токена доступа. Токены обновления действительны до тех пор, пока пользователь не отзовёт доступ или пока не истечёт срок действия токена обновления. Обратите внимание, что токены обновления всегда возвращаются для устройств. |
refresh_token_expires_in | Оставшееся время жизни токена обновления в секундах. Это значение устанавливается только в том случае, если пользователь предоставляет доступ с ограничением по времени . |
scope | Области доступа, предоставляемые access_token , выраженные в виде списка строк, разделенных пробелами и чувствительных к регистру. |
token_type | Тип возвращаемого токена. В настоящее время значение этого поля всегда равно Bearer . |
В следующем фрагменте показан пример ответа:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "scope": "openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email", "token_type": "Bearer", "refresh_token": "1/xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" }
Токены доступа имеют ограниченный срок действия. Если вашему приложению требуется доступ к API в течение длительного периода времени, оно может использовать токен обновления для получения нового токена доступа. Если вашему приложению необходим такой тип доступа, оно должно сохранить токен обновления для последующего использования.
Доступ запрещен
Если пользователь отказывается предоставить доступ к устройству, сервер возвращает HTTP-код статуса 403
( Forbidden
). В ответе содержится следующая ошибка:
{ "error": "access_denied", "error_description": "Forbidden" }
Ожидается авторизация
Если пользователь ещё не завершил процесс авторизации, сервер возвращает код статуса HTTP-ответа 428
( Precondition Required
). Ответ содержит следующую ошибку:
{ "error": "authorization_pending", "error_description": "Precondition Required" }
Слишком частые опросы
Если устройство отправляет запросы слишком часто, сервер возвращает код статуса HTTP-ответа 403
( Forbidden
). Ответ содержит следующую ошибку:
{ "error": "slow_down", "error_description": "Forbidden" }
Другие ошибки
Сервер авторизации также возвращает ошибки, если в запросе на опрос отсутствуют какие-либо обязательные параметры или задано неверное значение параметра. Такие запросы обычно имеют код статуса HTTP-ответа 400
( Bad Request
) или 401
( Unauthorized
). К таким ошибкам относятся:
Ошибка | Код статуса HTTP | Описание |
---|---|---|
admin_policy_enforced | 400 | Учётная запись Google не может авторизовать одну или несколько запрошенных областей действия из-за политик администратора Google Workspace. Подробнее о том, как администратор может ограничить доступ к областям действия до тех пор, пока доступ не будет явно предоставлен вашему идентификатору клиента OAuth, см. в справочной статье Google Workspace Admin Управление доступом сторонних и внутренних приложений к данным Google Workspace . |
invalid_client | 401 | Клиент OAuth не найден. Например, эта ошибка возникает, если значение параметра Неверный тип клиента OAuth. Убедитесь, что для идентификатора клиента выбран тип приложения « Телевизоры и устройства с ограниченным доступом» . |
invalid_grant | 400 | Значение параметра code недействительно, уже было заявлено или не может быть проанализировано. |
unsupported_grant_type | 400 | Недопустимое значение параметра grant_type . |
org_internal | 403 | Идентификатор клиента OAuth в запросе является частью проекта, ограничивающего доступ к аккаунтам Google в конкретной организации Google Cloud . Подтвердите конфигурацию типа пользователя для вашего приложения OAuth. |
Вызов API Google
После того, как ваше приложение получит токен доступа, вы сможете использовать его для вызовов API Google от имени определённой учётной записи пользователя, если API предоставило необходимые ему права доступа. Для этого включите токен доступа в запрос к API, указав либо параметр запроса access_token
, либо значение Bearer
HTTP-заголовка Authorization
. По возможности предпочтительнее использовать HTTP-заголовок, поскольку строки запросов, как правило, отображаются в журналах сервера. В большинстве случаев для настройки вызовов API Google (например, при вызове API YouTube Live Streaming ) можно использовать клиентскую библиотеку.
Обратите внимание, что API YouTube Live Streaming не поддерживает поток учётной записи сервиса. Поскольку связать учётную запись сервиса с учётной записью YouTube невозможно, попытки авторизовать запросы с помощью этого потока приведут к ошибке NoLinkedYouTubeAccount
.
Вы можете опробовать все API Google и просмотреть области их действия на площадке OAuth 2.0 .
Примеры HTTP GET
Вызов конечной точки liveBroadcasts.list
(API прямой трансляции YouTube) с использованием HTTP-заголовка Authorization: Bearer
может выглядеть следующим образом. Обратите внимание, что вам необходимо указать собственный токен доступа:
GET /youtube/v3/liveBroadcasts?part=id%2Csnippet&mine=true HTTP/1.1 Host: www.googleapis.com Authorization: Bearer access_token
Вот вызов того же API для аутентифицированного пользователя с использованием параметра строки запроса access_token
:
GET https://www.googleapis.com/youtube/v3/liveBroadcasts?access_token=access_token&part=id%2Csnippet&mine=true
примеры curl
Вы можете протестировать эти команды с помощью приложения командной строки curl
. Вот пример, использующий HTTP-заголовок (рекомендуется):
curl -H "Authorization: Bearer access_token" https://www.googleapis.com/youtube/v3/liveBroadcasts?part=id%2Csnippet&mine=true
Или, в качестве альтернативы, параметр строки запроса:
curl https://www.googleapis.com/youtube/v3/liveBroadcasts?access_token=access_token&part=id%2Csnippet&mine=true
Обновление токена доступа
Токены доступа периодически истекают и становятся недействительными для соответствующего запроса API. Вы можете обновить токен доступа, не запрашивая разрешения у пользователя (даже если пользователь отсутствует), если вы запросили автономный доступ к областям, связанным с токеном.
Чтобы обновить токен доступа, ваше приложение отправляет HTTPS-запрос POST
на сервер авторизации Google ( https://oauth2.googleapis.com/token
), включающий следующие параметры:
Поля | |
---|---|
client_id | Идентификатор клиента, полученный из API Console. |
client_secret | Секрет клиента, полученный от API Console. |
grant_type | Как определено в спецификации OAuth 2.0 , значение этого поля должно быть установлено на refresh_token . |
refresh_token | Токен обновления, возвращенный в результате обмена кодами авторизации. |
В следующем фрагменте показан пример запроса:
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded client_id=your_client_id& client_secret=your_client_secret& refresh_token=refresh_token& grant_type=refresh_token
Пока пользователь не отозвал предоставленный приложению доступ, сервер токенов возвращает JSON-объект, содержащий новый токен доступа. Пример ответа представлен в следующем фрагменте:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "scope": "https://www.googleapis.com/auth/drive.metadata.readonly https://www.googleapis.com/auth/calendar.readonly", "token_type": "Bearer" }
Обратите внимание, что существуют ограничения на количество выдаваемых токенов обновления: один на комбинацию клиент/пользователь и ещё один на пользователя для всех клиентов. Рекомендуется сохранять токены обновления в долгосрочном хранилище и использовать их до тех пор, пока они остаются действительными. Если ваше приложение запрашивает слишком много токенов обновления, оно может столкнуться с этими ограничениями, и в этом случае старые токены обновления перестанут работать.
Отзыв токена
В некоторых случаях пользователь может захотеть отозвать доступ, предоставленный приложению. Это можно сделать в настройках учётной записи . Дополнительную информацию см. в разделе «Удаление доступа к сайту или приложению» документа поддержки «Сторонние сайты и приложения, имеющие доступ к вашей учётной записи» .
Приложение также может программно отозвать предоставленный ему доступ. Программный отзыв важен в случаях, когда пользователь отменяет подписку, удаляет приложение или когда ресурсы API, необходимые приложению, существенно изменились. Другими словами, часть процесса удаления может включать запрос к API, чтобы гарантировать удаление ранее предоставленных приложению разрешений.
Чтобы программно отозвать токен, ваше приложение отправляет запрос на https://oauth2.googleapis.com/revoke
и включает токен в качестве параметра:
curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \ https://oauth2.googleapis.com/revoke?token={token}
Токен может быть токеном доступа или токеном обновления. Если токен является токеном доступа и у него есть соответствующий токен обновления, токен обновления также будет отозван.
Если отзыв успешно обработан, то код статуса HTTP ответа — 200
В случае возникновения ошибок возвращается код статуса HTTP 400
вместе с кодом ошибки.
Разрешенные области действия
Поток OAuth 2.0 для устройств поддерживается только для следующих областей:
OpenID Connect , вход через Google
-
email
-
openid
-
profile
API Диска
-
https://www.googleapis.com/auth/drive.appdata
-
https://www.googleapis.com/auth/drive.file
API YouTube
-
https://www.googleapis.com/auth/youtube
-
https://www.googleapis.com/auth/youtube.readonly
Доступ по времени
Доступ с ограничением по времени позволяет пользователю предоставить вашему приложению доступ к своим данным на ограниченный период времени для выполнения действия. Доступ с ограничением по времени доступен в некоторых продуктах Google в процессе получения согласия, предоставляя пользователям возможность предоставить доступ на ограниченный период времени. Примером может служить API переносимости данных , который позволяет выполнить однократную передачу данных.
Когда пользователь предоставляет вашему приложению доступ с ограничением по времени, токен обновления истекает по истечении указанного срока. Обратите внимание, что при определённых обстоятельствах токены обновления могут быть аннулированы раньше; подробности см. в этих случаях . Поле refresh_token_expires_in
возвращаемое в ответе на обмен кодами авторизации, представляет собой время, оставшееся до истечения срока действия токена обновления в таких случаях.
Реализация защиты между аккаунтами
Дополнительным шагом для защиты аккаунтов пользователей является реализация Cross-Account Protection с помощью сервиса Cross-Account Protection от Google. Этот сервис позволяет подписаться на уведомления о событиях безопасности, которые предоставляют вашему приложению информацию о важных изменениях в аккаунте пользователя. Затем вы можете использовать эту информацию для принятия мер в зависимости от того, как вы решите реагировать на события.
Вот некоторые примеры типов событий, отправляемых в ваше приложение службой Cross-Account Protection от Google:
-
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked
-
https://schemas.openid.net/secevent/oauth/event-type/token-revoked
-
https://schemas.openid.net/secevent/risc/event-type/account-disabled
Дополнительную информацию о реализации защиты перекрестных учетных записей и полный список доступных событий см. на странице Защита учетных записей пользователей с помощью защиты перекрестных учетных записей.