Przewodnik migracji przepływu adresu IP sprzężenia zwrotnego

Omówienie

16 lutego 2022 r. ogłosiliśmy, że zamierzamy zwiększyć bezpieczeństwo interakcji z protokołem OAuth Google, stosując bezpieczniejsze przepływy OAuth. Z tego przewodnika dowiesz się, jakie zmiany należy wprowadzić i co zrobić, aby przejść z obsługi adresów IP pętli zwrotnej na obsługiwane alternatywy.

Jest to środek zapobiegający phishingowi i atakom polegającym na podszywanie się pod aplikację podczas interakcji z punktami końcowymi autoryzacji OAuth 2.0 Google.

Jak wygląda proces tworzenia adresu IP loopback?

Przepływ adresu IP pętli zwrotnej obsługuje używanie adresu IP pętli zwrotnej lub localhost jako elementu hosta adresu URI przekierowania, do którego wysyłane są dane logowania po zaakceptowaniu przez użytkownika żądania zgody OAuth. Ten proces jest podatny na ataki typu man in the middle, w których złośliwa aplikacja korzystająca z tego samego interfejsu pętli w niektórych systemach operacyjnych może przechwycić odpowiedź serwera autoryzacji na dany adres URI przekierowania i uzyskać dostęp do kodu autoryzacji.

Procedura adresu IP sprzężenia zwrotnego jest wycofywana w przypadku klientów OAuth w natywnych aplikacjach na iOS, Androida i Chrome, ale nadal będzie obsługiwana w aplikacjach na komputery.

Ważne daty dotyczące zgodności

  • 14 marca 2022 r. – nowi klienci OAuth nie mogą już używać adresów loopback do przesyłania żądań OAuth.
  • 1 sierpnia 2022 r. – w przypadku żądań OAuth niezgodnych z zasadami może być wyświetlany użytkownikowi komunikat z ostrzeżeniem.
  • 31 sierpnia 2022 r. – blokowanie przepływu adresów IP sprzężenia zwrotnego w przypadku klientów OAuth w natywnej aplikacji na Androida, Chrome i iOS utworzonych przed 14 marca 2022 r.
  • 21 października 2022 r. – zablokowanie wszystkich dotychczasowych klientów (w tym tych z wyjątkiem)

W przypadku żądań niezgodnych z tymi zasadami wyświetlany będzie komunikat o błędzie dla użytkownika. Wiadomość będzie informować użytkowników, że aplikacja jest zablokowana, a e-mail pomocy będzie wyświetlany z adresu e-mail, który został zarejestrowany na ekranie zgody OAuth w Konsoli interfejsów API Google.

Aby przeprowadzić migrację, musisz wykonać 2 główne czynności:
  1. Sprawdź, czy dotyczy Cię ten problem.
  2. Przejdź na obsługiwaną metodę alternatywną, jeśli dotyczy Cię ten problem.

Sprawdź, czy dotyczy Cię ta zmiana

Sprawdź typ identyfikatora klienta OAuth

Otwórz i sprawdź typ identyfikatora klienta OAuth w sekcji Identyfikatory klienta OAuth 2.0. Może to być: aplikacja internetowa, Android, iOS, platforma Universal Windows Platform (UWP), aplikacja Chrome, telewizory i urządzenia z ograniczonym wejściem, aplikacja komputerowa.

Jeśli typ klienta to Android, aplikacja w Chrome lub iOS i używasz pętli adresu IP, przejdź do następnego kroku.

Jeśli używasz adresu IP pętli zwrotnej w kliencie OAuth aplikacji na komputer, nie musisz nic robić w związku z zaprzestaniem obsługi tego adresu, ponieważ ten typ klienta OAuth nadal będzie obsługiwany.

Jak sprawdzić, czy aplikacja używa pętli zwrotnej adresów IP

Sprawdź kod aplikacji lub wychodzące wywołanie sieci (jeśli aplikacja używa biblioteki OAuth), aby ustalić, czy żądanie autoryzacji OAuth Google wysyłane przez aplikację używa wartości identyfikatorów URI przekierowania pętli.

Sprawdzanie kodu aplikacji

Sprawdź sekcję kodu aplikacji, w której wywołujesz interfejsy punktów końcowych autoryzacji OAuth Google, i ustanów, czy parametr redirect_uri ma jedną z tych wartości:
  • redirect_uri=http://127.0.0.1:<port> np. redirect_uri=http://127.0.0.1:3000
  • redirect_uri=http://[::1]:<port> np. redirect_uri=http://[::1]:3000
  • redirect_uri=http://localhost:<port> np. redirect_uri=http://localhost:3000
Przykładowe żądanie przekierowania adresu IP pętli będzie wyglądać tak:
https://accounts.google.com/o/oauth2/v2/auth?
redirect_uri=http://localhost:3000&
response_type=code&
scope=<SCOPES>&
state=<STATE>&
client_id=<CLIENT_ID>

Sprawdzanie wychodzącego wywołania sieciowego

Sposób sprawdzania wywołań sieci zależy od typu klienta aplikacji.
Podczas sprawdzania wywołań sieciowych poszukaj żądań wysłanych do punktów końcowych autoryzacji OAuth Google i sprawdź, czy parametr redirect_uri ma jedną z tych wartości:
  • redirect_uri=http://127.0.0.1:<port> np. redirect_uri=http://127.0.0.1:3000
  • redirect_uri=http://[::1]:<port> np. redirect_uri=http://[::1]:3000
  • redirect_uri=http://localhost:<port> np. redirect_uri=http://localhost:3000
