Guia de migração de fluxos fora de banda (OOB)

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

Visão geral

Em 16 de fevereiro de 2022, anunciamos planos para tornar as interações do OAuth do Google mais seguras usando fluxos do OAuth mais seguros. Este guia ajuda a entender as mudanças necessárias e as etapas para migrar do fluxo out-of-band (OOB) do OAuth para alternativas compatíveis.

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

O que é OOB?

O OAuth fora da banda (OOB, na sigla em inglês), também conhecido como opção de copiar/colar manual, é um fluxo legado desenvolvido para oferecer suporte a clientes nativos que não têm um URI de redirecionamento para aceitar as credenciais depois que um usuário aprova uma solicitação de consentimento OAuth. O fluxo OOB representa um risco remoto de phishing, e os clientes precisam migrar para um método alternativo de proteção contra essa vulnerabilidade.

O fluxo de OOB será descontinuado para todos os tipos de cliente, ou seja, apps da Web, Android, iOS, Plataforma Universal do Windows (UWP), apps do Chrome, TVs e dispositivos de entrada limitada, apps para computador.

Principais datas de compliance

  • 28 de fevereiro de 2022: novo uso do OAuth bloqueado para o fluxo de OOB
  • 5 de setembro de 2022: uma mensagem de aviso voltada para o usuário poderá ser exibida para solicitações OAuth que não estiverem em conformidade
  • 3 de outubro de 2022: o fluxo de OOB foi descontinuado para clientes OAuth criados antes de 28 de fevereiro de 2022
  • 31 de janeiro de 2023: todos os clientes atuais serão bloqueados, incluindo os isentos. Os clientes podem solicitar uma extensão única para continuar usando o fluxo de OOB até 31 de janeiro de 2023, conforme instruído na mensagem de e-mail enviada aos clientes afetados.

Uma mensagem de alerta voltada ao usuário pode ser exibida para solicitações não compatíveis um mês antes, ou seja, 5 de setembro de 2022, o fluxo de OOB foi totalmente descontinuado. A mensagem informará aos usuários que o app pode ser bloqueado em breve ao exibir o e-mail de suporte que você registrou na tela de permissão OAuth no Console de APIs do Google.

É possível confirmar a mensagem de aviso voltada para o usuário e suprimir ela passando um parâmetro de consulta na chamada de autorização, conforme mostrado abaixo:
  • Acesse o código do app em que as solicitações são enviadas para o endpoint de autorização do OAuth 2.0 do Google.
  • Adicione um parâmetro ack_oob_shutdown com um valor de data de aplicação: 2022-10-03 à solicitação de fluxo de redirecionamento. Exemplo:
    ack_oob_shutdown=2022-10-03
Há duas etapas principais para concluir o processo de migração:
  1. Determine se você será afetado.
  2. Migre para uma alternativa mais segura se você for afetado.

Determine se você será afetado

Essa descontinuação só é aplicável a apps de produção, ou seja, apps com status de publicação definido como Em produção. O fluxo continuará a funcionar em apps com o status de publicação de teste.

Revise o status de publicação no Consent Screen page OAuth do Google API Console e prossiga para a próxima etapa se estiver usando o fluxo de OOB em um projeto com status de publicação "Em produção".

Como determinar se o app está usando o fluxo de OOB

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 que o app está fazendo está usando um valor de URI de redirecionamento OOB.

Inspecionar o código do aplicativo

Revise a seção do código do aplicativo em que você faz chamadas para os endpoints de autorização do Google OAuth e determine se o parâmetro redirect_uri tem algum dos valores a seguir:
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
  • redirect_uri=oob
Uma solicitação de fluxo de redirecionamento OOB será semelhante a esta:
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>

Inspecionar chamadas de rede realizadas

O método de inspeção de chamadas de rede varia de acordo com o tipo de cliente do aplicativo.
Ao inspecionar chamadas de rede, procure solicitações enviadas para os endpoints de autorização do OAuth do Google e determine se o parâmetro redirect_uri tem algum dos valores a seguir:
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
  • redirect_uri=oob
Uma amostra de solicitação de fluxo de redirecionamento OOB será semelhante a esta:
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>

Migrar para uma alternativa segura

Clientes móveis (Android / iOS)

Se você determinar que seu app usa o fluxo de OOB com um tipo de cliente OAuth do Android ou do iOS, migre para os SDKs para dispositivos móveis do Login do Google (Android, iOS).

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

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

Acessar APIs do Google no Android

Acesso do lado do servidor (off-line)
O exemplo abaixo mostra como acessar as APIs do Google do 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 as APIs do Google em um app iOS

Acesso do lado do cliente

O exemplo abaixo mostra como acessar APIs do Google no lado do cliente para 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 do fetcher (GTMFetcherAuthorizationProtocol) com a biblioteca de cliente das 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 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 sobre como acessar as APIs do Google do lado do servidor.

Cliente de apps do Chrome

Se você determinar que seu app usa o fluxo de OOB no cliente do app Chrome, migre para a API Chrome Identity.

O exemplo abaixo mostra como conseguir todos os contatos do usuário sem o uso de um URI de redirecionamento 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)
    });
   });
 });
};

Consulte o guia da API Chrome Identity para ver mais informações sobre como acessar usuários de autenticação e chamar endpoints do Google com a API Chrome Identity.

App da Web

Se você determinar que seu app usa o fluxo de OOB para um aplicativo da Web, migre para uma das nossas bibliotecas de cliente da API do Google. As bibliotecas de clientes para diferentes linguagens de programação estão listadas aqui.

As bibliotecas facilitam o acesso às APIs do Google e processam todas as chamadas para os endpoints do Google.

Acesso do lado do servidor (off-line)
O modo de acesso do lado do servidor (off-line) requer o seguinte:
  • Coloque um servidor e defina um endpoint de acesso público (o URI de redirecionamento) para receber o código de autorização.
  • Configure o URI de redirecionamento no Credentials page do Google API Console

O snippet de código abaixo mostra um exemplo de NodeJS de uso da API Google Drive para listar os arquivos do Google Drive de um usuário no lado do servidor sem usar um URI de redirecionamento 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.
      });
    }
  }
}

Leia o guia do app da Web do lado do servidor sobre como acessar as APIs do Google do lado do servidor.

Acesso do lado do cliente

O snippet de código abaixo, em JavaScript, mostra um exemplo de como usar a API Google para acessar eventos da agenda do usuário no lado do cliente.


// 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(...);
}

Leia o guia do app da Web do lado do cliente sobre como acessar as APIs do Google do lado do cliente.

Cliente de computador

Se você determinar que seu app usa o fluxo de OOB em um cliente para computador, migre para o fluxo de endereço IP de loopback (localhost ou 127.0.0.1).