Visão geral
Em 16 de fevereiro de 2022, anunciamos planos para tornar as interações do OAuth do Google mais seguras usando fluxos OAuth mais seguros. Este guia ajuda você a entender as mudanças e etapas necessárias para migrar com sucesso do fluxo de endereço IP de loopback para alternativas compatíveis.
Essa ação é uma medida de proteção contra ataques de phishing e de representação de apps durante interações com os endpoints de autorização do OAuth 2.0 do Google.
Qual é o fluxo de endereço IP de loopback?
O fluxo de endereço IP de loopback permite o uso de um endereço IP de loopback oulocalhost
como o componente host do URI de redirecionamento para onde as credenciais são enviadas depois que um usuário aprova uma solicitação de consentimento do OAuth. Esse fluxo é
vulnerável a
ataques man-in-the-middle
em que um app malicioso, acessando a mesma interface de loopback em alguns
sistemas operacionais, pode interceptar a resposta do servidor de autorização ao
URI de redirecionamento especificado e acessar o código de autorização.
O fluxo de endereço IP loopback está sendo descontinuado para os tipos de cliente OAuth nativos do iOS, Android e Chrome, mas vai continuar sendo compatível com apps para computador.
Datas importantes de conformidade
- 14 de março de 2022: novos clientes OAuth bloqueados para usar o fluxo de endereço IP de loopback
- 1º de agosto de 2022: uma mensagem de aviso para o usuário pode ser mostrada para solicitações OAuth não compatíveis.
- 31 de agosto de 2022: o fluxo de endereço IP loopback será bloqueado para clientes OAuth nativos do Android, apps do Chrome e iOS criados antes de 14 de março de 2022.
- 21 de outubro de 2022: todos os clientes atuais são bloqueados (incluindo os isentos)
Uma mensagem de erro voltada ao usuário será exibida para solicitações não compatíveis. A mensagem vai informar aos usuários que o app está bloqueado e mostrar o e-mail de suporte registrado na tela de permissão OAuth no Console de APIs do Google.
- Determine se você será afetado.
- Migre para uma alternativa compatível se você for afetado.
Determinar se você será afetado
Verificar o tipo de ID do cliente OAuth
Acesse o Clients page do Google Cloud Console e confira o tipo de ID do cliente OAuth na seção IDs do cliente OAuth 2.0. Será um dos seguintes: aplicativo da Web, Android, iOS, Plataforma Universal do Windows (UWP), app Chrome, TVs e dispositivos de entrada limitada ou app para computador.
Siga para a próxima etapa se o tipo de cliente for Android, app Chrome ou iOS e você estiver usando o fluxo de endereço IP loopback.
Não é necessário fazer nada relacionado a essa descontinuação se você estiver usando o fluxo de endereço IP de loopback em um cliente OAuth de app para computador, já que o uso com esse tipo de cliente OAuth vai continuar sendo compatível.
Como determinar se o app está usando o fluxo de endereço IP de loopback
Inspecione o código do app ou a chamada de rede de saída (caso o app esteja usando uma biblioteca OAuth) para determinar se a solicitação de autorização do Google OAuth feita pelo app está usando valores de URI de redirecionamento de loopback.
Inspecionar o código do aplicativo
redirect_uri
tem algum dos
valores a seguir:
-
redirect_uri=http://127.0.0.1:<port>
, por exemplo,redirect_uri=http://127.0.0.1:3000
-
redirect_uri=http://[::1]:<port>
, por exemplo,redirect_uri=http://[::1]:3000
-
redirect_uri=http://localhost:<port>
, por exemplo,redirect_uri=http://localhost:3000
https://accounts.google.com/o/oauth2/v2/auth? redirect_uri=http://localhost:3000& response_type=code& scope=<SCOPES>& state=<STATE>& client_id=<CLIENT_ID>
Inspecionar uma chamada de rede de saída
- Aplicativo da Web: inspecionar a atividade de rede no Chrome
- Android: inspecionar o tráfego de rede com o Network Inspector
-
Apps do Chrome
- Acesse a página Extensões do Chrome.
- Marque a caixa de seleção Modo de desenvolvedor no canto superior direito da página de extensão.
- Selecione a extensão que você quer monitorar.
- Clique no link página de plano de fundo na seção Inspecionar visualizações da página de extensão.
- Um pop-up Ferramentas para desenvolvedores será aberto para você monitorar o tráfego de rede na guia "Rede".
- iOS: Analisar o tráfego HTTP com o Instruments
- Plataforma Universal do Windows (UWP): inspecionar o tráfego de rede no Visual Studio
- Apps para computador: use uma ferramenta de captura de rede disponível para o sistema operacional em que o app foi desenvolvido.
redirect_uri
tem algum dos
valores a seguir:
-
redirect_uri=http://127.0.0.1:<port>
, por exemplo,redirect_uri=http://127.0.0.1:3000
-
redirect_uri=http://[::1]:<port>
, por exemplo,redirect_uri=http://[::1]:3000
-
redirect_uri=http://localhost:<port>
, por exemplo,redirect_uri=http://localhost:3000
https://accounts.google.com/o/oauth2/v2/auth? redirect_uri=http://localhost:3000& response_type=code& scope=<SCOPES>& state=<STATE>& client_id=<CLIENT_ID>
Migrar para uma alternativa compatível
Clientes para dispositivos móveis (Android / iOS)
Se você determinar que seu app está usando o fluxo de endereço IP de loopback com um tipo de cliente OAuth do Android ou iOS, migre para o uso dos SDKs recomendados (Android, iOS).
O SDK facilita o acesso às APIs do Google e processa todas as chamadas aos endpoints de autorização OAuth 2.0 do Google.
Os links de documentação abaixo fornecem informações sobre como usar os SDKs recomendados para acessar APIs do Google sem usar um endereço IP de loopback URI de redirecionamento.
Acessar as APIs do Google no Android
Acesso do lado do cliente
O exemplo a seguir mostra como acessar as APIs do Google no lado do cliente no Android usando a biblioteca Android recomendada dos Serviços de Identificação do Google.
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));
Transmita o authorizationResult
ao método definido para salvar o conteúdo na
pasta do Drive do usuário. O authorizationResult
tem o método
getAccessToken()
, que retorna o token de acesso.
Acesso do lado do servidor (off-line)
O exemplo a seguir mostra como acessar as APIs do Google no lado do servidor no Android.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));
O authorizationResult
tem o
método
getServerAuthCode()
que retorna o código de autorização que você pode enviar para
seu back-end para receber um token de acesso e de atualização.
Acessar APIs do Google em um app iOS
Acesso do lado do cliente
O exemplo abaixo mostra como acessar as APIs do Google no lado do cliente no 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() }
Use o token de acesso para chamar a API. Para isso, inclua o token no
cabeçalho de uma solicitação REST ou gRPC (Authorization: Bearer ACCESS_TOKEN
)
ou use o autorizador de busca (GTMFetcherAuthorizationProtocol
) com a
biblioteca de cliente das APIs do Google para Objective-C para REST.
Consulte o guia de acesso do lado do cliente para saber como acessar as APIs do Google no lado do cliente. sobre como acessar as APIs do Google no lado do cliente.
Acesso do lado do servidor (off-line)
O exemplo abaixo mostra como acessar as APIs do Google no lado do servidor para oferecer suporte a um cliente 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 }
Consulte o guia de acesso do lado do servidor para saber como acessar as APIs do Google do lado do servidor.
Cliente de app Chrome
Se você determinar que seu app está usando o fluxo de endereço IP de loopback no cliente do app Chrome, migre para a API Chrome Identity.
O exemplo abaixo mostra como receber todos os contatos do usuário sem usar um URI de redirecionamento de endereço IP de loopback.
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) }); }); }); };
Consulte o guia da API Chrome Identity para mais informações sobre como acessar usuários autenticados e chamar endpoints do Google com a API Chrome Identity.