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.
- Sprawdź, czy ten problem Cię dotyczy.
- 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
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
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
- Aplikacja internetowa – sprawdzaj aktywność w sieci w Chrome
- Android – sprawdź ruch w sieci za pomocą inspektora sieci
-
Aplikacje Chrome
- Otwórz stronę rozszerzeń do Chrome.
- Zaznacz pole wyboru Tryb programisty w prawym górnym rogu strony rozszerzenia.
- Wybierz rozszerzenie, które chcesz monitorować
- Kliknij link strona w tle w sekcji Sprawdź widoki na stronie rozszerzenia.
- Pojawi się wyskakujące okienko Narzędzia dla programistów, w którym możesz monitorować ruch w sieci na karcie Sieć.
- iOS – analizowanie ruchu HTTP przy użyciu Instruments
- Universal Windows Platform (UWP) – sprawdzaj ruch sieciowy w Visual Studio
- Aplikacje komputerowe – użyj narzędzia do przechwytywania ruchu sieciowego dostępnego w systemie operacyjnym, na który została opracowana aplikacja.
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
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)
- Utwórz serwer i zdefiniuj publicznie dostępny punkt końcowy (identyfikator URI przekierowania), który będzie odbierał kod autoryzacji.
- Skonfiguruj identyfikator URI przekierowania w: Credentials page Google API Console
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
).