Przegląd
16 lutego 2022 r. ogłosiliśmy, że chcemy zwiększyć bezpieczeństwo interakcji OAuth Google dzięki zastosowaniu bezpieczniejszych przepływów OAuth. Ten przewodnik pomoże Ci zrozumieć niezbędne zmiany i kroki, które trzeba wykonać, aby przeprowadzić migrację poza protokołem OAuth do obsługiwanego rozwiązania alternatywnego.
To zabezpieczenie ma chronić przed atakami mającymi na celu wyłudzenie informacji i podszywania się pod aplikacje, gdy użytkownicy korzystają z punktów końcowych autoryzacji OAuth 2.0.
Co to jest OOB?
Poza zakresem (<OB), nazywana też ręczną kopią zapasową Proces OOB stwarza zdalne ryzyko phishingu, dlatego klienci muszą przejść na inną metodę ochrony przed tą luką w zabezpieczeniach.Wycofanie 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.
Najważniejsze daty zapewnienia zgodności
- 28 lutego 2022 r. – nowe wykorzystanie protokołu OAuth zostało zablokowane w procesie OOB
- 5 września 2022 r. – wyświetlany jest użytkownikom wyświetlany komunikat z ostrzeżeniem dotyczącym niezgodnych z prośbą protokołu OAuth
- 3 października 2022 r. – przepływ OOB został wycofany w przypadku klientów OAuth utworzonych przed 28 lutego 2022 r.
- 31 stycznia 2023 r. – wszyscy klienci, w tym wyłączeni, są zablokowani.
W przypadku niezgodnych żądań pojawi się komunikat o błędzie widoczny dla użytkownika. Będzie on informował użytkowników o tym, że aplikacja została zablokowana, wyświetlając na niej e-mail pomocy zarejestrowany na ekranie zgody OAuth w konsoli interfejsów API Google.
- Ustal, czy problem Cię dotyczy.
- W razie potrzeby możesz skorzystać z bezpieczniejszej opcji.
Sprawdź, czy zmiana Cię dotyczy
Wycofanie dotyczy tylko aplikacji produkcyjnych (tzn.tych, których stan publikacji to W wersji produkcyjnej). Ten proces będzie nadal działać w przypadku aplikacji ze stanem publikacji.
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 „W wersji produkcyjnej”.
Jak sprawdzić, czy aplikacja używa przepływu pracy
Sprawdź kod aplikacji lub wywołanie sieciowe (jeśli aplikacja używa biblioteki OAuth) – w ten sposób zorientujesz się, czy prośba o autoryzację Google OAuth wykorzystuje wartość identyfikatora URI przekierowania OOB.
Sprawdzanie kodu aplikacji
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
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>
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>Uwaga: sprawdź także pliki konfiguracji aplikacji (takie jak
.env
), ponieważ wartości redirect_uri
zwykle są różne w zależności od środowiska, w którym działa aplikacja.
Sprawdź połączenie wychodzące z sieci
- Aplikacja internetowa – sprawdzaj aktywność w sieci w Chrome
- Android – sprawdzanie ruchu sieciowego przy użyciu 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.
- Otworzy się wyskakujące okienko Narzędzia dla deweloperów, w którym możesz sprawdzać ruch sieciowy na karcie Sieć.
- iOS – analiza ruchu HTTP za pomocą narzędzi
- Uniwersalna platforma Windows (UWP) – sprawdzanie ruchu sieciowego w Visual Studio
- Aplikacje komputerowe – użyj narzędzia do przechwytywania sieci dostępnego w przypadku systemu operacyjnego, do którego aplikacja została przeznaczona.
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
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
Klienci mobilni (Android / iOS)
Jeśli stwierdzisz, że Twoja aplikacja korzysta z procedury OOB za pomocą klienta OAuth na Androida lub iOS, przejdź na mobilne pakiety SDK do logowania Google (Android, iOS).
SDK ułatwia dostęp do interfejsów API Google i obsługuje wszystkie wywołania punktów końcowych autoryzacji Google OAuth 2.0.
Linki do dokumentacji poniżej zawierają informacje o tym, jak korzystać z pakietów SDK logowania Google, aby uzyskać dostęp do interfejsów API Google bez użycia 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 poradnikiem dotyczącym dostępu 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 na 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, by 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ą modułu autoryzacyjnego (GTMFetcherAuthorizationProtocol
) z
biblioteką klienta interfejsów API Google dla celu C dla REST.
Zapoznaj się z przewodnikiem 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)
Przykład poniżej 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 }
Przeczytaj przewodnik 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 Twoja aplikacja używa przepływu OOB w kliencie aplikacji Chrome, przełącz się na interfejs Chrome Identity API.
Przykład poniżej pokazuje, jak pobrać wszystkie kontakty użytkowników 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 używa OOB do obsługi 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ługują wszystkie wywołania punktów końcowych Google.
Dostęp po stronie serwera (offline)
- Skonfiguruj serwer i zdefiniuj publicznie dostępny punkt końcowy (identyfikator URI przekierowania), aby otrzymać kod autoryzacji.
- Skonfiguruj identyfikator URI przekierowania w Credentials page Google API Console
W poniższym fragmencie kodu widać przykład interfejsu NodeJS użycia interfejsu Google Drive API do wyświetlania listy 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 internetowej po stronie serwera, aby dowiedzieć się, jak uzyskać dostęp do interfejsów API Google po stronie serwera.
Dostęp po stronie klienta
Fragment kodu poniżej pokazuje, jak za pomocą interfejsu API uzyskać dostęp do wydarzeń z kalendarza 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 komputerowy
Jeśli stwierdzisz, że Twoja aplikacja korzysta z OOB w kliencie na komputery, przejdź na
adres IP w pętli (localhost
lub 127.0.0.1
).