Обзор
16 февраля 2022 года мы объявили о планах сделать взаимодействие Google OAuth более безопасным за счет использования более безопасных потоков OAuth. Это руководство поможет вам понять необходимые изменения и шаги для успешного перехода от внеполосного потока OAuth (OOB) к поддерживаемым альтернативам.
Эта мера является защитной мерой против фишинга и атак, выдающих себя за другое приложение, во время взаимодействия с конечными точками авторизации Google OAuth 2.0.
Что такое ООБ?
Внеполосный OAuth (OOB) , также называемый опцией копирования и вставки вручную, представляет собой устаревший процесс, разработанный для поддержки собственных клиентов, у которых нет URI перенаправления для принятия учетных данных после того, как пользователь одобрит запрос на согласие OAuth. Поток OOB представляет собой риск удаленного фишинга, и клиентам необходимо перейти на альтернативный метод защиты от этой уязвимости.Поток OOB устарел для всех типов клиентов, например веб-приложений, Android, iOS, универсальной платформы Windows (UWP), приложений Chrome, телевизоров и устройств с ограниченным вводом данных, настольных приложений.
Ключевые даты соответствия
- 28 февраля 2022 г. — новое использование OAuth заблокировано для потока OOB.
- 5 сентября 2022 г. — при несовместимых запросах OAuth может отображаться предупреждающее сообщение для пользователя.
- 3 октября 2022 г. — поток OOB устарел для клиентов OAuth, созданных до 28 февраля 2022 г.
- 31 января 2023 г. — заблокированы все существующие клиенты (включая освобожденных клиентов)
Для несоответствующих запросов будет отображаться сообщение об ошибке для пользователя. Сообщение будет сообщать пользователям о том, что приложение заблокировано, при этом отображается адрес электронной почты службы поддержки, который вы зарегистрировали на экране согласия OAuth в консоли Google API .
- Определите, затронуты ли вы.
- Если это затронуло вас, перейдите на более безопасную альтернативу.
Определите, затронуты ли вы
Это прекращение поддержки применимо только к рабочим приложениям (т. е. приложениям со статусом публикации, установленным как «В производстве» . Поток будет продолжать работать для приложений со статусом публикации «Тестирование» ).
Проверьте свой статус публикации в OAuth. Consent Screen pageпринадлежащий Google API Console и перейдите к следующему шагу, если вы используете поток OOB в проекте со статусом публикации «В производстве».
Как определить, использует ли ваше приложение поток OOB
Проверьте код вашего приложения или исходящий сетевой вызов (если ваше приложение использует библиотеку OAuth), чтобы определить, использует ли запрос авторизации Google OAuth, который делает ваше приложение, значение URI перенаправления OOB.
Проверьте код вашего приложения
redirect_uri
какое-либо из следующих значений:-
redirect_uri=urn:ietf:wg:oauth:2.0:oob
-
redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
-
redirect_uri=oob
https://accounts.google.com/o/oauth2/v2/auth? response_type=code& scope=<SCOPES>& state=<STATE>& redirect_uri=urn:ietf:wg:oauth:2.0:oob& client_id=<CLIENT_ID>
Проверка исходящего сетевого вызова
- Веб-приложение – проверка сетевой активности в Chrome
- Android : проверка сетевого трафика с помощью Network Inspector
- Приложения Chrome
- Перейдите на страницу расширений Chrome.
- Установите флажок «Режим разработчика» в правом верхнем углу страницы расширения.
- Выберите расширение, которое вы хотите отслеживать.
- Нажмите на ссылку фоновой страницы в разделе «Проверка представлений» на странице расширения.
- Откроется всплывающее окно «Инструменты разработчика» , где вы сможете отслеживать сетевой трафик на вкладке «Сеть».
- iOS – анализ HTTP-трафика с помощью инструментов
- Универсальная платформа Windows (UWP) — проверка сетевого трафика в Visual Studio
- Приложения для ПК – используйте инструмент захвата сети, доступный для операционной системы, для которой было разработано приложение.
redirect_uri
какое-либо из следующих значений:-
redirect_uri=urn:ietf:wg:oauth:2.0:oob
-
redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
-
redirect_uri=oob
https://accounts.google.com/o/oauth2/v2/auth? response_type=code& scope=<SCOPES>& state=<STATE>& redirect_uri=urn:ietf:wg:oauth:2.0:oob& client_id=<CLIENT_ID>
Переход на безопасную альтернативу
Мобильные клиенты (Android/iOS)
Если вы определите, что ваше приложение использует поток OOB с типом клиента OAuth для Android или iOS, вам следует перейти на использование наших мобильных SDK для входа в Google ( Android , iOS ).
SDK упрощает доступ к API Google и обрабатывает все вызовы к конечным точкам авторизации Google OAuth 2.0.
Ссылки на документацию ниже предоставляют информацию о том, как использовать SDK для входа в Google для доступа к API Google без использования URI перенаправления OOB.
Доступ к API Google на Android
Доступ на стороне сервера (офлайн)
В примере ниже показано, как получить доступ к API Google на стороне сервера на Android .Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); try { GoogleSignInAccount account = task.getResult(ApiException.class); // request a one-time authorization code that your server exchanges for an // access token and sometimes refresh token String authCode = account.getServerAuthCode(); // Show signed-in UI updateUI(account); // TODO(developer): send code to server and exchange for access/refresh/ID tokens } catch (ApiException e) { Log.w(TAG, "Sign-in failed", e); updateUI(null); }
Ознакомьтесь с руководством по доступу на стороне сервера, чтобы узнать, как получить доступ к API Google со стороны сервера.
Доступ к API Google в приложении iOS
Доступ на стороне клиента
В примере ниже показано, как получить доступ к API Google на стороне клиента в iOS .
user.authentication.do { authentication, error in guard error == nil else { return } guard let authentication = authentication else { return } // Get the access token to attach it to a REST or gRPC request. let accessToken = authentication.accessToken // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for // use with GTMAppAuth and the Google APIs client library. let authorizer = authentication.fetcherAuthorizer() }
Используйте токен доступа для вызова API, включив токен доступа в заголовок запроса REST или gRPC ( Authorization: Bearer ACCESS_TOKEN
) или используя авторизатор выборки ( GTMFetcherAuthorizationProtocol
) с клиентской библиотекой API Google для Objective-C. для ОТДЫХА .
Ознакомьтесь с руководством по доступу на стороне клиента , чтобы узнать, как получить доступ к API Google на стороне клиента. о том, как получить доступ к API Google на стороне клиента.
Доступ на стороне сервера (офлайн)
В примере ниже показано, как получить доступ к API Google на стороне сервера для поддержки клиента iOS.GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: self) { user, error in guard error == nil else { return } guard let user = user else { return } // request a one-time authorization code that your server exchanges for // an access token and refresh token let authCode = user.serverAuthCode }
Ознакомьтесь с руководством по доступу на стороне сервера, чтобы узнать, как получить доступ к API Google со стороны сервера.
Клиент приложения Chrome
Если вы определите, что ваше приложение использует поток OOB в клиенте приложения Chrome, вам следует перейти на использование Chrome Identity API .
В приведенном ниже примере показано, как получить все контакты пользователей без использования URI перенаправления OOB.
window.onload = function() { document.querySelector('button').addEventListener('click', function() { // retrieve access token chrome.identity.getAuthToken({interactive: true}, function(token) { // .......... // the example below shows how to use a retrieved access token with an appropriate scope // to call the Google People API contactGroups.get endpoint fetch( 'https://people.googleapis.com/v1/contactGroups/all?maxMembers=20&key=API_KEY', init) .then((response) => response.json()) .then(function(data) { console.log(data) }); }); }); };
Ознакомьтесь с руководством Chrome Identity API для получения дополнительной информации о том, как получить доступ к аутентификации пользователей и вызывать конечные точки Google с помощью Chrome Identity API.
Веб-приложение
Если вы определите, что ваше приложение использует поток OOB для веб-приложения, вам следует перейти на использование одной из наших клиентских библиотек Google API. Здесь перечислены клиентские библиотеки для разных языков программирования.
Библиотеки упрощают доступ к API Google и обрабатывают все вызовы к конечным точкам Google.
Доступ на стороне сервера (офлайн)
- Поднимите сервер и определите общедоступную конечную точку (URI перенаправления) для получения кода авторизации.
- Настройте URI перенаправления в Credentials page принадлежащий Google API Console
В приведенном ниже фрагменте кода показан пример NodeJS использования API Google Диска для вывода списка файлов Google Диска пользователя на стороне сервера без использования URI перенаправления OOB.
async function main() { const server = http.createServer(async function (req, res) { if (req.url.startsWith('/oauth2callback')) { let q = url.parse(req.url, true).query; if (q.error) { console.log('Error:' + q.error); } else { // Get access and refresh tokens (if access_type is offline) let { tokens } = await oauth2Client.getToken(q.code); oauth2Client.setCredentials(tokens); // Example of using Google Drive API to list filenames in user's Drive. const drive = google.drive('v3'); drive.files.list({ auth: oauth2Client, pageSize: 10, fields: 'nextPageToken, files(id, name)', }, (err1, res1) => { // TODO(developer): Handle response / error. }); } } }
Ознакомьтесь с руководством по веб-приложениям на стороне сервера , чтобы узнать, как получить доступ к API Google со стороны сервера.
Клиентский доступ
В приведенном ниже фрагменте кода на JavaScript показан пример использования API Google для доступа к событиям календаря пользователя на стороне клиента.
// initTokenClient() initializes a new token client with your // web app's client ID and the scope you need access to const client = google.accounts.oauth2.initTokenClient({ client_id: 'YOUR_GOOGLE_CLIENT_ID', scope: 'https://www.googleapis.com/auth/calendar.readonly', // callback function to handle the token response callback: (tokenResponse) => { if (tokenResponse && tokenResponse.access_token) { gapi.client.setApiKey('YOUR_API_KEY'); gapi.client.load('calendar', 'v3', listUpcomingEvents); } }, }); function listUpcomingEvents() { gapi.client.calendar.events.list(...); }
Ознакомьтесь с руководством по клиентскому веб-приложению , чтобы узнать, как получить доступ к API Google со стороны клиента.
Настольный клиент
Если вы определите, что ваше приложение использует поток OOB в клиенте для настольных компьютеров, вам следует перейти на использование потока IP-адреса обратной связи ( localhost
или 127.0.0.1
) .