Pozapasmowy przewodnik po migracji

Opis

16 lutego 2022 r. ogłosiliśmy, że korzystanie z bezpieczniejszych przepływów OAuth będzie bezpieczniejsze. Ten przewodnik pomoże Ci zrozumieć niezbędne zmiany i kroki, które należy wykonać, aby przeprowadzić migrację poza procesem OBA do obsługiwanych alternatywnych rozwiązań.

Ma to na celu ochronę przed atakami mającymi na celu wyłudzenie informacji lub przejęcie tożsamości podczas interakcji z punktami końcowymi autoryzacji OAuth 2.0 w Google.

Co to jest OOB?

Poza zakresem (OOB) to proces starszego typu obsługiwany w przypadku klientów natywnych, którzy nie mają identyfikatora URI przekierowania po zaakceptowaniu prośby o udzielenie zgody OAuth. Procedura OOB stanowi potencjalne zagrożenie, a klienci muszą przejść na alternatywną metodę ochrony przed tą luką w zabezpieczeniach.

Wycofujemy funkcję OOB w przypadku wszystkich typów klientów, takich jak aplikacje internetowe, Android, iOS, uniwersalna platforma Windows (UWP), aplikacje Chrome, telewizory i urządzenia z ograniczonym dostępem, aplikacje komputerowe.

Kluczowe daty zgodności

  • 28 lutego 2022 r. – nowe użycie protokołu OAuth zostało zablokowane w procesie OOB
  • 5 września 2022 roku – w przypadku niezgodnych żądań OAuth może pojawić 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.

Miesiąc przed wysłaniem prośby o zgodę na wykorzystanie danych może być wyświetlany komunikat dla użytkowników niespełniających wymagań.Oznacza to, że 5 września 2022 r. proces OOB został całkowicie wycofany. Komunikat informuje użytkowników, że aplikacja może zostać wkrótce zablokowana, wyświetlając adres e-mail pomocy zarejestrowany przez Ciebie na ekranie zgody OAuth w konsoli Google API.

Możesz zaakceptować komunikat ostrzegawczy wyświetlany użytkownikom i pominąć go, przekazując parametr zapytania w wywołaniu autoryzacji, jak pokazano poniżej:
  • Przejdź do kodu w aplikacji, w którym wysyłasz żądania do punktu końcowego autoryzacji OAuth 2.0 Google.
  • Dodaj parametr ack_oob_shutdown z wartością daty egzekwowania 2022-10-03 w żądaniu przekierowania. Przykład:
    ack_oob_shutdown=2022-10-03
Aby przeprowadzić proces migracji, musisz wykonać 2 czynności:
  1. Sprawdź, czy zmiana Cię dotyczy.
  2. Jeśli coś Cię nie interesuje, przejdź na bezpieczniejszą alternatywę.

Sprawdź, czy problem Cię dotyczy

To wycofanie dotyczy tylko aplikacji w wersji produkcyjnej (tj.aplikacji ze stanem publikowania ustawionym na W wersji produkcyjnej). Proces ten będzie nadal działać w przypadku aplikacji, które mają stan testowania.

Sprawdź stan publikowania w Consent Screen pageoAuth Google 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 używa procesu OOB

Sprawdź kod aplikacji lub wywołanie sieciowe (jeśli aplikacja używa biblioteki OAuth), aby sprawdzić, czy prośba o autoryzację Google OAuth wykorzystuje wartość identyfikatora przekierowania OOB.

Sprawdzanie kodu aplikacji

Przejrzyj sekcję kodu aplikacji, w której wykonujesz wywołania punktów końcowych autoryzacji Google OAuth, i określ, czy parametr redirect_uri ma dowolną 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ład żądania przekierowania OOB będzie wyglądać mniej więcej 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 sprawdzania połączeń sieciowych różni się w zależności od typu klienta aplikacji.
Podczas sprawdzania połączeń sieciowych poszukaj żądań wysłanych do punktów końcowych autoryzacji Google OAuth i określ, czy parametr redirect_uri ma dowolną 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ład żądania przekierowania OOB będzie wyglądać następująco:
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 aplikacja korzysta z obiektu OOB z klientem OAuth na Androida lub iOS, przejdź na pakiet SDK do logowania jednokrotnego na urządzeniach z Androidem (Android, iOS).

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

Poniższe linki do dokumentacji zawierają informacje o tym, jak używać pakietów SDK logowania Google do uzyskiwania dostępu do interfejsów API Google bez użycia identyfikatora URI przekierowania OOB.

Uzyskiwanie dostępu do interfejsów API Google na urządzeniach z Androidem

Dostęp po stronie serwera (offline)
Poniższy przykład pokazuje, jak uzyskać dostęp do interfejsów API Google po stronie serwera w 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

Poniższy przykład 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 do wywoływania interfejsu API, dodając token dostępu w nagłówku żądania REST lub gRPC (Authorization: Bearer ACCESS_TOKEN) albo korzystając z narzędzia do pobierania (GTMFetcherAuthorizationProtocol) z biblioteką klienta interfejsów API Google dla 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. jak uzyskać dostęp do interfejsów API Google po stronie klienta.

Dostęp po stronie serwera (offline)
Poniższy przykład pokazuje, jak uzyskać dostęp do interfejsów API Google po stronie serwera, aby obsługiwać klienta 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 przepływu OOB w kliencie aplikacji Chrome, przeprowadź migrację do tego interfejsu Chrome Identity API.

Poniższy przykład pokazuje, jak pobrać 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 przy użyciu interfejsu Chrome Identity API znajdziesz w przewodniku po interfejsie Chrome Identity API.

Aplikacja internetowa

Jeśli stwierdzisz, że aplikacja używa przepływu OOB dla aplikacji internetowej, przejdź na jedną z bibliotek klienta interfejsu 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:

Fragment kodu poniżej przedstawia przykład interfejsu Node.js dotyczący używania interfejsu Dysku Google API do wyświetlania plików Dysku Google użytkownika 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.
      });
    }
  }
}

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

Dostęp po stronie klienta

Poniżej w kodzie JavaScript pokazany jest przykład użycia interfejsu Google API do uzyskiwania 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 po stronie klienta, aby dowiedzieć się, jak uzyskać dostęp do interfejsów API Google po stronie klienta.

Klient komputerowy

Jeśli stwierdzimy, że Twoja aplikacja korzysta z procesu OOB na komputerze, przejdź na adres IP pętli (localhost lub 127.0.0.1).