В этом документе объясняется, как приложения, установленные на таких устройствах, как телефоны, планшеты и компьютеры, используют конечные точки Google OAuth 2.0 для авторизации доступа к API Google.
OAuth 2.0 позволяет пользователям обмениваться определенными данными с приложением, сохраняя при этом свои имена пользователей, пароли и другую информацию конфиденциальной. Например, приложение может использовать OAuth 2.0 для получения от пользователей разрешения на хранение файлов на их Google Дисках.
Установленные приложения распространяются на отдельные устройства, и предполагается, что эти приложения не могут хранить секреты. Они могут получить доступ к API Google, пока пользователь присутствует в приложении или когда приложение работает в фоновом режиме.
Этот поток авторизации аналогичен тому, который используется для приложений веб-сервера . Основное отличие состоит в том, что установленные приложения должны открыть системный браузер и предоставить локальный URI перенаправления для обработки ответов от сервера авторизации Google.
Альтернативы
Для мобильных приложений вы можете предпочесть использовать вход в Google для Android или iOS . Клиентские библиотеки входа в Google обрабатывают аутентификацию и авторизацию пользователей, и их может быть проще реализовать, чем описанный здесь протокол более низкого уровня.
Для приложений, работающих на устройствах, которые не поддерживают системный браузер или имеют ограниченные возможности ввода, таких как телевизоры, игровые консоли, камеры или принтеры, см. OAuth 2.0 для телевизоров и устройств или Вход на телевизорах и устройствах с ограниченным вводом .
Библиотеки и образцы
Мы рекомендуем следующие библиотеки и примеры, которые помогут вам реализовать поток OAuth 2.0, описанный в этом документе:
Предварительные условия
Включите 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 Library перечисляет все доступные API, сгруппированные по семействам продуктов и популярности. Если API, который вы хотите включить, не отображается в списке, воспользуйтесь поиском, чтобы найти его, или нажмите «Просмотреть все» в семействе продуктов, к которому он принадлежит.
- Выберите API, который вы хотите включить, затем нажмите кнопку «Включить» .
- If prompted, enable billing.
- If prompted, read and accept the API's Terms of Service.
Создать учетные данные для авторизации
Любое приложение, использующее OAuth 2.0 для доступа к API Google, должно иметь учетные данные авторизации, которые идентифицируют приложение на сервере Google OAuth 2.0. Следующие шаги объясняют, как создать учетные данные для вашего проекта. Затем ваши приложения смогут использовать учетные данные для доступа к API, которые вы включили для этого проекта.
- Go to the Credentials page.
- Нажмите Создать учетные данные > Идентификатор клиента OAuth .
- В следующих разделах описаны типы клиентов, которые поддерживает сервер авторизации Google. Выберите тип клиента, рекомендуемый для вашего приложения, назовите свой клиент OAuth и задайте соответствующие поля в форме.
Андроид
- Выберите тип приложения Android .
- Введите имя клиента OAuth. Это имя отображается в вашем проекте Credentials page для идентификации клиента.
- Введите имя пакета вашего приложения для Android. Это значение определяется в атрибуте
package
элемента<manifest>
в файле манифеста вашего приложения. - Введите отпечаток сертификата подписи SHA-1 для распространения приложения.
- Если ваше приложение использует подпись приложения Google Play , скопируйте отпечаток SHA-1 со страницы подписи приложения в Play Console.
- Если вы управляете собственным хранилищем ключей и ключами подписи, используйте утилиту keytool, входящую в состав Java, для печати информации о сертификате в удобочитаемом формате. Скопируйте значение
SHA1
в разделCertificate fingerprints
выходных данных keytool . Дополнительную информацию см. в разделе «Аутентификация вашего клиента» в документации Google API для Android.
- (Необязательно) Подтвердите право собственности на ваше приложение для Android.
- Нажмите Создать .
iOS
- Выберите тип приложения iOS .
- Введите имя клиента OAuth. Это имя отображается в вашем проекте Credentials page для идентификации клиента.
- Введите идентификатор пакета для вашего приложения. Идентификатор пакета — это значение ключа CFBundleIdentifier в файле ресурсов списка информационных свойств вашего приложения ( info.plist ). Значение чаще всего отображается на панели «Общие» или на панели «Подписание и возможности» редактора проекта Xcode. Идентификатор пакета также отображается в разделе «Общая информация» на странице «Информация о приложении» на сайте Apple App Store Connect .
Убедитесь, что вы используете правильный идентификатор пакета для своего приложения, поскольку вы не сможете изменить его, если используете функцию проверки приложений.
- (Необязательный)
Введите идентификатор вашего приложения в App Store, если приложение опубликовано в Apple App Store. Идентификатор магазина — это числовая строка, включенная в каждый URL-адрес Apple App Store.
- Откройте приложение Apple App Store на своем устройстве iOS или iPadOS.
- Найдите свое приложение.
- Нажмите кнопку «Поделиться» (квадрат и стрелка вверх).
- Выберите «Копировать ссылку» .
- Вставьте ссылку в текстовый редактор. Идентификатор App Store — это последняя часть URL-адреса.
Пример:
https://apps.apple.com/app/google/id 284815942
- (Необязательный)
Введите идентификатор своей команды. Дополнительную информацию см. в разделе «Найдите свой идентификатор команды» в документации по учетной записи разработчика Apple.
Примечание. Поле «Идентификатор команды» является обязательным, если вы включаете проверку приложений для своего клиента. - (Необязательный)
Включите проверку приложений для вашего приложения iOS. Когда вы включаете проверку приложений, служба Apple App Attest используется для проверки того, что запросы OAuth 2.0, исходящие от вашего клиента OAuth, являются подлинными и поступают из вашего приложения. Это помогает снизить риск подделки приложения. Узнайте больше о включении проверки приложений для вашего приложения iOS .
- Нажмите Создать .
UWP
- Выберите тип приложения универсальной платформы Windows .
- Введите имя клиента OAuth. Это имя отображается в вашем проекте Credentials page для идентификации клиента.
- Введите 12-значный идентификатор вашего приложения в Microsoft Store. Это значение можно найти в Центре партнеров Microsoft на странице удостоверения приложения в разделе «Управление приложениями».
- Нажмите Создать .
Для приложений UWP длина пользовательской схемы URI не может превышать 39 символов.
Определить области доступа
Области позволяют вашему приложению запрашивать доступ только к тем ресурсам, которые ему необходимы, а также позволяют пользователям контролировать объем доступа, который они предоставляют вашему приложению. Таким образом, может существовать обратная зависимость между количеством запрошенных областей и вероятностью получения согласия пользователя.
Прежде чем приступить к реализации авторизации OAuth 2.0, мы рекомендуем вам определить области, для доступа к которым вашему приложению потребуется разрешение.
Документ «Области API OAuth 2.0» содержит полный список областей, которые вы можете использовать для доступа к API Google.
Получение токенов доступа OAuth 2.0
Следующие шаги показывают, как ваше приложение взаимодействует с сервером OAuth 2.0 Google, чтобы получить согласие пользователя на выполнение запроса API от имени пользователя. Ваше приложение должно получить это согласие, прежде чем оно сможет выполнить запрос Google API, требующий авторизации пользователя.
Шаг 1. Создайте средство проверки кода и проверите его.
Google поддерживает протокол Proof Key for Code Exchange (PKCE), чтобы сделать работу установленного приложения более безопасной. Для каждого запроса авторизации создается уникальный верификатор кода, и его преобразованное значение, называемое «code_challenge», отправляется на сервер авторизации для получения кода авторизации.
Создайте верификатор кода
code_verifier
— это криптографическая случайная строка с высокой энтропией, использующая незарезервированные символы [AZ] / [az] / [0-9] / «-» / «». / «_» / «~», минимальной длиной 43 символа и максимальной длиной 128 символов.
Верификатор кода должен иметь достаточную энтропию, чтобы угадать значение было непрактично.
Создать задачу по коду
Поддерживаются два метода создания задачи кода.
Методы генерации задач кода | |
---|---|
S256 (рекомендуется) | Задача кода — это хэш SHA256, закодированный в Base64URL (без заполнения), верификатора кода.
|
простой | Запрос кода имеет то же значение, что и верификатор кода, созданный выше.
|
Шаг 2. Отправьте запрос на сервер Google OAuth 2.0.
Чтобы получить авторизацию пользователя, отправьте запрос на сервер авторизации Google по адресу https://accounts.google.com/o/oauth2/v2/auth
. Эта конечная точка обрабатывает поиск активного сеанса, аутентифицирует пользователя и получает согласие пользователя. Конечная точка доступна только через SSL и отказывается от подключений HTTP (не SSL).
Сервер авторизации поддерживает следующие параметры строки запроса для установленных приложений:
Параметры | |||||||
---|---|---|---|---|---|---|---|
client_id | Необходимый Идентификатор клиента для вашего приложения. Вы можете найти это значение в API ConsoleCredentials page. | ||||||
redirect_uri | Необходимый Определяет, как сервер авторизации Google отправляет ответ вашему приложению. Для установленных приложений доступно несколько вариантов перенаправления, и вы должны настроить учетные данные авторизации с учетом конкретного метода перенаправления. Значение должно точно совпадать с одним из авторизованных URI перенаправления для клиента OAuth 2.0, который вы настроили в настройках вашего клиента. API ConsoleCredentials page. Если это значение не соответствует авторизованному URI, вы получите ошибку В таблице ниже показано соответствующее значение параметра
| ||||||
response_type | Необходимый Определяет, возвращает ли конечная точка Google OAuth 2.0 код авторизации. Установите значение параметра для | ||||||
scope | Необходимый Список областей, разделенных пробелами, которые определяют ресурсы, к которым ваше приложение может получить доступ от имени пользователя. Эти значения указывают на экран согласия, который Google отображает пользователю. Области позволяют вашему приложению запрашивать доступ только к тем ресурсам, которые ему необходимы, а также позволяют пользователям контролировать объем доступа, который они предоставляют вашему приложению. Таким образом, существует обратная зависимость между количеством запрашиваемых областей и вероятностью получения согласия пользователя. | ||||||
code_challenge | Рекомендуется Указывает закодированный | ||||||
code_challenge_method | Рекомендуется Указывает, какой метод использовался для кодирования | ||||||
state | Рекомендуется Указывает любое строковое значение, которое ваше приложение использует для поддержания состояния между вашим запросом авторизации и ответом сервера авторизации. Сервер возвращает точное значение, которое вы отправляете в виде пары Этот параметр можно использовать для нескольких целей, например для направления пользователя к правильному ресурсу в вашем приложении, отправки одноразовых номеров и предотвращения подделки межсайтовых запросов. Поскольку ваш | ||||||
login_hint | Необязательный Если ваше приложение знает, какой пользователь пытается пройти аутентификацию, оно может использовать этот параметр, чтобы предоставить подсказку серверу аутентификации Google. Сервер использует подсказку, чтобы упростить процесс входа в систему, либо предварительно заполнив поле электронной почты в форме входа, либо выбрав соответствующий сеанс с несколькими входами. Установите в качестве значения параметра адрес электронной почты или |
Примеры URL-адресов авторизации
На вкладках ниже показаны примеры URL-адресов авторизации для различных вариантов URI перенаправления.
URL-адреса идентичны, за исключением значения параметра redirect_uri
. URL-адреса также содержат обязательные параметры response_type
и client_id
, а также необязательный параметр state
. Каждый URL-адрес содержит разрывы строк и пробелы для удобства чтения.
Пользовательская схема URI
https://accounts.google.com/o/oauth2/v2/auth? scope=email%20profile& response_type=code& state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken& redirect_uri=com.example.app%3A/oauth2redirect& client_id=client_id
IP-адрес обратной связи
https://accounts.google.com/o/oauth2/v2/auth? scope=email%20profile& response_type=code& state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken& redirect_uri=http%3A//127.0.0.1%3A9004& client_id=client_id
Шаг 3. Google запрашивает у пользователя согласие
На этом этапе пользователь решает, предоставить ли вашему приложению запрошенный доступ. На этом этапе Google отображает окно согласия, в котором отображается имя вашего приложения и сервисов Google API, к которым он запрашивает разрешение, с учетными данными авторизации пользователя и сводной информацией об объемах доступа, которые необходимо предоставить. Затем пользователь может согласиться предоставить доступ к одной или нескольким областям, запрошенным вашим приложением, или отклонить запрос.
На этом этапе вашему приложению не нужно ничего делать, поскольку оно ожидает ответа от сервера Google OAuth 2.0, указывающего, был ли предоставлен какой-либо доступ. Этот ответ объясняется на следующем шаге.
Ошибки
Запросы к конечной точке авторизации OAuth 2.0 Google могут отображать сообщения об ошибках вместо ожидаемых потоков аутентификации и авторизации. Ниже перечислены распространенные коды ошибок и предлагаемые решения.
admin_policy_enforced
Аккаунт Google не может авторизовать одну или несколько запрошенных областей в соответствии с правилами администратора Google Workspace. Дополнительную информацию о том, как администратор может ограничить доступ ко всем областям или конфиденциальным и ограниченным областям до тех пор, пока доступ не будет явно предоставлен вашему идентификатору клиента OAuth, см. в справочной статье администратора Google Workspace «Управление тем, какие сторонние и внутренние приложения получают доступ к данным Google Workspace».
disallowed_useragent
Конечная точка авторизации отображается внутри встроенного пользовательского агента, запрещенного политиками Google OAuth 2.0 .
Андроид
Разработчики Android могут столкнуться с этим сообщением об ошибке при открытии запросов авторизации вandroid.webkit.WebView
. Вместо этого разработчикам следует использовать библиотеки Android, такие как Google Sign-In для Android или AppAuth OpenID Foundation для Android .
Веб-разработчики могут столкнуться с этой ошибкой, когда приложение Android открывает общую веб-ссылку во встроенном пользовательском агенте, и пользователь переходит к конечной точке авторизации Google OAuth 2.0 с вашего сайта. Разработчики должны разрешить открытие общих ссылок в обработчике ссылок по умолчанию операционной системы, который включает в себя как обработчики ссылок приложений Android , так и браузерное приложение по умолчанию. Библиотека пользовательских вкладок Android также поддерживается.
iOS
Разработчики iOS и macOS могут столкнуться с этой ошибкой при открытии запросов авторизации вWKWebView
. Вместо этого разработчикам следует использовать библиотеки iOS, такие как Google Sign-In для iOS или AppAuth OpenID Foundation для iOS .
Веб-разработчики могут столкнуться с этой ошибкой, когда приложение iOS или macOS открывает общую веб-ссылку во встроенном пользовательском агенте, и пользователь переходит к конечной точке авторизации Google OAuth 2.0 с вашего сайта. Разработчики должны разрешить открытие общих ссылок в обработчике ссылок по умолчанию операционной системы, который включает в себя как обработчики универсальных ссылок , так и браузерное приложение по умолчанию. БиблиотекаSFSafariViewController
также поддерживается.
org_internal
Идентификатор клиента OAuth в запросе является частью проекта, ограничивающего доступ к аккаунтам Google в конкретной организации Google Cloud . Дополнительные сведения об этом параметре конфигурации см. в разделе «Тип пользователя» в справочной статье «Настройка экрана согласия OAuth».
invalid_grant
Если вы используете средство проверки кода и вызов , параметр code_callenge
недействителен или отсутствует. Убедитесь, что параметр code_challenge
установлен правильно.
При обновлении токена доступа возможно, срок действия токена истек или он стал недействительным. Аутентифицируйте пользователя еще раз и запросите согласие пользователя на получение новых токенов. Если вы продолжаете видеть эту ошибку, убедитесь, что ваше приложение настроено правильно и что вы используете правильные токены и параметры в своем запросе. В противном случае учетная запись пользователя могла быть удалена или отключена.
redirect_uri_mismatch
redirect_uri
переданный в запросе авторизации, не соответствует авторизованному URI перенаправления для идентификатора клиента OAuth. Просмотрите разрешенные URI перенаправления в Google API Console Credentials page.
Переданный redirect_uri
может быть недопустимым для типа клиента.
Параметр redirect_uri
может относиться к внеполосному потоку OAuth (OOB), который устарел и больше не поддерживается. Обратитесь к руководству по миграции, чтобы обновить интеграцию.
invalid_request
Что-то не так с вашим запросом. Это может быть связано с рядом причин:
- Запрос был неправильно отформатирован
- В запросе отсутствовали необходимые параметры
- В запросе используется метод авторизации, который Google не поддерживает. Убедитесь, что в вашей интеграции OAuth используется рекомендуемый метод интеграции.
- Для URI перенаправления используется пользовательская схема: если вы видите сообщение об ошибке. Пользовательская схема URI не поддерживается в приложениях Chrome или пользовательская схема URI не включена для вашего клиента Android , это означает, что вы используете собственную схему URI, которая не поддерживается. поддерживается в приложениях Chrome и по умолчанию отключен на Android. Узнайте больше об альтернативах пользовательских схем URI.
Шаг 4. Обработка ответа сервера OAuth 2.0
Способ получения приложением ответа на авторизацию зависит от используемой им схемы URI перенаправления . Независимо от схемы, ответ будет содержать либо код авторизации ( code
), либо ошибку ( error
). Например, error=access_denied
указывает, что пользователь отклонил запрос.
Если пользователь предоставляет доступ к вашему приложению, вы можете обменять код авторизации на токен доступа и токен обновления, как описано на следующем шаге.
Шаг 5. Обмен кода авторизации для токенов обновления и доступа.
Чтобы обменять код авторизации на токен доступа, вызовите конечную точку https://oauth2.googleapis.com/token
и установите следующие параметры:
Поля | |
---|---|
client_id | Идентификатор клиента, полученный из API ConsoleCredentials page. |
client_secret | Секрет клиента, полученный от API ConsoleCredentials page. |
code | Код авторизации, возвращенный из первоначального запроса. |
code_verifier | Средство проверки кода, созданное на шаге 1 . |
grant_type | Как определено в спецификации OAuth 2.0 , значение этого поля должно быть установлено в authorization_code . |
redirect_uri | Один из URI перенаправления, перечисленных для вашего проекта в API ConsoleCredentials page для данного client_id . |
В следующем фрагменте показан пример запроса:
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7& client_id=your_client_id& client_secret=your_client_secret& redirect_uri=http://127.0.0.1:9004& grant_type=authorization_code
Google отвечает на этот запрос, возвращая объект JSON, содержащий кратковременный токен доступа и токен обновления.
Ответ содержит следующие поля:
Поля | |
---|---|
access_token | Токен, который ваше приложение отправляет для авторизации запроса Google API. |
expires_in | Оставшийся срок действия токена доступа в секундах. |
id_token | Примечание. Это свойство возвращается только в том случае, если ваш запрос включал область идентификации, например openid , profile или email . Значением является веб-токен JSON (JWT), который содержит идентификационную информацию о пользователе с цифровой подписью. |
refresh_token | Токен, который можно использовать для получения нового токена доступа. Токены обновления действительны до тех пор, пока пользователь не отзовет доступ. Обратите внимание, что токены обновления всегда возвращаются для установленных приложений. |
scope | Области доступа, предоставляемые access_token выражаются в виде списка строк, разделенных пробелами и чувствительных к регистру. |
token_type | Тип возвращенного токена. В настоящее время значение этого поля всегда установлено на Bearer . |
В следующем фрагменте показан пример ответа:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "token_type": "Bearer", "scope": "https://www.googleapis.com/auth/drive.metadata.readonly", "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" }
Вызов API Google
После того как ваше приложение получит токен доступа, вы можете использовать его для выполнения вызовов API Google от имени определенной учетной записи пользователя, если предоставлены области доступа, требуемые API. Для этого включите токен доступа в запрос к API, включив либо параметр запроса access_token
, либо значение Bearer
HTTP-заголовка Authorization
. Когда это возможно, предпочтительнее использовать HTTP-заголовок, поскольку строки запроса обычно видны в журналах сервера. В большинстве случаев вы можете использовать клиентскую библиотеку для настройки вызовов Google API (например, при вызове Drive Files API ).
Вы можете опробовать все API Google и просмотреть их возможности на игровой площадке OAuth 2.0 .
Примеры HTTP GET
Вызов конечной точки drive.files
(API Drive Files) с использованием HTTP-заголовка Authorization: Bearer
может выглядеть следующим образом. Обратите внимание, что вам необходимо указать свой собственный токен доступа:
GET /drive/v2/files HTTP/1.1 Host: www.googleapis.com Authorization: Bearer access_token
Вот вызов того же API для аутентифицированного пользователя с использованием параметра строки запроса access_token
:
GET https://www.googleapis.com/drive/v2/files?access_token=access_token
примеры curl
Вы можете протестировать эти команды с помощью приложения командной строки curl
. Вот пример, в котором используется опция HTTP-заголовка (предпочтительно):
curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files
Или, альтернативно, опция параметра строки запроса:
curl https://www.googleapis.com/drive/v2/files?access_token=access_token
Обновление токена доступа
Срок действия токенов доступа периодически истекает, и они становятся недействительными учетными данными для связанного запроса API. Вы можете обновить токен доступа, не запрашивая у пользователя разрешения (в том числе, когда пользователь отсутствует), если вы запросили автономный доступ к областям, связанным с токеном.
Чтобы обновить токен доступа, ваше приложение отправляет запрос HTTPS POST
на сервер авторизации Google ( https://oauth2.googleapis.com/token
), который включает следующие параметры:
Поля | |
---|---|
client_id | Идентификатор клиента, полученный из API Console. |
client_secret | Секрет клиента, полученный от API Console. (Свойство client_secret неприменимо к запросам от клиентов, зарегистрированных как приложения Android, iOS или Chrome.) |
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", "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
возвращается вместе с кодом ошибки.
Методы перенаправления приложений
Пользовательская схема URI (Android, iOS, UWP)
Пользовательские схемы URI — это форма диплинкинга, в которой для открытия вашего приложения используется настраиваемая схема.
Альтернатива использованию пользовательских схем URI на Android
Используйте Google Sign-In для Android SDK , который доставляет ответ OAuth 2.0 непосредственно в ваше приложение, устраняя необходимость в URI перенаправления.
Как перейти на Google Sign-In для Android SDK
Если вы используете специальную схему для интеграции OAuth на Android, вам потребуется выполнить следующие действия, чтобы полностью перейти на использование рекомендуемого пакета SDK Google Sign-In для Android:
- Обновите свой код, чтобы использовать SDK для входа в Google.
- Отключите поддержку пользовательской схемы в консоли Google API.
Выполните следующие действия, чтобы перейти на Android SDK для входа в Google:
- Обновите свой код, чтобы использовать Android SDK для входа в Google:
- Проверьте свой код, чтобы определить, куда вы отправляете запрос на сервер Google OAuth 2.0 ; Если вы используете собственную схему, ваш запрос будет выглядеть следующим образом:
https://accounts.google.com/o/oauth2/v2/auth? scope=<SCOPES>& response_type=code& &state=<STATE>& redirect_uri=com.example.app:/oauth2redirect& client_id=<CLIENT_ID>
com.example.app:/oauth2redirect
— это URI перенаправления пользовательской схемы в приведенном выше примере. Дополнительные сведения о формате значения пользовательской схемы URI см. в определении параметраredirect_uri
. - Запишите параметры
scope
иclient_id
, которые вам понадобятся для настройки SDK для входа в Google. - Следуйте инструкциям по началу интеграции входа в Google в ваше приложение Android, чтобы настроить SDK. Вы можете пропустить шаг «Получить идентификатор клиента OAuth 2.0 вашего внутреннего сервера», так как вам придется повторно использовать
client_id
, полученный на предыдущем шаге. - Следуйте инструкциям по включению доступа к серверному API . Это включает в себя следующие шаги:
- Используйте метод
getServerAuthCode
, чтобы получить код аутентификации для областей, для которых вы запрашиваете разрешение. - Отправьте код авторизации на серверную часть вашего приложения, чтобы обменять его на токен доступа и обновления.
- Используйте полученный токен доступа для выполнения вызовов API Google от имени пользователя.
- Используйте метод
- Проверьте свой код, чтобы определить, куда вы отправляете запрос на сервер Google OAuth 2.0 ; Если вы используете собственную схему, ваш запрос будет выглядеть следующим образом:
- Отключите поддержку пользовательской схемы в консоли Google API:
- Перейдите в список учетных данных OAuth 2.0 и выберите свой клиент Android.
- Перейдите в раздел «Дополнительные настройки» , снимите флажок « Включить настраиваемую схему URI» и нажмите «Сохранить» , чтобы отключить поддержку настраиваемой схемы URI.
Включить пользовательскую схему URI
Если рекомендуемый вариант вам не подходит, вы можете включить собственные схемы URI для вашего клиента Android, следуя инструкциям ниже:- Перейдите в список учетных данных OAuth 2.0 и выберите свой клиент Android.
- Перейдите в раздел «Дополнительные настройки» , установите флажок « Включить настраиваемую схему URI» и нажмите «Сохранить» , чтобы включить поддержку настраиваемой схемы URI.
Альтернатива использованию пользовательских схем URI в приложениях Chrome.
Используйте Chrome Identity API , который доставляет ответ OAuth 2.0 непосредственно в ваше приложение, устраняя необходимость в URI перенаправления.
IP-адрес обратной связи (macOS, Linux, рабочий стол Windows)
Чтобы получить код авторизации с использованием этого URL-адреса, ваше приложение должно прослушивать локальный веб-сервер. Это возможно на многих, но не на всех платформах. Однако, если ваша платформа поддерживает это, это рекомендуемый механизм получения кода авторизации.
Когда ваше приложение получает ответ на авторизацию, для лучшего удобства использования оно должно отреагировать, отобразив HTML-страницу, которая инструктирует пользователя закрыть браузер и вернуться в ваше приложение.
Рекомендуемое использование | Приложения для настольных компьютеров macOS, Linux и Windows (но не для универсальной платформы Windows) |
Формировать значения | Установите тип приложения «Приложение для ПК» . |
Копирование/вставка вручную (устарело)
Защитите свои приложения
Подтвердить право собственности на приложение (Android, Chrome)
Вы можете подтвердить право собственности на свое приложение, чтобы снизить риск выдачи себя за другое лицо.
Андроид
Чтобы завершить процесс проверки, вы можете использовать свою учетную запись разработчика Google Play, если она у вас есть и ваше приложение зарегистрировано в консоли Google Play . Для успешной проверки должны быть выполнены следующие требования:
- У вас должно быть зарегистрированное приложение в консоли Google Play с тем же именем пакета и отпечатком сертификата подписи SHA-1, что и у клиента Android OAuth, для которого вы выполняете проверку.
- У вас должны быть права администратора для приложения в консоли Google Play. Узнайте больше об управлении доступом в консоли Google Play.
В разделе «Подтвердить право собственности на приложение» клиента Android нажмите кнопку «Подтвердить право собственности», чтобы завершить процесс проверки.
Если проверка прошла успешно, отобразится уведомление, подтверждающее успех процесса проверки. В противном случае будет показано сообщение об ошибке.
Чтобы исправить неудачную проверку, попробуйте следующее:
- Убедитесь, что приложение, которое вы проверяете, зарегистрировано в консоли Google Play.
- Убедитесь, что у вас есть разрешение администратора для приложения в консоли Google Play.
Хром
Чтобы завершить процесс проверки, вы используете свою учетную запись разработчика Chrome Web Store. Следующие требования должны быть выполнены для успешной проверки:
- У вас должен быть зарегистрированный элемент в панели разработчиков Chrome Web Store Dashinger с тем же идентификатором элемента, что и клиент hrome Extension OAuth, которого вы выполняете проверку.
- Вы должны быть издателем элемента Chrome Web Store. Узнайте больше о управлении доступом в Dashboard Developer Chrome Web Store.
В разделе «Проверка владения приложениями клиента chrome Extension» нажмите кнопку «Проверить владение», чтобы завершить процесс проверки.
Примечание. Подождите несколько минут, прежде чем завершить процесс проверки после предоставления доступа к вашей учетной записи.
Если проверка будет успешной, будет отображаться уведомление для подтверждения успеха процесса проверки. В противном случае будет показана подсказка ошибки.
Чтобы исправить неудачную проверку, попробуйте следующее:
- Убедитесь, что в приборной панели разработчика веб -магазина Chrome Web Store с тем же идентификатором элемента, что и клиент oauth oauth Chrome, вы завершаете проверку.
- Убедитесь, что вы являетесь издателем приложения, то есть вы должны быть индивидуальным издателем приложения или участником издателя группы приложения. Узнайте больше о управлении доступом в Dashboard Developer Chrome Web Store.
- Если вы только что обновили список издателей группы, убедитесь, что список членов группы Publisher синхронизируется на приборной панели разработчика Chrome Web Store. Узнайте больше о синхронизации вашего списка членства издателя.
Проверка приложения (только для iOS)
Функция проверки приложений помогает защитить ваши приложения для iOS от несанкционированного использования, используя приложение Apple Attest для проверки того, что запросы, сделанные в Google OAuth 2.0 конечных точках, происходящие из ваших подлинных приложений. Это помогает снизить риск подражания приложения.
Включите проверку приложения для вашего клиента iOS
Следующие требования должны быть выполнены для успешного включения проверки приложений для вашего клиента iOS:- Вы должны указать идентификатор команды для вашего клиента iOS.
- Вы не должны использовать подстановочный знак в своем идентификаторе пакета, поскольку он может разрешить более чем одно приложение. Это означает, что идентификатор пакета не должен включать символ звездочки (*).
После включения проверки приложений вы начнете видеть метрики, связанные с запросами OAuth, от вашего клиента, при редактировании клиента OAuth. Запросы из неверных источников не будут заблокированы до тех пор, пока вы не обеспечите проверку приложений . Информация на странице мониторинга метрик может помочь вам определить, когда начинать правоприменение.
Вы можете увидеть ошибки, связанные с функцией проверки приложений при включении проверки приложений для вашего приложения для iOS. Чтобы исправить эти ошибки, попробуйте следующее:
- Убедитесь, что указанный вами идентификатор пакета и идентификатор команды действительны.
- Убедитесь, что вы не используете подстановку для идентификатора пакета.
Приложение для приложения для вашего клиента iOS
Включение проверки приложений для вашего приложения не автоматически блокирует непризнанные запросы. Чтобы обеспечить соблюдение этой защиты, перейдите к редактированию вашего клиента iOS. Там вы увидите метрики проверки приложений справа от страницы в разделе Google Identity for iOS . Метрики включают следующую информацию:- Количество проверенных запросов - запросы, которые имеют действительный токен проверки приложений. После того, как вы включите приложение проверить правоприменение, только запросы в этой категории будут успешными.
- Количество незавершенных запросов: вероятные устаревшие запросы клиентов - запросы пропустили токен проверки приложения; Этот запрос может быть из более старой версии вашего приложения, которая не включает реализацию проверки приложений.
- Количество незавершенных запросов: Неизвестные запросы на происхождение - Запросы отсутствуют токен проверки приложений, который не выглядит так, как будто они приходят из вашего приложения.
- Количество незавершенных запросов: неверные запросы - запросы с неверным токеном проверки приложений, который может быть от недостоверного клиента, пытающегося выдать себя за ваше приложение или из эмулированных сред.
Чтобы обеспечить проверку приложений, нажмите кнопку «Объяснение» и подтвердите свой выбор. Как только принудительное исполнение будет активно, все незавершенные запросы от вашего клиента будут отклонены.
Примечание . После того, как вы включите правоприменение, для вступления в силу изменений может занять до 15 минут.
Приложения Uncforce Проверка приложения для вашего клиента для iOS
Uncencring App Проверка приложения для вашего приложения прекратит правоприменение и позволит всем запросам от вашего клиента в Google OAuth 2.0 конечные точки, включая незавершенные запросы.
Чтобы Uncerforce App проверьте для вашего клиента iOS, перейдите к просмотру редактирования клиента iOS и нажмите кнопку Unenforce и подтвердите свой выбор.
ПРИМЕЧАНИЕ . После нельзя применить проверку приложений, для вступления в силу изменений может занять до 15 минут.
Отключить проверку приложения для вашего клиента iOS
Отключение проверки приложений для вашего приложения остановит мониторинг и правоприменение всех приложений. Вместо этого рассмотрим проверку приложения без прирождения , чтобы вы могли продолжить мониторинг метрик для своего клиента.
Чтобы отключить проверку приложений для вашего клиента iOS, перейдите к редактированию вида клиента iOS и отключите клиент Protect Your OAuth от злоупотребления с помощью кнопки «Проверка приложения Firebase» .
ПРИМЕЧАНИЕ . После отключения проверки приложений, для вступления в силу может потребоваться до 15 минут.
Дальнейшее чтение
Лучшая текущая практика IETF OAuth 2.0 для местных приложений устанавливает многие из лучших практик, задокументированных здесь.
Реализация защиты от поперечного доступа
Дополнительным шагом, который вы должны предпринять для защиты учетных записей ваших пользователей, является реализация защиты от аккунт, используя службу защиты Google Cross-account. Эта услуга позволяет подписаться на уведомления о событиях безопасности, которые предоставляют информацию в вашем приложении о серьезных изменениях в учетной записи пользователя. Затем вы можете использовать информацию для принятия мер в зависимости от того, как вы решите ответить на события.
Некоторые примеры типов событий, отправленных в ваше приложение, с помощью службы защиты 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
См . Защита пользовательских учетных записей на странице защиты Cross-Account для получения дополнительной информации о том, как реализовать защиту учетных записей и полный список доступных событий.
В этом документе объясняется, как приложения, установленные на таких устройствах, как телефоны, планшеты и компьютеры, используют конечные точки Google OAuth 2.0 для авторизации доступа к API Google.
OAuth 2.0 позволяет пользователям обмениваться конкретными данными с приложением, сохраняя при этом свои имена пользователей, пароли и другую информацию частной. Например, приложение может использовать OAuth 2.0 для получения разрешения от пользователей на хранение файлов в своих дисках Google.
Установленные приложения распространяются на отдельные устройства, и предполагается, что эти приложения не могут хранить секреты. Они могут получить доступ к API Google, пока пользователь присутствует в приложении или когда приложение работает в фоновом режиме.
Этот поток авторизации похож на тот, который используется для приложений веб -сервера . Основное отличие состоит в том, что установленные приложения должны открыть системный браузер и предоставить локальный URI Redirect для обработки ответов с сервера авторизации Google.
Альтернативы
Для мобильных приложений вы можете предпочесть использовать вход Google для Android или iOS . Клиентские библиотеки Google вступили в систему, обрабатывают аутентификацию и авторизацию пользователя, и они могут быть проще в реализации, чем протокол нижнего уровня, описанный здесь.
Для приложений, работающих на устройствах, которые не поддерживают системный браузер или имеют ограниченные возможности ввода, такие как телевизоры, игровые приставки, камеры или принтеры, см. OAuth 2.0 для телевизоров и устройств или входа на телевизоры и ограниченные входные устройства .
Библиотеки и образцы
Мы рекомендуем следующие библиотеки и образцы, чтобы помочь вам реализовать поток OAuth 2.0, описанный в этом документе:
Предварительные условия
Включить API для вашего проекта
Любое приложение, которое вызывает Google API, необходимо включить эти API в API Console.
Чтобы включить API для вашего проекта:
- Open the API Library в Google API Console.
- If prompted, select a project, or create a new one.
- API Library Перечисляет все доступные API, сгруппированные по семейству продуктов и популярности. Если API, который вы хотите включить, не виден в списке, используйте поиск, чтобы найти его, или нажмите «Просмотреть все в семействе продуктов».
- Выберите API, который вы хотите включить, затем нажмите кнопку «Включить» .
- If prompted, enable billing.
- If prompted, read and accept the API's Terms of Service.
Создать учетные данные авторизации
Любое приложение, которое использует OAuth 2.0 для доступа к API Google, должно иметь учетные данные авторизации, которые идентифицируют приложение на сервере Google OAuth 2.0. Следующие шаги объясняют, как создать учетные данные для вашего проекта. Затем ваши приложения могут использовать учетные данные для доступа к API, которые вы включили для этого проекта.
- Go to the Credentials page.
- Нажмите «Создать учетные данные»> «Идентификатор клиента OAuth» .
- В следующих разделах описываются типы клиентов, которые поддерживает сервер авторизации Google. Выберите тип клиента, который рекомендуется для вашего приложения, назовите клиента OAuth и установите другие поля в форме в зависимости от необходимости.
Андроид
- Выберите тип приложения Android .
- Введите имя для клиента OAuth. Это имя отображается на вашем проекте Credentials page Чтобы идентифицировать клиента.
- Введите имя пакета вашего приложения Android. Это значение определяется в атрибуте
package
элемента<manifest>
в вашем файле MANIFEST. - Введите сертификат SHA-1 подписного отпечатка приложения распределения.
- Если ваше приложение использует подписание приложения с помощью Google Play , скопируйте отпечатки пальцев SHA-1 со страницы подписания приложения консоли Play.
- Если вы управляете своим собственным хранилищем ключей и ключами подписания, используйте утилиту Keytool, включенную в Java, для печати информации о сертификате в формате читаемого человека. Скопируйте значение
SHA1
в разделеCertificate fingerprints
вывода KeyTool . См. Аутентификацию вашего клиента в API Google для документации Android для получения дополнительной информации.
- (Необязательно) Проверьте право собственности на ваше приложение для Android.
- Нажмите Создать .
iOS
- Выберите тип приложения iOS .
- Введите имя для клиента OAuth. Это имя отображается на вашем проекте Credentials page Чтобы идентифицировать клиента.
- Введите идентификатор пакета для вашего приложения. Идентификатор пакета является значением ключа CFBundleIdentifier в файле ресурса Свойства информации вашего приложения ( info.plist ). Значение чаще всего отображается на панели общей панели или на панели подписания и возможностей редактора проекта Xcode. Идентификатор пакета также отображается в разделе общей информации страницы информации о приложении для приложения на сайте Apple Store Connect .
Убедитесь, что вы используете правильный идентификатор пакета для вашего приложения, так как вы не сможете изменить его, если используете функцию проверки приложений.
- (Необязательный)
Введите идентификатор магазина приложений вашего приложения, если приложение опубликовано в Apple App Store. Идентификатор магазина - это числовая строка, включенная в каждый URL -адрес магазина Apple App.
- Откройте приложение Apple App Store на вашем устройстве iOS или iPados.
- Поиск вашего приложения.
- Выберите кнопку «Поделиться» (квадрат и символ стрелка).
- Выберите ссылку на копию .
- Вставьте ссылку в текстовый редактор. Идентификатор магазина приложений является последней частью URL.
Пример:
https://apps.apple.com/app/google/id 284815942
- (Необязательный)
Введите идентификатор вашей команды. См . Найдите идентификатор вашей команды в документации по учетной записи Apple Developer для получения дополнительной информации.
ПРИМЕЧАНИЕ. Поле идентификатора команды требуется, если вы включите проверку приложения для вашего клиента. - (Необязательный)
Включите проверку приложения для вашего приложения для iOS. Когда вы включите проверку приложений, приложение Apple Attest используется для проверки того, что запросы OAuth 2.0, происходящие из вашего клиента OAuth, являются подлинными и поступают из вашего приложения. Это помогает снизить риск подражания приложения. Узнайте больше о включении проверки приложений для вашего приложения для iOS .
- Нажмите Создать .
UWP
- Выберите универсальный тип приложения платформы Windows .
- Введите имя для клиента OAuth. Это имя отображается на вашем проекте Credentials page Чтобы идентифицировать клиента.
- Введите 12-символьный идентификатор магазина Microsoft 12 вашего приложения. Вы можете найти это значение в Microsoft Partner Center на странице Identity App в разделе «Управление приложениями».
- Нажмите Создать .
Для приложений UWP пользовательская схема URI не может быть более 39 символов.
Определите сферу доступа
Области позволяют вашему приложению запросить только доступ к ресурсам, в котором ему нужны, а также позволяет пользователям контролировать объем доступа, который они предоставляют вашему приложению. Таким образом, может быть обратная связь между количеством запрашиваемых областей и вероятностью получения согласия пользователя.
Прежде чем вы начнете реализовать авторизацию OAuth 2.0, мы рекомендуем вам определить, что вашему приложению потребуется разрешение на доступ.
Документ API API OAuth 2.0 содержит полный список областей, которые вы можете использовать для доступа к API Google.
Получение токенов доступа OAuth 2.0
Следующие шаги показывают, как ваше приложение взаимодействует с сервером Google OAuth 2.0, чтобы получить согласие пользователя на выполнение запроса API от имени пользователя. Ваше приложение должно иметь это согласие, прежде чем он сможет выполнить запрос Google API, который требует авторизации пользователя.
Шаг 1: Сгенерируйте проверку кода и вызов
Google поддерживает протокол доказательств для протокола обмена кода (PKCE), чтобы сделать установленное поток приложений более безопасным. Уникальный кодовый проверятель создается для каждого запроса авторизации, и его преобразованное значение, называемое «code_challenge», отправляется на сервер авторизации для получения кода авторизации.
Создать проверку кода
code_verifier
-это высокомерная криптографическая случайная строка с использованием незаслуженных символов [AZ] / [AZ] / [0-9] / "-" / ". / "_" / "~", с минимальной длиной 43 символов и максимальной длиной 128 символов.
Проверитель кода должен иметь достаточно энтропии, чтобы сделать его непрактичным, чтобы угадать значение.
Создать задачу кода
Поддерживаются два метода создания кодовой задачи.
Методы генерации задач кода | |
---|---|
S256 (рекомендуется) | Задача кода - это хэш Base64URL (без прокладки), кодируемый HASH SHA256 кода.
|
простой | Задача кода является тем же значением, что и проверка кода, сгенерированный выше.
|
Шаг 2: Отправьте запрос на сервер Google OAuth 2.0
Чтобы получить авторизацию пользователя, отправьте запрос на сервер авторизации Google по адресу https://accounts.google.com/o/oauth2/v2/auth
. Эта конечная точка обрабатывает активное поиск сеанса, аутентифицирует пользователя и получает согласие пользователя. Конечная точка доступна только для SSL, и она отказывается от HTTP (не-SSL) соединений.
Сервер авторизации поддерживает следующие параметры строки запроса для установленных приложений:
Параметры | |||||||
---|---|---|---|---|---|---|---|
client_id | Необходимый Идентификатор клиента для вашего приложения. Вы можете найти это значение в API ConsoleCredentials page. | ||||||
redirect_uri | Необходимый Определяет, как сервер авторизации Google отправляет ответ на ваше приложение. Есть несколько вариантов перенаправления, доступных для установленных приложений, и вы будете настроить свои учетные данные авторизации с учетом конкретного метода перенаправления. Значение должно точно соответствовать одному из авторизованных URI Redirect для клиента OAuth 2.0, который вы настроили в своем клиенте API ConsoleCredentials page. Если это значение не соответствует авторизованному URI, вы получите ошибку В таблице ниже показано соответствующее значение параметра
| ||||||
response_type | Необходимый Определяет, возвращает ли конечная точка Google OAuth 2.0 код авторизации. Установите значение параметра в | ||||||
scope | Необходимый Список областей областей, которые определяют ресурсы, к которым может получить доступ к вашему приложению от имени пользователя. Эти значения информируют экран согласия, который Google отображает пользователю. Области позволяют вашему приложению запросить только доступ к ресурсам, в котором ему нужны, а также позволяет пользователям контролировать объем доступа, который они предоставляют вашему приложению. Таким образом, существует обратная связь между количеством запрашиваемых областей и вероятностью получения согласия пользователя. | ||||||
code_challenge | Рекомендуется Определяет закодированный | ||||||
code_challenge_method | Рекомендуется Определяет, какой метод использовался для кодирования | ||||||
state | Рекомендуется Определяет любое строковое значение, которое ваше приложение использует для поддержания состояния между вашим запросом на авторизацию и ответом сервера авторизации. Сервер возвращает точное значение, которое вы отправляете в виде пары Вы можете использовать этот параметр для нескольких целей, таких как направление пользователя к правильному ресурсу в вашем приложении, отправка NONCES и смягчение подделки по перекрестным запросам. Поскольку ваш | ||||||
login_hint | Необязательный Если ваше приложение знает, какой пользователь пытается аутентифицировать, оно может использовать этот параметр, чтобы дать намек на сервер аутентификации Google. Сервер использует подсказку для упрощения потока входа в систему путем предварительного срока поля электронной почты в форме регистрации или выбора соответствующего мульти-логинного сеанса. Установите значение параметра на адрес электронной почты или |
Образец авторизации URL
На приведенных ниже вкладках показаны примерные URL -адреса авторизации для различных параметров URI перенаправления.
URL -адреса идентичны, за исключением значения параметра redirect_uri
. URL -адреса также содержат необходимые параметры response_type
и client_id
, а также параметр необязательного state
. Каждый URL содержит разрывы линии и пробелы для читаемости.
Пользовательская схема URI
https://accounts.google.com/o/oauth2/v2/auth? scope=email%20profile& response_type=code& state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken& redirect_uri=com.example.app%3A/oauth2redirect& client_id=client_id
IP -адрес Loopback
https://accounts.google.com/o/oauth2/v2/auth? scope=email%20profile& response_type=code& state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken& redirect_uri=http%3A//127.0.0.1%3A9004& client_id=client_id
Шаг 3: Google предлагает пользователю согласие
На этом этапе пользователь решает, предоставить ли ваш приложение запрошенное доступ. На этом этапе Google отображает окно согласия, в котором отображается имя вашего приложения и службы Google API, которые запрашивает разрешение на доступ с учетными данными пользователя авторизации и краткой предоставлением областей доступа. Пользователь может затем согласиться предоставить доступ к одной или нескольким областям, запрашиваемым вашим заявлением или отказаться от запроса.
Ваше приложение не должно ничего делать на этом этапе, поскольку оно ожидает ответа на сервере Google OAuth 2.0, указывающего, был ли какой -либо доступ. Этот ответ объясняется на следующем шаге.
Ошибки
Запросы на конечную точку Authization oauth 2.0 могут отображать сообщения об ошибках, связанных с пользователем, вместо ожидаемой аутентификации и потоков авторизации. Общие коды ошибок и предлагаемые решения перечислены ниже.
admin_policy_enforced
Аккаунт Google не может разрешить одну или несколько применений, запрашиваемых из -за политик их администратора Google Workspace. См . Управление справочной справкой Admin Admin Workspace Google, какие сторонние и внутренние приложения получают доступ к данным Google Workspace для получения дополнительной информации о том, как администратор может ограничить доступ ко всем областям или конфиденциальным и ограниченным областям, пока доступ не будет явно предоставлен вашему идентификатору клиента OAuth.
disallowed_useragent
Конечная точка авторизации отображается внутри встроенного пользовательского агента, запрещенного политиками Google OAuth 2.0 .
Андроид
Разработчики Android могут столкнуться с этим сообщением об ошибке при открытии запросов на авторизацию вandroid.webkit.WebView
. Вместо этого разработчики должны использовать библиотеки Android, такие как вход Google для Android или Appauth для Android от Android или Openid Foundation.
Веб-разработчики могут столкнуться с этой ошибкой, когда приложение Android открывает общую веб-ссылку в встроенном пользовательском агенте, а пользователь перемещается в конечную точку авторизации Google 2.0 с вашего сайта. Разработчики должны разрешить открывать общие ссылки в обработчике ссылок по умолчанию операционной системы, которая включает в себя обработчики приложений Android , или приложение для браузера по умолчанию. Библиотека Android Custom Tabs также является поддерживаемой опцией.
iOS
Разработчики iOS и MacOS могут столкнуться с этой ошибкой при открытии запросов на авторизацию вWKWebView
. Вместо этого разработчики должны использовать библиотеки iOS, такие как вход Google для Appauth для iOS для iOS или Openid Foundation.
Веб-разработчики могут столкнуться с этой ошибкой, когда приложение iOS или MacOS открывает общую веб-ссылку в встроенном пользовательском агенте, а пользователь перемещается в конечную точку авторизации Google 2.0 с вашего сайта. Разработчики должны разрешить открывать общие ссылки в обработчике ссылок по умолчанию операционной системы, которая включает как универсальные обработки ссылок , так и приложение для браузера по умолчанию. БиблиотекаSFSafariViewController
также является поддерживаемым вариантом.
org_internal
Идентификатор клиента OAuth в запросе является частью проекта, ограничивающего доступ к учетным записям Google в конкретной облачной организации Google . Для получения дополнительной информации об этом параметре конфигурации см. В разделе «Тип пользователя» в статье «Настройка вашей справочной помощи по настройке экрана согласия OAuth».
invalid_grant
Если вы используете проверку кода и вызов , параметр code_callenge
является недействительным или отсутствует. Убедитесь, что параметр code_challenge
установлен правильно.
При освещении токена доступа , токен мог истек срок действия или был инфидирован. Авертикация пользователя снова и попросите согласие пользователя на получение новых токенов. Если вы продолжаете видеть эту ошибку, убедитесь, что ваше приложение было настроено правильно и что вы используете правильные токены и параметры в вашем запросе. В противном случае учетная запись пользователя может быть удалена или отключена.
redirect_uri_mismatch
redirect_uri
переданный в запросе авторизации, не соответствует авторизованному Redirect URI для идентификатора клиента OAuth. Обзор авторизованный перенаправление URI в Google API Console Credentials page.
Продолжительный redirect_uri
может быть недействительным для типа клиента.
Параметр redirect_uri
может относиться к потоку OAUTH Out-Band (OOB), который устарел и больше не поддерживается. Обратитесь к руководству по миграции, чтобы обновить вашу интеграцию.
invalid_request
Что -то не так с просьбой, которую вы сделали. Это может быть связано с рядом причин:
- Запрос не был отформатирован должным образом
- В запросе отсутствовал необходимые параметры
- Запрос использует метод авторизации, который Google не поддерживает. Убедитесь, что ваша интеграция OAuth использует рекомендуемый метод интеграции
- Пользовательская схема используется для Redirect URI: если вы видите , что пользовательская схема URI сообщений об ошибке не поддерживается в приложениях Chrome или на пользовательской схеме URI не включена для вашего клиента Android , это означает, что вы используете пользовательскую схему URI, которая не является Поддерживается в приложениях Chrome и по умолчанию отключена на Android. Узнайте больше об пользовательских альтернативах схемы URI
Шаг 4: Обработайте ответ сервера OAuth 2.0
Способ, которым ваша приложение получает ответ авторизации, зависит от схемы перенаправления URI , которую она использует. Независимо от схемы, ответ будет либо содержать код авторизации ( code
), либо ошибку ( error
). Например, error=access_denied
указывает, что пользователь отклонил запрос.
Если пользователь предоставляет доступ к вашему приложению, вы можете обмениваться кодом авторизации на токен доступа и токен обновления, как описано на следующем шаге.
Шаг 5: Код авторизации обмена для обновления и токенов доступа
Чтобы обмениваться кодом авторизации на токен доступа, позвоните в конечную точку https://oauth2.googleapis.com/token
и установите следующие параметры:
Поля | |
---|---|
client_id | Идентификатор клиента, полученный из API ConsoleCredentials page. |
client_secret | Секрет клиента, полученный из API ConsoleCredentials page. |
code | Код авторизации возвращается из первоначального запроса. |
code_verifier | Проверник кода, который вы создали на шаге 1 . |
grant_type | Как определено в спецификации OAuth 2.0 , значение этого поля должно быть установлено на authorization_code . |
redirect_uri | Один из перенаправленных URI, перечисленных для вашего проекта в API ConsoleCredentials page Для данного client_id . |
Следующий фрагмент показывает образец запроса:
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7& client_id=your_client_id& client_secret=your_client_secret& redirect_uri=http://127.0.0.1:9004& grant_type=authorization_code
Google отвечает на этот запрос, возвращая объект JSON, который содержит недолговый токен доступа и токен обновления.
Ответ содержит следующие поля:
Поля | |
---|---|
access_token | Токен, который ваш приложение отправляет для авторизации запроса Google API. |
expires_in | Оставшаяся срок службы тона доступа за считанные секунды. |
id_token | Примечание. Это свойство возвращается только в том случае, если ваш запрос включал в себя область личности, такую как openid , profile или email . Значение - это веб -токен JSON (JWT), который содержит информацию о идентификации в цифровом виде. |
refresh_token | Токен, который вы можете использовать для получения нового токена доступа. Токены обновления действительны до тех пор, пока пользователь не отменит доступ к доступу. Обратите внимание, что токены обновления всегда возвращаются для установленных приложений. |
scope | Прицелы доступа, предоставленные access_token выраженным в виде списка, чувствительных к пространству, чувствительных к случаям строк. |
token_type | Тип токена вернулся. В настоящее время значение этого поля всегда установлено на Bearer . |
Следующий фрагмент показывает образец ответа:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "token_type": "Bearer", "scope": "https://www.googleapis.com/auth/drive.metadata.readonly", "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" }
Вызов Google API
После того, как ваше приложение получит токен доступа, вы можете использовать токен для вызова вызовов в Google API от имени данной учетной записи пользователя, если были предоставлены объем доступа, требуемый API. Для этого включите токен доступа в запрос к API, включив либо параметр запроса access_token
, либо значение Bearer
заголовка Authorization
. Когда это возможно, заголовок HTTP является предпочтительным, потому что строки запросов, как правило, видны в журналах сервера. В большинстве случаев вы можете использовать клиентскую библиотеку для настройки ваших вызовов для Google API (например, при вызове API файлов диска ).
Вы можете попробовать все API Google и просмотреть их прицелы на игровой площадке OAuth 2.0 .
Http Получите примеры
Вызов к конечной точке drive.files
(API файлов диска) с использованием Authorization: Bearer
может выглядеть следующим образом. Обратите внимание, что вам нужно указать свой собственный токен доступа:
GET /drive/v2/files HTTP/1.1 Host: www.googleapis.com Authorization: Bearer access_token
Вот призыв к тому же API для аутентифицированного пользователя, используя параметр строки запроса access_token
:
GET https://www.googleapis.com/drive/v2/files?access_token=access_token
Примеры curl
Вы можете проверить эти команды с помощью приложения командной строки curl
. Вот пример, который использует опцию заголовка HTTP (предпочтительно):
curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files
Или, в качестве альтернативы, опция параметра строки запроса:
curl https://www.googleapis.com/drive/v2/files?access_token=access_token
Освежает токен доступа
Периодически истекают токены доступа и становятся недействительными учетными данными для соответствующего запроса API. Вы можете обновить токен доступа, не побуждая пользователя на разрешение (включая, когда пользователь не присутствует), если вы запросили автономный доступ к областям, связанным с токеном.
Чтобы обновить токен доступа, ваше приложение отправляет запрос POST
HTTPS на сервер авторизации Google ( https://oauth2.googleapis.com/token
), который включает в себя следующие параметры:
Поля | |
---|---|
client_id | Идентификатор клиента, полученный из API Console. |
client_secret | Секрет клиента, полученный из API Console. ( client_secret не применим к запросам от клиентов, зарегистрированных как приложения Android, iOS или Chrome.) |
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
Пока пользователь не отозвал доступ к приложению, сервер Token возвращает объект JSON, который содержит новый токен доступа. Следующий фрагмент показывает образец ответа:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "scope": "https://www.googleapis.com/auth/drive.metadata.readonly", "token_type": "Bearer" }
Обратите внимание, что существуют ограничения на количество токенов обновления, которые будут выпущены; Один лимит на комбинацию клиента/пользователя, а другой на одного пользователя для всех клиентов. Вы должны сохранить токены обновления в долгосрочном хранении и продолжать использовать их, пока они остаются действительными. Если ваше приложение запрашивает слишком много токенов обновления, оно может столкнуться с этими пределами, и в этом случае старые токены обновления перестают работать.
Отмена токена
В некоторых случаях пользователь может захотеть отменить доступ к приложению. Пользователь может отозвать доступ, посетив настройки учетной записи . См . Раздел «Удалить сайт» или «Доступ к приложениям» сторонних сайтов и приложений с доступом к документу поддержки вашей учетной записи для получения дополнительной информации.
Также возможно приложение программно отозвать предоставленный ему доступ. Программное отзыв важно в случаях, когда пользователь отписывает подпись, удаляет приложение или ресурсы API, необходимые приложению, значительно изменились. Другими словами, часть процесса удаления может включать запрос API для обеспечения удаления разрешений, ранее предоставленных заявлению.
To programmatically revoke a token, your application makes a request to https://oauth2.googleapis.com/revoke
and includes the token as a parameter:
curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \ https://oauth2.googleapis.com/revoke?token={token}
The token can be an access token or a refresh token. If the token is an access token and it has a corresponding refresh token, the refresh token will also be revoked.
If the revocation is successfully processed, then the HTTP status code of the response is 200
. For error conditions, an HTTP status code 400
is returned along with an error code.
App redirect methods
Custom URI scheme (Android, iOS, UWP)
Custom URI schemes are a form of deeplinking that use a custom-defined scheme to open your app.
Alternative to using custom URI schemes on Android
Use the Google Sign-In for Android SDK which delivers the OAuth 2.0 response directly to your app, eliminating the need for a redirect URI.
How to migrate to the Google Sign-In for Android SDK
If you use a custom scheme for your OAuth integration on Android, you would need to complete the following actions to fully migrate to using the recommended Google Sign-In for Android SDK:
- Update your code to use the Google Sign-In SDK.
- Disable support for custom scheme in the Google API Console.
Follow the below steps to migrate to the Google Sign-In Android SDK:
- Update your code to use the Google Sign-In Android SDK:
- Examine your code to identify where you are sending a request to Google's OAuth 2.0 server ; if using a custom scheme, your request would look like the below:
https://accounts.google.com/o/oauth2/v2/auth? scope=<SCOPES>& response_type=code& &state=<STATE>& redirect_uri=com.example.app:/oauth2redirect& client_id=<CLIENT_ID>
com.example.app:/oauth2redirect
is the custom scheme redirect URI in the above example. See theredirect_uri
parameter definition for more details about the format of the custom URI scheme value. - Make note of the
scope
andclient_id
request parameters which you would need to configure the Google Sign-In SDK. - Follow the Start Integrating Google Sign-In into Your Android App instructions to set up the SDK. You can skip the Get your backend server's OAuth 2.0 client ID step as you would re-use the
client_id
you retrieved from the previous step. - Follow the Enabling Server-Side API access instructions. This includes the following steps:
- Use the
getServerAuthCode
method to retrieve an auth code for the scopes you are requesting permission for. - Send the auth code to your app's backend to exchange it for an access & refresh token.
- Use the retrieved access token to make calls to Google APIs on behalf of the user.
- Use the
- Examine your code to identify where you are sending a request to Google's OAuth 2.0 server ; if using a custom scheme, your request would look like the below:
- Disable support for custom scheme in the Google API Console:
- Go to your OAuth 2.0 credentials list and select your Android client.
- Navigate to the Advanced Settings section, uncheck the Enable Custom URI Scheme checkbox, and click Save to disable custom URI scheme support.
Enable custom URI scheme
If the recommended alternative does not work for you, you can enable custom URI schemes for your Android client by following the below instructions:- Go to your OAuth 2.0 credentials list and select your Android client.
- Navigate to the Advanced Settings section, check the Enable Custom URI Scheme checkbox, and click Save to enable custom URI scheme support.
Alternative to using custom URI schemes on Chrome apps
Use the Chrome Identity API which delivers the OAuth 2.0 response directly to your app, eliminating the need for a redirect URI.
Loopback IP address (macOS, Linux, Windows desktop)
To receive the authorization code using this URL, your application must be listening on the local web server. That is possible on many, but not all, platforms. However, if your platform supports it, this is the recommended mechanism for obtaining the authorization code.
When your app receives the authorization response, for best usability it should respond by displaying an HTML page that instructs the user to close the browser and return to your app.
Рекомендуемое использование | macOS, Linux, and Windows desktop (but not Universal Windows Platform) apps |
Form values | Set the application type to Desktop app . |
Manual copy/paste (Deprecated)
Protect your apps
Verify app ownership (Android, Chrome)
You can verify ownership of your application to reduce the risk of app impersonation.
Андроид
To complete the verification process, you can use your Google Play Developer Account if you have one and your app is registered on the Google Play Console . The following requirements must be met for a successful verification:
- You must have a registered application in the Google Play Console with the same package name and SHA-1 signing certificate fingerprint as the Android OAuth client you are completing the verification for.
- You must have Admin permission for the app in the Google Play Console. Learn more about access management in the Google Play Console.
In the Verify App Ownership section of the Android client, click the Verify Ownership button to complete the verification process.
If the verification is successful, a notification will be displayed to confirm the success of the verification process. Otherwise, an error prompt will be shown.
To fix a failed verification, try the following:
- Make sure the app you are verifying is a registered app in the Google Play Console.
- Make sure you have Admin permission for the app in the Google Play Console.
Хром
To complete the verification process, you would use your Chrome Web Store Developer account. The following requirements must be met for a successful verification:
- You must have a registered item in the Chrome Web Store Developer Dashboard with the same item ID as the Chrome Extension OAuth client you are completing the verification for.
- You must be a publisher for the Chrome Web Store item. Learn more about access management in the Chrome Web Store Developer Dashboard.
In the Verify App Ownership section of the Chrome Extension client, click the Verify Ownership button to complete the verification process.
Note: Wait a few minutes before completing the verification process after granting access to your account.
If the verification is successful, a notification will be displayed to confirm the success of the verification process. Otherwise, an error prompt will be shown.
To fix a failed verification, try the following:
- Make sure there is a registered item in the Chrome Web Store Developer Dashboard with the same item ID as the Chrome Extension OAuth client you are completing the verification for.
- Make sure you are a publisher for the app, that is, you must either be the individual publisher of the app or a member of the group publisher of the app. Learn more about access management in the Chrome Web Store Developer Dashboard.
- If you just updated your group publisher list, verify that the group publisher membership list is synced in the Chrome Web Store Developer Dashboard. Learn more about syncing your publisher membership list.
App Check (iOS only)
The App Check feature helps safeguard your iOS applications from unauthorized usage by using Apple's App Attest service to verify that requests made to Google OAuth 2.0 endpoints originate from your authentic applications. This helps to reduce the risk of app impersonation.
Enable App Check for your iOS Client
The following requirements must be met to successfully enable App Check for your iOS client:- You must specify a team ID for your iOS client.
- You must not use a wildcard in your bundle ID since it can resolve to more than one app. This means that the bundle ID must not include the asterisk (*) symbol.
After enabling App Check, you will start seeing metrics related to OAuth requests from your client in the edit view of the OAuth client. Requests from unverified sources won't be blocked until you enforce App Check . The information in the metrics monitoring page can help you determine when to start enforcement.
You might see errors related to the App Check feature when enabling App Check for your iOS app. To fix these errors, try the following:
- Verify that the bundle ID and team ID you specified are valid.
- Verify that you are not using a wildcard for the bundle ID.
Enforce App Check for your iOS Client
Enabling App Check for your app does not automatically block unrecognized requests. To enforce this protection, go to the edit view of your iOS client. There, you will see App Check metrics to the right of the page under the Google Identity for iOS section. The metrics include the following information:- Number of verified requests - requests that have a valid App Check token. After you enable App Check enforcement, only requests in this category will succeed.
- Number of unverified requests: likely outdated client requests - requests missing an App Check token; these request may be from an older version of your app that doesn't include an App Check implementation.
- Number of unverified requests: unknown origin requests - requests missing an App Check token that don't look like they are coming from your app.
- Number of unverified requests: invalid requests - requests with an invalid App Check token, which may be from an inauthentic client attempting to impersonate your app, or from emulated environments.
To enforce App Check, click the ENFORCE button and confirm your choice. Once enforcement is active, all unverified requests from your client will be rejected.
Note : after you enable enforcement, it can take up to 15 minutes for the changes to take effect.
Unenforce App Check for your iOS Client
Unenforcing App Check for your app will stop enforcement and will allow all requests from your client to Google OAuth 2.0 endpoints, including unverified requests.
To unenforce App Check for your iOS client, navigate to the edit view of the iOS client and click the UNENFORCE button and confirm your choice.
Note : after unenforcing App Check, it can take up to 15 minutes for the changes to take effect.
Disable App Check for your iOS Client
Disabling App Check for your app will stop all App Check monitoring and enforcement . Consider unenforcing App Check instead so you can continue monitoring metrics for your client.
To disable App Check for your iOS client, navigate to the edit view of the iOS client and turn off the Protect your OAuth client from abuse with Firebase App Check toggle button.
Note : after disabling App Check, it can take up to 15 minutes for the changes to take effect.
Дальнейшее чтение
The IETF Best Current Practice OAuth 2.0 for Native Apps establishes many of the best practices documented here.
Implementing Cross-Account Protection
An additional step you should take to protect your users' accounts is implementing Cross-Account Protection by utilizing Google's Cross-Account Protection Service. This service lets you subscribe to security event notifications which provide information to your application about major changes to the user account. You can then use the information to take action depending on how you decide to respond to events.
Some examples of the event types sent to your app by Google's Cross-Account Protection Service are:
-
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
See the Protect user accounts with Cross-Account Protection page for more information on how to implement Cross Account Protection and for the full list of available events.
This document explains how applications installed on devices like phones, tablets, and computers use Google's OAuth 2.0 endpoints to authorize access to Google APIs.
OAuth 2.0 allows users to share specific data with an application while keeping their usernames, passwords, and other information private. For example, an application can use OAuth 2.0 to obtain permission from users to store files in their Google Drives.
Installed apps are distributed to individual devices, and it is assumed that these apps cannot keep secrets. They can access Google APIs while the user is present at the app or when the app is running in the background.
This authorization flow is similar to the one used for web server applications . The main difference is that installed apps must open the system browser and supply a local redirect URI to handle responses from Google's authorization server.
Альтернативы
For mobile apps, you may prefer to use Google Sign-in for Android or iOS . The Google Sign-in client libraries handle authentication and user authorization, and they may be simpler to implement than the lower-level protocol described here.
For apps running on devices that do not support a system browser or that have limited input capabilities, such as TVs, game consoles, cameras, or printers, see OAuth 2.0 for TVs & Devices or Sign-In on TVs and Limited Input Devices .
Libraries and samples
We recommend the following libraries and samples to help you implement the OAuth 2.0 flow described in this document:
- AppAuth for Android library
- AppAuth for iOS library
- OAuth for Apps: Windows Samples
Предварительные условия
Enable APIs for your project
Any application that calls Google APIs needs to enable those APIs in the API Console.
To enable an API for your project:
- Open the API Library в Google API Console.
- If prompted, select a project, or create a new one.
- API Library lists all available APIs, grouped by product family and popularity. If the API you want to enable isn't visible in the list, use search to find it, or click View All in the product family it belongs to.
- Select the API you want to enable, then click the Enable button.
- If prompted, enable billing.
- If prompted, read and accept the API's Terms of Service.
Create authorization credentials
Any application that uses OAuth 2.0 to access Google APIs must have authorization credentials that identify the application to Google's OAuth 2.0 server. The following steps explain how to create credentials for your project. Your applications can then use the credentials to access APIs that you have enabled for that project.
- Go to the Credentials page.
- Click Create credentials > OAuth client ID .
- The following sections describe the client types that Google's authorization server supports. Choose the client type that is recommended for your application, name your OAuth client, and set the other fields in the form as appropriate.
Андроид
- Select the Android application type.
- Enter a name for the OAuth client. This name is displayed on your project's Credentials page to identify the client.
- Enter the package name of your Android app. This value is defined in the
package
attribute of the<manifest>
element in your app manifest file. - Enter the SHA-1 signing certificate fingerprint of the app distribution.
- If your app uses app signing by Google Play , copy the SHA-1 fingerprint from the app signing page of the Play Console.
- If you manage your own keystore and signing keys, use the keytool utility included with Java to print certificate information in a human-readable format. Copy the
SHA1
value in theCertificate fingerprints
section of the keytool output. See Authenticating Your Client in the Google APIs for Android documentation for more information.
- (Optional) Verify ownership of your Android application.
- Нажмите Создать .
iOS
- Select the iOS application type.
- Enter a name for the OAuth client. This name is displayed on your project's Credentials page to identify the client.
- Enter the bundle identifier for your app. The bundle ID is the value of the CFBundleIdentifier key in your app's information property list resource file ( info.plist ). The value is most commonly displayed in the General pane or the Signing & Capabilities pane of the Xcode project editor. The bundle ID is also displayed in the General Information section of the App Information page for the app on Apple's App Store Connect site .
Confirm that you are using the correct bundle ID for your app, as you won't be able to change it if you are using the App Check feature.
- (Необязательный)
Enter your app's App Store ID if the app is published in Apple's App Store. The Store ID is a numeric string included in every Apple App Store URL.
- Open the Apple App Store app on your iOS or iPadOS device.
- Search for your app.
- Select the Share button (square and arrow up symbol).
- Select Copy Link .
- Paste the link into a text editor. The App Store ID is the final part of the URL.
Example:
https://apps.apple.com/app/google/id 284815942
- (Необязательный)
Enter your Team ID. See Locate your Team ID in the Apple Developer Account documentation for more information.
Note: The Team ID field is required if you are enabling App Check for your client. - (Необязательный)
Enable App Check for your iOS app. When you enable App Check, Apple's App Attest service is used to verify that OAuth 2.0 requests originating from your OAuth client are genuine and come from your app. This helps to reduce the risk of app impersonation. Learn more about enabling App Check for your iOS app .
- Нажмите Создать .
UWP
- Select the Universal Windows Platform application type.
- Enter a name for the OAuth client. This name is displayed on your project's Credentials page to identify the client.
- Enter your app's 12-character Microsoft Store ID. You can find this value in Microsoft Partner Center on the App identity page in the App management section.
- Нажмите Создать .
For UWP apps, the custom URI scheme cannot be longer than 39 characters.
Identify access scopes
Scopes enable your application to only request access to the resources that it needs while also enabling users to control the amount of access that they grant to your application. Thus, there may be an inverse relationship between the number of scopes requested and the likelihood of obtaining user consent.
Before you start implementing OAuth 2.0 authorization, we recommend that you identify the scopes that your app will need permission to access.
The OAuth 2.0 API Scopes document contains a full list of scopes that you might use to access Google APIs.
Obtaining OAuth 2.0 access tokens
The following steps show how your application interacts with Google's OAuth 2.0 server to obtain a user's consent to perform an API request on the user's behalf. Your application must have that consent before it can execute a Google API request that requires user authorization.
Step 1: Generate a code verifier and challenge
Google supports the Proof Key for Code Exchange (PKCE) protocol to make the installed app flow more secure. A unique code verifier is created for every authorization request, and its transformed value, called "code_challenge", is sent to the authorization server to obtain the authorization code.
Create the code verifier
A code_verifier
is a high-entropy cryptographic random string using the unreserved characters [AZ] / [az] / [0-9] / "-" / "." / "_" / "~", with a minimum length of 43 characters and a maximum length of 128 characters.
The code verifier should have enough entropy to make it impractical to guess the value.
Create the code challenge
Two methods of creating the code challenge are supported.
Code Challenge Generation Methods | |
---|---|
S256 (recommended) | The code challenge is the Base64URL (with no padding) encoded SHA256 hash of the code verifier.
|
простой | The code challenge is the same value as the code verifier generated above.
|
Step 2: Send a request to Google's OAuth 2.0 server
To obtain user authorization, send a request to Google's authorization server at https://accounts.google.com/o/oauth2/v2/auth
. This endpoint handles active session lookup, authenticates the user, and obtains user consent. The endpoint is only accessible over SSL, and it refuses HTTP (non-SSL) connections.
The authorization server supports the following query string parameters for installed applications:
Параметры | |||||||
---|---|---|---|---|---|---|---|
client_id | Необходимый The client ID for your application. You can find this value in the API ConsoleCredentials page. | ||||||
redirect_uri | Необходимый Determines how Google's authorization server sends a response to your app. There are several redirect options available to installed apps, and you will have set up your authorization credentials with a particular redirect method in mind. The value must exactly match one of the authorized redirect URIs for the OAuth 2.0 client, which you configured in your client's API ConsoleCredentials page. If this value doesn't match an authorized URI, you will get a The table below shows the appropriate
| ||||||
response_type | Необходимый Determines whether the Google OAuth 2.0 endpoint returns an authorization code. Set the parameter value to | ||||||
scope | Необходимый A space-delimited list of scopes that identify the resources that your application could access on the user's behalf. These values inform the consent screen that Google displays to the user. Scopes enable your application to only request access to the resources that it needs while also enabling users to control the amount of access that they grant to your application. Thus, there is an inverse relationship between the number of scopes requested and the likelihood of obtaining user consent. | ||||||
code_challenge | Рекомендуется Specifies an encoded | ||||||
code_challenge_method | Рекомендуется Specifies what method was used to encode a | ||||||
state | Рекомендуется Specifies any string value that your application uses to maintain state between your authorization request and the authorization server's response. The server returns the exact value that you send as a You can use this parameter for several purposes, such as directing the user to the correct resource in your application, sending nonces, and mitigating cross-site request forgery. Since your | ||||||
login_hint | Необязательный If your application knows which user is trying to authenticate, it can use this parameter to provide a hint to the Google Authentication Server. The server uses the hint to simplify the login flow either by prefilling the email field in the sign-in form or by selecting the appropriate multi-login session. Set the parameter value to an email address or |
Sample authorization URLs
The tabs below show sample authorization URLs for the different redirect URI options.
The URLs are identical except for the value of the redirect_uri
parameter. The URLs also contain the required response_type
and client_id
parameters as well as the optional state
parameter. Each URL contains line breaks and spaces for readability.
Custom URI scheme
https://accounts.google.com/o/oauth2/v2/auth? scope=email%20profile& response_type=code& state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken& redirect_uri=com.example.app%3A/oauth2redirect& client_id=client_id
Loopback IP address
https://accounts.google.com/o/oauth2/v2/auth? scope=email%20profile& response_type=code& state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken& redirect_uri=http%3A//127.0.0.1%3A9004& client_id=client_id
Step 3: Google prompts user for consent
In this step, the user decides whether to grant your application the requested access. At this stage, Google displays a consent window that shows the name of your application and the Google API services that it is requesting permission to access with the user's authorization credentials and a summary of the scopes of access to be granted. The user can then consent to grant access to one or more scopes requested by your application or refuse the request.
Your application doesn't need to do anything at this stage as it waits for the response from Google's OAuth 2.0 server indicating whether any access was granted. That response is explained in the following step.
Ошибки
Requests to Google's OAuth 2.0 authorization endpoint may display user-facing error messages instead of the expected authentication and authorization flows. Common error codes and suggested resolutions are listed below.
admin_policy_enforced
The Google Account is unable to authorize one or more scopes requested due to the policies of their Google Workspace administrator. See the Google Workspace Admin help article Control which third-party & internal apps access Google Workspace data for more information about how an administrator may restrict access to all scopes or sensitive and restricted scopes until access is explicitly granted to your OAuth client ID.
disallowed_useragent
The authorization endpoint is displayed inside an embedded user-agent disallowed by Google's OAuth 2.0 Policies .
Андроид
Android developers may encounter this error message when opening authorization requests inandroid.webkit.WebView
. Developers should instead use Android libraries such as Google Sign-In for Android or OpenID Foundation's AppAuth for Android .
Web developers may encounter this error when an Android app opens a general web link in an embedded user-agent and a user navigates to Google's OAuth 2.0 authorization endpoint from your site. Developers should allow general links to open in the default link handler of the operating system, which includes both Android App Links handlers or the default browser app. The Android Custom Tabs library is also a supported option.
iOS
iOS and macOS developers may encounter this error when opening authorization requests inWKWebView
. Developers should instead use iOS libraries such as Google Sign-In for iOS or OpenID Foundation's AppAuth for iOS .
Web developers may encounter this error when an iOS or macOS app opens a general web link in an embedded user-agent and a user navigates to Google's OAuth 2.0 authorization endpoint from your site. Developers should allow general links to open in the default link handler of the operating system, which includes both Universal Links handlers or the default browser app. TheSFSafariViewController
library is also a supported option.
org_internal
The OAuth client ID in the request is part of a project limiting access to Google Accounts in a specific Google Cloud Organization . For more information about this configuration option see the User type section in the Setting up your OAuth consent screen help article.
invalid_grant
If you are using a code verifier and challenge , the code_callenge
parameter is invalid or missing. Ensure that the code_challenge
parameter is set correctly.
When refreshing an access token , the token may have expired or has beeninvalidated. Authenticate the user again and ask for user consent to obtain new tokens. If you are continuing to see this error, ensure that your application has been configured correctly and that you are using the correct tokens and parameters in your request. Otherwise, the user account may have been deleted or disabled.
redirect_uri_mismatch
The redirect_uri
passed in the authorization request does not match an authorized redirect URI for the OAuth client ID. Review authorized redirect URIs in the Google API Console Credentials page.
The passed redirect_uri
may be invalid for the client type.
The redirect_uri
parameter may refer to the OAuth out-of-band (OOB) flow that has been deprecated and is no longer supported. Refer to the migration guide to update your integration.
invalid_request
There was something wrong with the request you made. This could be due to a number of reasons:
- The request was not properly formatted
- The request was missing required parameters
- The request uses an authorization method that Google doesn't support. Verify your OAuth integration uses a recommended integration method
- A custom scheme is used for the redirect uri : If you see the error message Custom URI scheme is not supported on Chrome apps or Custom URI scheme is not enabled for your Android client , it means you are using a custom URI scheme which isn't supported on Chrome apps and is disabled by default on Android. Learn more about custom URI scheme alternatives
Step 4: Handle the OAuth 2.0 server response
The manner in which your application receives the authorization response depends on the redirect URI scheme that it uses. Regardless of the scheme, the response will either contain an authorization code ( code
) or an error ( error
). For example, error=access_denied
indicates that the user declined the request.
If the user grants access to your application, you can exchange the authorization code for an access token and a refresh token as described in the next step.
Step 5: Exchange authorization code for refresh and access tokens
To exchange an authorization code for an access token, call the https://oauth2.googleapis.com/token
endpoint and set the following parameters:
Поля | |
---|---|
client_id | The client ID obtained from the API ConsoleCredentials page. |
client_secret | The client secret obtained from the API ConsoleCredentials page. |
code | The authorization code returned from the initial request. |
code_verifier | The code verifier you created in Step 1 . |
grant_type | As defined in the OAuth 2.0 specification , this field's value must be set to authorization_code . |
redirect_uri | One of the redirect URIs listed for your project in the API ConsoleCredentials page for the given client_id . |
The following snippet shows a sample request:
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7& client_id=your_client_id& client_secret=your_client_secret& redirect_uri=http://127.0.0.1:9004& grant_type=authorization_code
Google responds to this request by returning a JSON object that contains a short-lived access token and a refresh token.
The response contains the following fields:
Поля | |
---|---|
access_token | The token that your application sends to authorize a Google API request. |
expires_in | The remaining lifetime of the access token in seconds. |
id_token | Note: This property is only returned if your request included an identity scope, such as openid , profile , or email . The value is a JSON Web Token (JWT) that contains digitally signed identity information about the user. |
refresh_token | A token that you can use to obtain a new access token. Refresh tokens are valid until the user revokes access. Note that refresh tokens are always returned for installed applications. |
scope | The scopes of access granted by the access_token expressed as a list of space-delimited, case-sensitive strings. |
token_type | The type of token returned. At this time, this field's value is always set to Bearer . |
The following snippet shows a sample response:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "token_type": "Bearer", "scope": "https://www.googleapis.com/auth/drive.metadata.readonly", "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" }
Calling Google APIs
After your application obtains an access token, you can use the token to make calls to a Google API on behalf of a given user account if the scope(s) of access required by the API have been granted. To do this, include the access token in a request to the API by including either an access_token
query parameter or an Authorization
HTTP header Bearer
value. When possible, the HTTP header is preferable, because query strings tend to be visible in server logs. In most cases you can use a client library to set up your calls to Google APIs (for example, when calling the Drive Files API ).
You can try out all the Google APIs and view their scopes at the OAuth 2.0 Playground .
HTTP GET examples
A call to the drive.files
endpoint (the Drive Files API) using the Authorization: Bearer
HTTP header might look like the following. Note that you need to specify your own access token:
GET /drive/v2/files HTTP/1.1 Host: www.googleapis.com Authorization: Bearer access_token
Here is a call to the same API for the authenticated user using the access_token
query string parameter:
GET https://www.googleapis.com/drive/v2/files?access_token=access_token
curl
examples
You can test these commands with the curl
command-line application. Here's an example that uses the HTTP header option (preferred):
curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files
Or, alternatively, the query string parameter option:
curl https://www.googleapis.com/drive/v2/files?access_token=access_token
Refreshing an access token
Access tokens periodically expire and become invalid credentials for a related API request. You can refresh an access token without prompting the user for permission (including when the user is not present) if you requested offline access to the scopes associated with the token.
To refresh an access token, your application sends an HTTPS POST
request to Google's authorization server ( https://oauth2.googleapis.com/token
) that includes the following parameters:
Поля | |
---|---|
client_id | The client ID obtained from the API Console. |
client_secret | The client secret obtained from the API Console. (The client_secret is not applicable to requests from clients registered as Android, iOS, or Chrome applications.) |
grant_type | As defined in the OAuth 2.0 specification , this field's value must be set to refresh_token . |
refresh_token | The refresh token returned from the authorization code exchange. |
The following snippet shows a sample request:
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
As long as the user has not revoked the access granted to the application, the token server returns a JSON object that contains a new access token. The following snippet shows a sample response:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "scope": "https://www.googleapis.com/auth/drive.metadata.readonly", "token_type": "Bearer" }
Note that there are limits on the number of refresh tokens that will be issued; one limit per client/user combination, and another per user across all clients. You should save refresh tokens in long-term storage and continue to use them as long as they remain valid. If your application requests too many refresh tokens, it may run into these limits, in which case older refresh tokens will stop working.
Revoking a token
In some cases a user may wish to revoke access given to an application. A user can revoke access by visiting Account Settings . See the Remove site or app access section of the Third-party sites & apps with access to your account support document for more information.
It is also possible for an application to programmatically revoke the access given to it. Programmatic revocation is important in instances where a user unsubscribes, removes an application, or the API resources required by an app have significantly changed. In other words, part of the removal process can include an API request to ensure the permissions previously granted to the application are removed.
To programmatically revoke a token, your application makes a request to https://oauth2.googleapis.com/revoke
and includes the token as a parameter:
curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \ https://oauth2.googleapis.com/revoke?token={token}
The token can be an access token or a refresh token. If the token is an access token and it has a corresponding refresh token, the refresh token will also be revoked.
If the revocation is successfully processed, then the HTTP status code of the response is 200
. For error conditions, an HTTP status code 400
is returned along with an error code.
App redirect methods
Custom URI scheme (Android, iOS, UWP)
Custom URI schemes are a form of deeplinking that use a custom-defined scheme to open your app.
Alternative to using custom URI schemes on Android
Use the Google Sign-In for Android SDK which delivers the OAuth 2.0 response directly to your app, eliminating the need for a redirect URI.
How to migrate to the Google Sign-In for Android SDK
If you use a custom scheme for your OAuth integration on Android, you would need to complete the following actions to fully migrate to using the recommended Google Sign-In for Android SDK:
- Update your code to use the Google Sign-In SDK.
- Disable support for custom scheme in the Google API Console.
Follow the below steps to migrate to the Google Sign-In Android SDK:
- Update your code to use the Google Sign-In Android SDK:
- Examine your code to identify where you are sending a request to Google's OAuth 2.0 server ; if using a custom scheme, your request would look like the below:
https://accounts.google.com/o/oauth2/v2/auth? scope=<SCOPES>& response_type=code& &state=<STATE>& redirect_uri=com.example.app:/oauth2redirect& client_id=<CLIENT_ID>
com.example.app:/oauth2redirect
is the custom scheme redirect URI in the above example. See theredirect_uri
parameter definition for more details about the format of the custom URI scheme value. - Make note of the
scope
andclient_id
request parameters which you would need to configure the Google Sign-In SDK. - Follow the Start Integrating Google Sign-In into Your Android App instructions to set up the SDK. You can skip the Get your backend server's OAuth 2.0 client ID step as you would re-use the
client_id
you retrieved from the previous step. - Follow the Enabling Server-Side API access instructions. This includes the following steps:
- Use the
getServerAuthCode
method to retrieve an auth code for the scopes you are requesting permission for. - Send the auth code to your app's backend to exchange it for an access & refresh token.
- Use the retrieved access token to make calls to Google APIs on behalf of the user.
- Use the
- Examine your code to identify where you are sending a request to Google's OAuth 2.0 server ; if using a custom scheme, your request would look like the below:
- Disable support for custom scheme in the Google API Console:
- Go to your OAuth 2.0 credentials list and select your Android client.
- Navigate to the Advanced Settings section, uncheck the Enable Custom URI Scheme checkbox, and click Save to disable custom URI scheme support.
Enable custom URI scheme
If the recommended alternative does not work for you, you can enable custom URI schemes for your Android client by following the below instructions:- Go to your OAuth 2.0 credentials list and select your Android client.
- Navigate to the Advanced Settings section, check the Enable Custom URI Scheme checkbox, and click Save to enable custom URI scheme support.
Alternative to using custom URI schemes on Chrome apps
Use the Chrome Identity API which delivers the OAuth 2.0 response directly to your app, eliminating the need for a redirect URI.
Loopback IP address (macOS, Linux, Windows desktop)
To receive the authorization code using this URL, your application must be listening on the local web server. That is possible on many, but not all, platforms. However, if your platform supports it, this is the recommended mechanism for obtaining the authorization code.
When your app receives the authorization response, for best usability it should respond by displaying an HTML page that instructs the user to close the browser and return to your app.
Рекомендуемое использование | macOS, Linux, and Windows desktop (but not Universal Windows Platform) apps |
Form values | Set the application type to Desktop app . |
Manual copy/paste (Deprecated)
Protect your apps
Verify app ownership (Android, Chrome)
You can verify ownership of your application to reduce the risk of app impersonation.
Андроид
To complete the verification process, you can use your Google Play Developer Account if you have one and your app is registered on the Google Play Console . The following requirements must be met for a successful verification:
- You must have a registered application in the Google Play Console with the same package name and SHA-1 signing certificate fingerprint as the Android OAuth client you are completing the verification for.
- You must have Admin permission for the app in the Google Play Console. Learn more about access management in the Google Play Console.
In the Verify App Ownership section of the Android client, click the Verify Ownership button to complete the verification process.
If the verification is successful, a notification will be displayed to confirm the success of the verification process. Otherwise, an error prompt will be shown.
To fix a failed verification, try the following:
- Make sure the app you are verifying is a registered app in the Google Play Console.
- Make sure you have Admin permission for the app in the Google Play Console.
Хром
To complete the verification process, you would use your Chrome Web Store Developer account. The following requirements must be met for a successful verification:
- You must have a registered item in the Chrome Web Store Developer Dashboard with the same item ID as the Chrome Extension OAuth client you are completing the verification for.
- You must be a publisher for the Chrome Web Store item. Learn more about access management in the Chrome Web Store Developer Dashboard.
In the Verify App Ownership section of the Chrome Extension client, click the Verify Ownership button to complete the verification process.
Note: Wait a few minutes before completing the verification process after granting access to your account.
If the verification is successful, a notification will be displayed to confirm the success of the verification process. Otherwise, an error prompt will be shown.
To fix a failed verification, try the following:
- Make sure there is a registered item in the Chrome Web Store Developer Dashboard with the same item ID as the Chrome Extension OAuth client you are completing the verification for.
- Make sure you are a publisher for the app, that is, you must either be the individual publisher of the app or a member of the group publisher of the app. Learn more about access management in the Chrome Web Store Developer Dashboard.
- If you just updated your group publisher list, verify that the group publisher membership list is synced in the Chrome Web Store Developer Dashboard. Learn more about syncing your publisher membership list.
App Check (iOS only)
The App Check feature helps safeguard your iOS applications from unauthorized usage by using Apple's App Attest service to verify that requests made to Google OAuth 2.0 endpoints originate from your authentic applications. This helps to reduce the risk of app impersonation.
Enable App Check for your iOS Client
The following requirements must be met to successfully enable App Check for your iOS client:- You must specify a team ID for your iOS client.
- You must not use a wildcard in your bundle ID since it can resolve to more than one app. This means that the bundle ID must not include the asterisk (*) symbol.
After enabling App Check, you will start seeing metrics related to OAuth requests from your client in the edit view of the OAuth client. Requests from unverified sources won't be blocked until you enforce App Check . The information in the metrics monitoring page can help you determine when to start enforcement.
You might see errors related to the App Check feature when enabling App Check for your iOS app. To fix these errors, try the following:
- Verify that the bundle ID and team ID you specified are valid.
- Verify that you are not using a wildcard for the bundle ID.
Enforce App Check for your iOS Client
Enabling App Check for your app does not automatically block unrecognized requests. To enforce this protection, go to the edit view of your iOS client. There, you will see App Check metrics to the right of the page under the Google Identity for iOS section. The metrics include the following information:- Number of verified requests - requests that have a valid App Check token. After you enable App Check enforcement, only requests in this category will succeed.
- Number of unverified requests: likely outdated client requests - requests missing an App Check token; these request may be from an older version of your app that doesn't include an App Check implementation.
- Number of unverified requests: unknown origin requests - requests missing an App Check token that don't look like they are coming from your app.
- Number of unverified requests: invalid requests - requests with an invalid App Check token, which may be from an inauthentic client attempting to impersonate your app, or from emulated environments.
To enforce App Check, click the ENFORCE button and confirm your choice. Once enforcement is active, all unverified requests from your client will be rejected.
Note : after you enable enforcement, it can take up to 15 minutes for the changes to take effect.
Unenforce App Check for your iOS Client
Unenforcing App Check for your app will stop enforcement and will allow all requests from your client to Google OAuth 2.0 endpoints, including unverified requests.
To unenforce App Check for your iOS client, navigate to the edit view of the iOS client and click the UNENFORCE button and confirm your choice.
Note : after unenforcing App Check, it can take up to 15 minutes for the changes to take effect.
Disable App Check for your iOS Client
Disabling App Check for your app will stop all App Check monitoring and enforcement . Consider unenforcing App Check instead so you can continue monitoring metrics for your client.
To disable App Check for your iOS client, navigate to the edit view of the iOS client and turn off the Protect your OAuth client from abuse with Firebase App Check toggle button.
Note : after disabling App Check, it can take up to 15 minutes for the changes to take effect.
Дальнейшее чтение
The IETF Best Current Practice OAuth 2.0 for Native Apps establishes many of the best practices documented here.
Implementing Cross-Account Protection
An additional step you should take to protect your users' accounts is implementing Cross-Account Protection by utilizing Google's Cross-Account Protection Service. This service lets you subscribe to security event notifications which provide information to your application about major changes to the user account. You can then use the information to take action depending on how you decide to respond to events.
Some examples of the event types sent to your app by Google's Cross-Account Protection Service are:
-
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
See the Protect user accounts with Cross-Account Protection page for more information on how to implement Cross Account Protection and for the full list of available events.