Omówienie
16 lutego 2022 r. ogłosiliśmy, że zamierzamy zwiększyć bezpieczeństwo interakcji z protokołem OAuth Google, stosując bezpieczniejsze przepływy OAuth. Z tego przewodnika dowiesz się, jakie zmiany należy wprowadzić i jak przejść z procesu OAuth poza kanałem (OOB) na obsługiwane alternatywy.
Jest to środek ochrony przed atakami phishingowymi i podszwania się pod aplikację podczas interakcji z punktami końcowymi autoryzacji OAuth 2.0 Google.
Co to jest OOB?
OAuth out-of-band (OOB), zwany też opcją ręcznego kopiowania/wklejania, to starszy proces opracowany w celu obsługi klientów natywnych, którzy nie mają identyfikatora URI przekierowania, umożliwiający akceptację danych logowania po wyrażeniu przez użytkownika zgody na OAuth. Proces OOB stwarza ryzyko wyłudzenia informacji z dalszej odległości, dlatego klienci muszą przejść na alternatywną metodę, aby chronić się przed tą podatnością na ataki.Proces OOB jest wycofywany w przypadku wszystkich typów klientów, czyli aplikacji internetowych, aplikacji na Androida, iOS, platformę Universal Windows Platform (UWP), aplikacji w Chrome, telewizorów i urządzeń z ograniczonym wejściem oraz aplikacji komputerowych.
Ważne daty dotyczące zgodności
- 28 lutego 2022 r. – zablokowaliśmy nowe użycie protokołu OAuth w procesie poza aplikacją
- 5 września 2022 r. – w przypadku żądań OAuth niezgodnych z zasadami może być wyświetlany użytkownikowi komunikat z ostrzeżeniem
- 3 października 2022 r. – proces OOB jest wycofywany w przypadku klientów OAuth utworzonych przed 28 lutego 2022 r.
- 31 stycznia 2023 r. – zablokowanie wszystkich dotychczasowych klientów (w tym tych, którzy korzystają z wyjątku)
W przypadku żądań niezgodnych z zasadami wyświetlany będzie komunikat o błędzie dla użytkownika. Wiadomość poinformuje użytkowników, że aplikacja jest zablokowana, a e-mail pomocy, który został zarejestrowany na ekranie zgody OAuth w Konsoli interfejsów API Google, będzie wyświetlany.
- Sprawdź, czy dotyczy Cię problem.
- Przejdź na bezpieczniejszą alternatywę, jeśli dotyczy Cię ten problem.
Sprawdź, czy dotyczy Cię ta zmiana
Ta wycofana funkcja dotyczy tylko aplikacji w wersji produkcyjnej (czyli aplikacji, w których ustawieniach stanu publikacji wybrano opcję W wersji produkcyjnej). Ten proces będzie nadal działać w przypadku aplikacji ze stanem Testowanie publikowania.
Sprawdź stan publikowania w konfiguracji OAuth 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 poza ekranem
Sprawdź kod aplikacji lub wychodzące wywołanie sieci (jeśli aplikacja używa biblioteki OAuth), aby ustalić, czy żądanie autoryzacji OAuth Google wysyłane przez aplikację używa wartości identyfikatora URI przekierowania OOB.
Sprawdzanie kodu aplikacji
redirect_uri
ma jedną 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>
Sprawdzanie wychodzącego wywołania sieciowego
- Aplikacja internetowa – sprawdź aktywność sieci w Chrome
- Android – sprawdź ruch w sieci za pomocą narzędzia Network Inspector
-
Aplikacje w Chrome
- Otwórz stronę rozszerzeń Chrome.
- Zaznacz pole wyboru Tryb programisty w prawym górnym rogu strony rozszerzenia.
- Wybierz rozszerzenie, które chcesz monitorować.
- W sekcji Sprawdź widoki na stronie rozszerzenia kliknij link strona w tle.
- Wyświetli 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
- Universal Windows Platform (UWP) – Sprawdzanie ruchu sieciowego w Visual Studio
- Aplikacje na komputery: skorzystaj z narzędzi do przechwytywania ruchu w siecidostępnych w systemie operacyjnym, na potrzeby którego aplikacja została opracowana.
redirect_uri
ma jedną 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>
Przejście na bezpieczną alternatywę
Klienty mobilne (Android / iOS)
Jeśli stwierdzisz, że Twoja aplikacja korzysta z procesu OOB z typem klienta OAuth na Androida lub iOS, powinna przejść na zalecane pakiety SDK (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.
W linkach do dokumentacji poniżej znajdziesz informacje o tym, jak używać zalecanych pakietów SDK, aby uzyskać dostęp do interfejsów Google bez korzystania z adresu URI przekierowania OOB.
Dostęp do interfejsów Google API na Androidzie
Dostęp po stronie klienta
Ten przykład pokazuje, jak uzyskać dostęp do interfejsów API Google po stronie klienta na Androidzie za pomocą zalecanej biblioteki Google Identity Services na Androida.
ListrequestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA); AuthorizationRequest authorizationRequest = AuthorizationRequest.builder().setRequestedScopes(requestedScopes).build(); Identity.getAuthorizationClient(activity) .authorize(authorizationRequest) .addOnSuccessListener( authorizationResult -> { if (authorizationResult.hasResolution()) { // Access needs to be granted by the user PendingIntent pendingIntent = authorizationResult.getPendingIntent(); try { startIntentSenderForResult(pendingIntent.getIntentSender(), REQUEST_AUTHORIZE, null, 0, 0, 0, null); } catch (IntentSender.SendIntentException e) { Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage()); } } else { // Access already granted, continue with user action saveToDriveAppFolder(authorizationResult); } }) .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));
Przekaż parametr authorizationResult
zdefiniowanej metodzie, aby zapisać treści w folderze Dysk użytkownika. Obiekt authorizationResult
zawiera metodę
getAccessToken()
, która zwraca token dostępu.
Dostęp po stronie serwera (offline)
Ten przykład pokazuje, jak uzyskać dostęp do interfejsów Google API po stronie serwera na Androidzie.ListrequestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA); AuthorizationRequest authorizationRequest = AuthorizationRequest.builder() .requestOfflineAccess(webClientId) .setRequestedScopes(requestedScopes) .build(); Identity.getAuthorizationClient(activity) .authorize(authorizationRequest) .addOnSuccessListener( authorizationResult -> { if (authorizationResult.hasResolution()) { // Access needs to be granted by the user PendingIntent pendingIntent = authorizationResult.getPendingIntent(); try { startIntentSenderForResult(pendingIntent.getIntentSender(), REQUEST_AUTHORIZE, null, 0, 0, 0, null); } catch (IntentSender.SendIntentException e) { Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage()); } } else { String authCode = authorizationResult.getServerAuthCode(); } }) .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));
Usługa authorizationResult
udostępnia metodę
getServerAuthCode()
, która zwraca kod autoryzacji. Możesz go wysłać do backendu, aby uzyskać token dostępu i token odświeżania.
Dostęp do interfejsów Google API 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 do wywołania interfejsu API, umieszczając go w nagłówku żądania REST lub gRPC (Authorization: Bearer ACCESS_TOKEN
) albo używając autoryzatora pobierania (GTMFetcherAuthorizationProtocol
) z
biblioteką klienta interfejsów API Google dla języka Objective-C dla interfejsu 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. informacje o dostępie do interfejsów API Google po stronie klienta.
Dostęp po stronie serwera (w trybie offline)
Przykład poniżej pokazuje, jak uzyskać dostęp do interfejsów API Google po stronie serwera, aby obsługiwać 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 ustalisz, że Twoja aplikacja korzysta z procesu OOB w kliencie aplikacji Chrome, musisz przejść na korzystanie z interfejsu Chrome Identity API.
Przykład poniżej pokazuje, jak uzyskać wszystkie kontakty użytkownika bez użycia adresu 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 tym, jak uzyskiwać dostęp do danych użytkowników i wywoływać punkty końcowe Google za pomocą interfejsu Chrome Identity API, znajdziesz w przewodniku po tym interfejsie API.
Aplikacja internetowa
Jeśli stwierdzisz, że Twoja aplikacja używa procesu OOB w przypadku aplikacji internetowej, musisz przejść na korzystanie z jednej z bibliotek klienta interfejsu Google API. 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 (w trybie offline)
- Uruchom serwer i zdefiniuj dostępny publicznie punkt końcowy (URI przekierowania), aby otrzymać kod autoryzacji.
- Skonfiguruj identyfikator URI przekierowania w w
Podany poniżej fragment kodu pokazuje przykład użycia interfejsu Google Drive API w Node.js do wyświetlenia listy plików użytkownika na Dysku Google po stronie serwera bez użycia 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 aplikacjach internetowych po stronie serwera, aby dowiedzieć się, jak uzyskać dostęp do interfejsów API Google po stronie serwera.
Dostęp po stronie klienta
Ten fragment kodu w JavaScriptzie pokazuje 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 internetowej po stronie klienta, z którego dowiesz się, jak uzyskać dostęp do interfejsów API Google po stronie klienta.
Klient na komputer
Jeśli ustalisz, że Twoja aplikacja korzysta z procesu Out-Of-Band na kliencie na komputerze,
musisz przejść na korzystanie z
adresu IP sprzężenia zwrotnego (localhost
lub 127.0.0.1
).