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.
- Określ, czy ten problem Cię dotyczy.
- 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
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łączenia sieciowe
- Aplikacja internetowa – sprawdzaj aktywność sieciową 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 sieciowy na karcie Sieć.
- iOS – Analizowanie ruchu HTTP za pomocą Instruments
- Uniwersalna platforma Windows (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 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)
- Ustaw 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 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
).