Przewodnik migracji procesu poza zakresem (OOB)

Przegląd

16 lutego 2022 r. ogłosiliśmy, że planujemy zwiększyć bezpieczeństwo interakcji Google OAuth przy użyciu bezpieczniejszych przepływów OAuth. Ten przewodnik ułatwia zapoznanie się z niezbędnymi zmianami i krokami, które należy wykonać, aby przeprowadzić migrację protokołu OAuth poza zakres (OOB) do obsługiwanych alternatywnych rozwiązań.

To środek ochronny przed atakami phishingowymi i podszywaniem się pod inne aplikacje podczas interakcji z punktami końcowymi autoryzacji OAuth 2.0 Google.

Co to jest OOB?

Poza zakresem OAuth, zwana też opcją ręcznego kopiowania/wklejania, to starszy proces opracowany z myślą o klientach natywnych, które nie mają identyfikatora URI przekierowania służącego do akceptowania danych logowania po zatwierdzeniu prośby o zgodę OAuth przez użytkownika. Proces OOB stwarza ryzyko zdalnego phishingu, dlatego klienci muszą przejść na alternatywną metodę, aby chronić się przed tą luką w zabezpieczeniach.

Proces OOB jest wycofywany w przypadku wszystkich typów klientów: aplikacji internetowych, aplikacji internetowych na Androida, iOS, platformy Universal Windows Platform (UWP), aplikacji Chrome, telewizorów, urządzeń o ograniczonym dostępie czy aplikacji komputerowych.

Najważniejsze daty zapewnienia zgodności z zasadami

  • 28 lutego 2022 r. – nowe użycie protokołu OAuth zostało zablokowane na potrzeby przepływu OOB
  • 5 września 2022 r. – w przypadku niezgodnych żądań OAuth może wyświetlić się komunikat ostrzegawczy dla użytkowników
  • 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ą zablokowani (w tym klienci zwolnieni)

W przypadku niezgodnych żądań wyświetlany jest komunikat o błędzie. Wiadomość będzie informować użytkowników o zablokowaniu aplikacji i wyświetlić adres e-mail do zespołu pomocy zarejestrowany na ekranie zgody OAuth w Konsoli interfejsów API Google.

Proces migracji składa się z 2 głównych kroków:
  1. Sprawdź, 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 w wersji produkcyjnej (tj.tych, których stan publikacji to W wersji produkcyjnej). Proces będzie nadal działać w przypadku aplikacji ze stanem publikacji Testowanie.

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

Jak określić, 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 przesyłana przez aplikację korzysta z wartości identyfikatora URI przekierowania OOB.

Sprawdzanie kodu aplikacji

Sprawdź sekcję kodu aplikacji, w której wywołujesz punkty końcowe autoryzacji Google OAuth, i określ, 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łączenie sieciowe

Metoda badania wywołań sieciowych różni się w zależności od typu klienta aplikacji.
Podczas badania wywołań sieciowych szukaj żądań wysyłanych do punktów końcowych autoryzacji Google OAuth i określaj, 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 będzie wyglądać jak to poniżej:
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 do bezpiecznej alternatywy

Klienty mobilne (Android / iOS)

Jeśli stwierdzisz, że Twoja aplikacja korzysta z procesu OOB za pomocą klienta OAuth na Androida lub iOS, przeprowadź migrację do mobilnych pakietów 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.

Poniższe linki do dokumentacji zawierają informacje o tym, jak korzystać z pakietów Google Sign-In SDK do uzyskiwania dostępu do interfejsów API Google bez korzystania z 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 Androidzie.
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()
}

Użyj tokena dostępu, aby wywołać interfejs API. Aby to zrobić, umieść token dostępu w nagłówku żądania REST lub gRPC (Authorization: Bearer ACCESS_TOKEN) albo za pomocą narzędzia do pobierania (GTMFetcherAuthorizationProtocol) z biblioteką klienta interfejsów API Google dla interfejsu Objective-C w REST.

Zapoznaj się z przewodnikiem dostępu po stronie klienta, aby dowiedzieć się, jak uzyskać dostęp do interfejsów API Google po stronie klienta. uzyskiwania dostępu 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, przeprowadź migrację do interfejsu Chrome Identity API.

Przykład poniżej pokazuje, jak uzyskać wszystkie kontakty użytkownika bez używania 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 aplikacja korzysta z procesu OOB w przypadku aplikacji internetowej, przeprowadź migrację do jednej z bibliotek klienta interfejsów API Google. Biblioteki klienta dla różnych języków programowania znajdziesz tutaj.

Biblioteki ułatwiają dostęp do interfejsów API Google i obsługę wszystkich wywołań 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 NodeJS API do wyświetlania po stronie serwera listy plików użytkownika na Dysku Google 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.
      });
    }
  }
}

Zapoznaj się z przewodnikiem po aplikacji internetowej po stronie serwera, aby dowiedzieć się, jak uzyskać dostęp do interfejsów API Google 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, aby dowiedzieć się, jak uzyskać dostęp do interfejsów API Google po stronie klienta.

Klient na komputerze

Jeśli stwierdzisz, że Twoja aplikacja korzysta z przepływu OOB w kliencie na komputerze, użyj procesu loopback adresu IP (localhost lub 127.0.0.1).