Руководство по миграции потока IP-адресов с обратной связью

Обзор

16 февраля 2022 года мы объявили о планах сделать взаимодействие Google OAuth более безопасным за счет использования более безопасных потоков OAuth. Это руководство поможет вам понять необходимые изменения и шаги для успешного перехода от потока IP-адресов обратной связи к поддерживаемым альтернативам.

Эта мера является защитной мерой против фишинга и атак, выдающих себя за другое приложение, во время взаимодействия с конечными точками авторизации Google OAuth 2.0.

Что такое поток IP-адреса обратной связи?

Поток IP-адреса обратной связи поддерживает использование IP-адреса обратной связи или localhost в качестве компонента узла URI перенаправления, куда отправляются учетные данные после того, как пользователь одобрит запрос согласия OAuth. Этот поток уязвим для атак «человек посередине» , когда злонамеренное приложение, обращаясь к одному и тому же интерфейсу обратной связи в некоторых операционных системах, может перехватить ответ сервера авторизации на заданный URI перенаправления и получить доступ к коду авторизации.

Поток IP-адресов обратной связи устарел для собственных типов клиентов OAuth iOS, Android и Chrome, но будет продолжать поддерживаться в настольных приложениях.

Ключевые даты соответствия

  • 14 марта 2022 г. — новым клиентам OAuth запрещено использовать поток IP-адресов Loopback.
  • 1 августа 2022 г. — при несовместимых запросах OAuth может отображаться предупреждающее сообщение для пользователя.
  • 31 августа 2022 г. — поток IP-адресов Loopback заблокирован для собственных клиентов OAuth для Android, приложений Chrome и iOS, созданных до 14 марта 2022 г.
  • 21 октября 2022 г. — заблокированы все существующие клиенты (включая освобожденных клиентов)

Для несоответствующих запросов будет отображаться сообщение об ошибке для пользователя. Сообщение будет сообщать пользователям о том, что приложение заблокировано, при этом отображается адрес электронной почты службы поддержки, который вы зарегистрировали на экране согласия OAuth в консоли Google API .

Чтобы пройти процесс миграции, необходимо выполнить два основных шага:
  1. Определите, затронуты ли вы.
  2. Если это вас затронет, перейдите на поддерживаемую альтернативу.

Определите, затронуты ли вы

Проверьте тип идентификатора клиента OAuth.

Перейдите к Credentials page в Google API Console и просмотрите тип идентификатора клиента OAuth в разделе «Идентификаторы клиента OAuth 2.0» . Это может быть любое из следующих приложений: веб-приложение , Android , iOS , универсальная платформа Windows (UWP) , приложение Chrome , телевизоры и устройства ограниченного ввода , настольное приложение .

Перейдите к следующему шагу, если тип вашего клиента — Android, приложение Chrome или iOS и вы используете поток IP-адресов обратной связи.

Вам не нужно делать ничего, связанного с прекращением поддержки, если вы используете поток IP-адресов обратной связи на клиенте OAuth приложения для настольных компьютеров, поскольку использование этого типа клиента OAuth будет по-прежнему поддерживаться.

Как определить, использует ли ваше приложение поток IP-адресов обратной связи

Проверьте код вашего приложения или исходящий сетевой вызов (если ваше приложение использует библиотеку OAuth), чтобы определить, использует ли запрос авторизации Google OAuth, который делает ваше приложение, значения URI перенаправления обратной связи.

Проверьте код вашего приложения

Просмотрите раздел кода вашего приложения, в котором вы выполняете вызовы к конечным точкам авторизации Google OAuth, и определите, имеет ли параметр redirect_uri какое-либо из следующих значений:
  • redirect_uri=http://127.0.0.1: <port> например, redirect_uri=http://127.0.0.1: 3000
  • redirect_uri=http://[::1]: <port> например, redirect_uri=http://[::1]: 3000
  • redirect_uri=http://localhost: <port> например redirect_uri=http://localhost: 3000
Пример запроса на перенаправление IP-адреса с обратной связью будет выглядеть следующим образом:
https://accounts.google.com/o/oauth2/v2/auth?
redirect_uri=http://localhost:3000&
response_type=code&
scope=<SCOPES>&
state=<STATE>&
client_id=<CLIENT_ID>

Проверка исходящего сетевого вызова

Метод проверки сетевых вызовов будет зависеть от типа клиента вашего приложения.
При проверке сетевых вызовов найдите запросы, отправленные на конечные точки авторизации Google OAuth, и определите, имеет ли параметр redirect_uri какое-либо из следующих значений:
  • redirect_uri=http://127.0.0.1: <port> например, redirect_uri=http://127.0.0.1: 3000
  • redirect_uri=http://[::1]: <port> например, redirect_uri=http://[::1]: 3000
  • redirect_uri=http://localhost: <port> например redirect_uri=http://localhost: 3000
Пример запроса на перенаправление IP-адреса с обратной связью будет выглядеть следующим образом:
https://accounts.google.com/o/oauth2/v2/auth?
redirect_uri=http://localhost:3000&
response_type=code&
scope=<SCOPES>&
state=<STATE>&
client_id=<CLIENT_ID>

Перейти на поддерживаемую альтернативу

Мобильные клиенты (Android/iOS)

Если вы определите, что ваше приложение использует поток IP-адресов обратной связи с типом клиента OAuth для Android или iOS, вам следует перейти на использование наших мобильных SDK для входа в Google ( Android , iOS ).

SDK упрощает доступ к API Google и обрабатывает все вызовы к конечным точкам авторизации Google OAuth 2.0.

Ссылки на документацию ниже предоставляют информацию о том, как использовать SDK для входа в Google для доступа к API Google без использования URI перенаправления IP-адреса обратной связи.

Доступ к 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

Если вы определите, что ваше приложение использует поток IP-адресов обратной связи в клиенте приложения Chrome, вам следует перейти на использование Chrome Identity API .

В приведенном ниже примере показано, как получить все контакты пользователя без использования URI перенаправления IP-адреса обратной связи.

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.