Przewodnik migracji procesu poza zakresem (OOB)

Opis

16 lutego 2022 r. ogłosiliśmy, że planujemy zwiększyć bezpieczeństwo interakcji z Google OAuth przez zastosowanie bezpieczniejszych przepływów OAuth. Ten przewodnik pomoże Ci zapoznać się z niezbędnymi zmianami i krokami, które należy wykonać, aby przeprowadzić migrację z zewnętrznego procesu OAuth spoza zakresu OAuth (OOB) do obsługiwanych alternatywnych rozwiązań.

To zabezpieczenie przed atakami phishingowymi i atakami polegającymi na podszywaniu się pod inne aplikacje podczas interakcji z punktami końcowymi autoryzacji OAuth 2.0 Google.

Co to jest OOB?

OAuth poza zakresem (OOB), nazywany też opcją ręcznego kopiowania i wklejania, to starsza wersja procesu opracowana, aby obsługiwać klienty natywne, które nie mają identyfikatora URI przekierowania, aby zaakceptować dane logowania po zatwierdzeniu prośby o zgodę OAuth przez użytkownika. Proces OOB stwarza ryzyko zdalnego wyłudzania informacji, dlatego klienci muszą przejść na alternatywną metodę, aby zabezpieczyć się przed tą luką w zabezpieczeniach.

Wycofujemy proces OOB w przypadku wszystkich typów klientów, tj. aplikacji internetowych, aplikacji na Androida, iOS, aplikacji UWP, aplikacji Chrome, telewizorów, urządzeń z ograniczonym źródłem sygnału oraz aplikacji komputerowych.

Najważniejsze daty zgodności

  • 28 lutego 2022 r. – nowe wykorzystanie protokołu OAuth na potrzeby przepływu OOB zostało zablokowane
  • 5 września 2022 r. – w przypadku niezgodnych żądań OAuth może wyświetlić się komunikat ostrzegawczy
  • 3 października 2022 r. – proces OOB został wycofany w przypadku klientów OAuth utworzonych przed 28 lutego 2022 r.
  • 31 stycznia 2023 r. – wszyscy istniejący klienci są blokowani (w tym klienci zwolnieni)

W przypadku niezgodnych żądań wyświetlany jest komunikat o błędzie. Użytkownicy zobaczą komunikat o zablokowaniu aplikacji wraz z adresem e-mail zespołu pomocy zarejestrowanym na ekranie zgody OAuth w konsoli interfejsów API Google.

Proces migracji składa się z 2 głównych kroków:
  1. Określ, czy ten problem Cię dotyczy.
  2. W razie potrzeby przejdź na bezpieczniejszą alternatywę.

Określ, czy ten problem Cię dotyczy

To wycofanie dotyczy tylko aplikacji produkcyjnych (tj.aplikacji, których stan publikowania jest ustawiony na W wersji produkcyjnej). Proces będzie nadal działać w przypadku aplikacji ze stanem publikacji „Testowanie”.

Sprawdź stan publikacji w OAuth Consent Screen pageGoogle API Console i przejdź do następnego kroku, jeśli używasz procesu OOB w projekcie ze stanem publikowania „W wersji produkcyjnej”.

Jak sprawdzić, czy aplikacja korzysta z procesu OOB

Sprawdź kod aplikacji lub wychodzące wywołanie sieciowe (jeśli aplikacja korzysta z biblioteki OAuth), aby ustalić, czy żądanie autoryzacji Google OAuth wykonywane przez aplikację używa wartości identyfikatora URI przekierowania OOB.

Sprawdzanie kodu aplikacji

Przejrzyj sekcję kodu aplikacji, w której wywołujesz punkty końcowe autoryzacji Google OAuth, i sprawdź, czy parametr redirect_uri ma którąś z tych wartości:
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
  • redirect_uri=oob
Przykładowe żądanie przepływu przekierowania OOB wygląda tak:
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>

Sprawdź wychodzące połączenia sieciowe