Przykładowe żądanie przekierowania adresu IP pętli będzie wyglądać tak:
https://accounts.google.com/o/oauth2/v2/auth?
redirect_uri=http://localhost:3000&
response_type=code&
scope=<SCOPES>&
state=<STATE>&
client_id=<CLIENT_ID>

Przechodzenie na obsługiwaną metodę alternatywną

Klienty mobilne (Android / iOS)

Jeśli ustalisz, że Twoja aplikacja korzysta z pętli zwrotnej adresu IP z typu klienta OAuth na Androida lub iOS, musisz przejść na zalecane pakiety SDK (Android, iOS).

Pakiet SDK ułatwia dostęp do interfejsów API Google i obsługuje wszystkie wywołania punktów końcowych autoryzacji OAuth 2.0 Google.

Linki do dokumentacji poniżej zawierają informacje o tym, jak używać zalecanych pakietów SDK do uzyskiwania dostępu do interfejsów API Google bez używania adresu URI przekierowania do adresu IP pętli zwrotnej.

Dostęp do interfejsów Google API na Androidzie

Dostęp po stronie klienta

Ten przykład pokazuje, jak uzyskać dostęp do interfejsów API Google po stronie klienta na Androidzie za pomocą zalecanej biblioteki Google Identity Services na Androida.

  List requestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA);
    AuthorizationRequest authorizationRequest = AuthorizationRequest.builder().setRequestedScopes(requestedScopes).build();
    Identity.getAuthorizationClient(activity)
            .authorize(authorizationRequest)
            .addOnSuccessListener(
                authorizationResult -> {
                  if (authorizationResult.hasResolution()) {
                    // Access needs to be granted by the user
                    PendingIntent pendingIntent = authorizationResult.getPendingIntent();
                    try {
    startIntentSenderForResult(pendingIntent.getIntentSender(),
    REQUEST_AUTHORIZE, null, 0, 0, 0, null);
                    } catch (IntentSender.SendIntentException e) {
                    Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage());
                    }
                  } else {
                    // Access already granted, continue with user action
                    saveToDriveAppFolder(authorizationResult);
                  }
                })
            .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));

Przekaż parametr authorizationResult zdefiniowanej metodzie, aby zapisać treści w folderze Dysk użytkownika. Obiekt authorizationResult zawiera metodę getAccessToken(), która zwraca token dostępu.

Dostęp po stronie serwera (offline)
Ten przykład pokazuje, jak uzyskać dostęp do interfejsów Google API po stronie serwera na Androidzie.
  List requestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA);
    AuthorizationRequest authorizationRequest = AuthorizationRequest.builder()
    .requestOfflineAccess(webClientId)
            .setRequestedScopes(requestedScopes)
            .build();
    Identity.getAuthorizationClient(activity)
            .authorize(authorizationRequest)
            .addOnSuccessListener(
                authorizationResult -> {
                  if (authorizationResult.hasResolution()) {
                    // Access needs to be granted by the user
                    PendingIntent pendingIntent = authorizationResult.getPendingIntent();
                    try {
    startIntentSenderForResult(pendingIntent.getIntentSender(),
    REQUEST_AUTHORIZE, null, 0, 0, 0, null);
                    } catch (IntentSender.SendIntentException e) {
                    Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage());
                    }
                  } else {
                    String authCode = authorizationResult.getServerAuthCode();
                  }
                })
            .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));

Usługa authorizationResult udostępnia metodę getServerAuthCode(), która zwraca kod autoryzacji. Możesz go wysłać do backendu, aby uzyskać token dostępu i token odświeżania.

Dostęp do interfejsów Google API w aplikacji na iOS

Dostęp po stronie klienta

Przykład poniżej pokazuje, jak uzyskać dostęp do interfejsów API Google po stronie klienta na 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()
}

Użyj tokena dostępu do wywołania interfejsu API, umieszczając go w nagłówku żądania REST lub gRPC (Authorization: Bearer ACCESS_TOKEN) albo używając autoryzatora pobierania (GTMFetcherAuthorizationProtocol) z biblioteką klienta interfejsów API Google dla języka Objective-C dla interfejsu REST.

Zapoznaj się z przewodnikiem po dostępie po stronie klienta, aby dowiedzieć się, jak uzyskać dostęp do interfejsów API Google po stronie klienta. informacje o dostępie do interfejsów API Google po stronie klienta.

Dostęp po stronie serwera (w trybie offline)
Przykład poniżej pokazuje, jak uzyskać dostęp do interfejsów API Google po stronie serwera, aby obsługiwać klienta na 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
}

Zapoznaj się z przewodnikiem po dostępie po stronie serwera, aby dowiedzieć się, jak uzyskać dostęp do interfejsów API Google po stronie serwera.

Klient aplikacji Chrome

Jeśli ustalisz, że Twoja aplikacja korzysta z procesu adresu IP sprzężenia zwrotnego w kliencie aplikacji Chrome, przejdź na korzystanie z  interfejsu Chrome Identity API.

Przykład poniżej pokazuje, jak uzyskać wszystkie kontakty użytkownika bez użycia adresu URI przekierowania adresu IP pętli zwrotnej.

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)
    });
   });
 });
};

Więcej informacji o tym, jak uzyskiwać dostęp do danych użytkowników i wywoływać punkty końcowe Google za pomocą interfejsu Chrome Identity API, znajdziesz w  przewodniku po tym interfejsie API.