Guia de migração do fluxo de endereços IP de loopback

Informações gerais

Em 16 de fevereiro de 2022, anunciamos planos para aumentar a segurança das interações do OAuth do Google com fluxos de OAuth mais seguros. Este guia ajuda a entender as mudanças necessárias e as etapas para migrar do fluxo de endereços IP de loopback para alternativas compatíveis.

Esse esforço é uma medida de proteção contra phishing e ataques de falsificação de identidade de apps durante interações com os endpoints de autorização OAuth 2.0 do Google.

O que é o fluxo de endereços IP de loopback?

O fluxo de endereços IP de loopback aceita o uso de um endereço IP de loopback ou localhost como o componente de 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 para o URI de redirecionamento fornecido e conseguir acesso ao código de autorização.

O fluxo de endereços IP de loopback será descontinuado para os tipos de cliente OAuth nativos do iOS, Android e do Chrome, mas continuará compatível com apps para computador.

Datas importantes para compliance

  • 14 de março de 2022: novos clientes OAuth não podem usar o fluxo de endereços IP de loopback.
  • 1o de agosto de 2022: uma mensagem de aviso voltada ao usuário poderá ser exibida para solicitações do OAuth que não estiverem em conformidade
  • 31 de agosto de 2022: o fluxo de endereços IP de loopback vai ser bloqueado para clientes OAuth nativos do Android, dos apps Chrome e do iOS criados antes de 14 de março de 2022.
  • 21 de outubro de 2022: todos os clientes atuais serão bloqueados (incluindo os isentos)

Uma mensagem de erro voltada ao usuário vai aparecer para as solicitações que não estiverem em conformidade. A mensagem informará aos usuários que o app está bloqueado enquanto o e-mail de suporte que você registrou na tela de consentimento do OAuth no Console de APIs do Google é exibido.

Há duas etapas principais a serem concluídas no processo de migração:
  1. Determine se você será afetado.
  2. Migre para uma alternativa com suporte se isso acontecer.

Como determinar se você será afetado

Revise o tipo de ID do cliente OAuth

Navegue até Credentials page do Google API Console e confira o tipo de ID do cliente OAuth na seção IDs do cliente OAuth 2.0. Ele será um dos seguintes: Aplicativo da Web, Android, iOS, Universal Windows Platform (UWP), app Chrome, TVs e dispositivos de entrada limitada, 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ços IP de loopback.

Você não precisa fazer nada em relação a essa suspensão de uso se estiver usando o fluxo de endereços IP de loopback em um cliente OAuth de app para computador, porque o uso com esse tipo de cliente OAuth continuará disponível.

Como determinar se o app está usando o fluxo de endereços IP de loopback.

Inspecione o código do app ou a chamada de rede realizada (caso o app use uma biblioteca OAuth) para determinar se a solicitação de autorização do Google OAuth que o app está fazendo está usando valores de URI de redirecionamento de loopback.

Inspecionar o código do aplicativo

Revise a seção do código do aplicativo em que você está fazendo chamadas para os endpoints de autorização do Google OAuth e determine se o parâmetro redirect_uri tem um dos seguintes valores:
  • 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
Um exemplo de solicitação de fluxo de redirecionamento do endereço IP de loopback será semelhante ao mostrado abaixo:
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 chamada de rede realizada

O método de inspeção de chamadas de rede varia de acordo com o tipo de cliente do app.
Ao inspecionar chamadas de rede, procure solicitações enviadas aos endpoints de autorização do Google OAuth e determine se o parâmetro redirect_uri tem um dos seguintes valores:
  • 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
Veja um exemplo de solicitação de fluxo de redirecionamento do endereço IP de loopback:
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 com suporte

Clientes para dispositivos móveis (Android / iOS)

Se você determinar que seu app está usando o fluxo de endereços IP de loopback com um tipo de cliente OAuth para Android ou iOS, migre para os SDKs para dispositivos móveis do Login do Google (Android e iOS).

O SDK facilita o acesso às APIs do Google e processa todas as chamadas para os endpoints de autorização OAuth 2.0 do Google.

Os links da documentação abaixo fornecem informações sobre como usar os SDKs de Login do Google para acessar as APIs do Google sem usar um URI de redirecionamento de endereço IP de loopback.

Acessar APIs do Google no Android

Acesso (off-line) do lado do servidor
O exemplo abaixo mostra como acessar as APIs do Google no lado do servidor no Android.
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);
}

Consulte o guia de acesso do lado do servidor sobre como acessar as APIs do Google do lado do servidor.

Acessar APIs do Google em um app iOS

Acesso do lado do cliente

Confira no exemplo abaixo 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, incluindo o token de acesso no cabeçalho de uma solicitação REST ou gRPC (Authorization: Bearer ACCESS_TOKEN) ou usando o autorizador de busca (GTMFetcherAuthorizationProtocol) com a biblioteca de cliente de APIs do Google para Objective-C para REST.

Consulte o guia de acesso do lado do cliente sobre como acessar as APIs do Google no lado do cliente. sobre como acessar as APIs do Google no lado do cliente.

Acesso (off-line) do lado do servidor
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
}

Revise o guia de acesso do lado do servidor sobre como acessar as APIs do Google do lado do servidor.

Cliente de aplicativo do Google Chrome

Se você determinar que seu app está usando o fluxo de endereços IP de loopback no cliente do app Chrome, migre para a API Chrome Identity.

O exemplo abaixo mostra como conseguir 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.