Metoda sprawdzania wywołań sieciowych różni się w zależności od typu klienta aplikacji.
Podczas sprawdzania wywołań sieciowych poszukaj żądań wysyłanych do punktów końcowych autoryzacji Google OAuth i ustal, czy parametr redirect_uri ma którąś z tych wartości:
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
  • redirect_uri=oob
Przykładowe żądanie przepływu przekierowania OOB wygląda tak:
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>

Migracja na bezpieczną alternatywę

Klienty mobilne (Android / iOS)

Jeśli stwierdzisz, że Twoja aplikacja korzysta z procesu OOB za pomocą klienta OAuth na Androida lub iOS, przejdź na mobilne pakiety SDK Logowania przez Google (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 korzystać z pakietów SDK Google Sign-In do uzyskiwania dostępu do interfejsów API Google bez używania identyfikatora URI przekierowania OOB.

Dostęp do interfejsów API Google na Androidzie

Dostęp po stronie serwera (offline)
Przykład poniżej pokazuje, jak uzyskać dostęp do interfejsów API Google po stronie serwera na urządzeniu z Androidem.
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);
}

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.

Dostęp do interfejsów API Google 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 w systemie 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()
}

Do wywoływania interfejsu API użyj tokena dostępu. Aby to zrobić, umieść token dostępu w nagłówku żądania REST lub gRPC (Authorization: Bearer ACCESS_TOKEN) albo użyj narzędzia autoryzacyjnego pobierania (GTMFetcherAuthorizationProtocol) z biblioteką klienta interfejsów API Google na potrzeby interfejsu Objective-C w środowisku REST.

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

Dostęp po stronie serwera (offline)
Przykład poniżej pokazuje, jak uzyskać dostęp do interfejsów API Google po stronie serwera w celu obsługi 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 stwierdzisz, że aplikacja używa procesu OOB w kliencie aplikacji Chrome, przejdź na interfejs Chrome Identity API.

Przykład poniżej pokazuje, jak uzyskać wszystkie kontakty użytkownika bez użycia identyfikatora URI przekierowania 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)
    });
   });
 });
};

Więcej informacji o uzyskiwaniu dostępu do uwierzytelniania użytkowników i wywoływaniu punktów końcowych Google za pomocą interfejsu Chrome Identity API znajdziesz w przewodniku po interfejsie Chrome Identity API.

Aplikacja internetowa

Jeśli stwierdzisz, że Twoja aplikacja korzysta z procesu OOB dla aplikacji internetowej, przeprowadź migrację do jednej z bibliotek klienckich interfejsów API Google. Listę bibliotek klienta dla różnych języków programowania znajdziesz tutaj.

Biblioteki ułatwiają dostęp do interfejsów API Google i obsługują wszystkie wywołania punktów końcowych Google.

Dostęp po stronie serwera (offline)
Tryb dostępu po stronie serwera (offline) wymaga wykonania tych czynności:

Poniższy fragment kodu zawiera przykład użycia interfejsu NodeJS API do wyświetlania listy plików użytkownika na Dysku Google po stronie serwera bez użycia identyfikatora URI przekierowania 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.
      });
    }
  }
}

Informacje o tym, jak uzyskać dostęp do interfejsów API Google po stronie serwera, znajdziesz w przewodniku po aplikacji internetowej po stronie serwera.

Dostęp po stronie klienta

Poniższy fragment kodu w języku JavaScript pokazuje przykład użycia interfejsu Google API w celu uzyskania dostępu do wydarzeń w kalendarzu użytkownika po stronie klienta.


// 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(...);
}

Zapoznaj się z przewodnikiem po aplikacji internetowej po stronie klienta, by dowiedzieć się, jak uzyskać dostęp do interfejsów API Google po stronie klienta.

Klient na komputerze

Jeśli stwierdzisz, że aplikacja korzysta z procesu OOB w kliencie na komputery, musisz przejść na proces typu loopback adresu IP (localhost lub 127.0.0.1).