Visão geral
Em 16 de fevereiro de 2022, anunciamos planos para deixar as interações do Google OAuth mais seguras com fluxos de OAuth mais seguros. Este guia ajuda a entender as mudanças necessárias e as etapas para migrar do fluxo fora de banda (OOB) do OAuth para alternativas com suporte.
Esse esforço é uma medida de proteção contra ataques de phishing e de personificação de apps durante interações com os endpoints de autorização OAuth 2.0 do Google.
O que é OOB?
O fora de banda (OOB, na sigla em inglês) do OAuth, 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 após um usuário aprovar uma solicitação de consentimento do OAuth. O fluxo OOB representa um risco de phishing remoto, e os clientes precisam migrar para um método alternativo de proteção contra essa vulnerabilidade.O fluxo OOB está sendo descontinuado para todos os tipos de clientes, 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 conformidade
- 28 de fevereiro de 2022: novo uso do OAuth bloqueado para o fluxo OOB
- 5 de setembro de 2022: uma mensagem de aviso voltada ao usuário pode ser exibida para solicitações OAuth que não estão em conformidade
- 3 de outubro de 2022: o fluxo OOB vai ser 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)
Uma mensagem de erro voltada ao usuário será exibida para as solicitações não compatíveis. 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.
- Determine se você será afetado.
- Migre para uma alternativa mais segura se isso afetar você.
Como descobrir se você será afetado
Essa suspensão de uso é aplicável apenas a apps de produção, ou seja, apps com status de publicação definido como Em produção. O fluxo continuará funcionando para apps com o status de publicação de testes.
Revise o status de publicação no Consent Screen pagedo OAuth de Google API Console e avance 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 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 seu app está fazendo está usando um valor de URI de redirecionamento OOB.
Inspecionar o código do aplicativo
redirect_uri
tem um dos
seguintes valores:
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>
Inspecionar chamada de rede de saída
- Aplicativo da Web: inspecione a atividade de rede no Chrome
- Android: inspecione o tráfego de rede com o Network Inspector
-
Apps do Chrome
- Acesse a página de Extensões do Chrome.
- Marque a caixa de seleção Modo de desenvolvedor no canto superior direito da página da 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 da extensão.
- Será aberto um pop-up de Ferramentas para desenvolvedores, onde você pode monitorar o tráfego de rede na guia "Rede".
- iOS: Como analisar o tráfego HTTP com instrumentos
- Universal Windows Platform (UWP): inspecione o tráfego de rede no Visual Studio
- Apps para computador: use uma ferramenta de captura de rede disponível para o sistema operacional para que o app foi desenvolvido
redirect_uri
tem um dos
seguintes valores:
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>
Migre para uma alternativa segura
Clientes para dispositivos móveis (Android / iOS)
Se você determinar que seu app está usando o fluxo OOB com um tipo de cliente OAuth para Android ou 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 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 OOB.
Acessar APIs do Google no Android
Acesso (off-line) do lado do servidor
O exemplo abaixo mostra como acessar 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 para saber como acessar as APIs do Google do lado do servidor.
Acessar 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 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 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 aplicativo do Google Chrome
Se você determinar que seu app está usando o fluxo OOB 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 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 mais informações sobre como acessar usuários autenticados e chamar Google endpoints com a API Chrome Identity.
App da Web
Se você determinar que seu app está usando o fluxo OOB para um aplicativo da Web, migre para uma das nossas bibliotecas de cliente da API do Google. Veja aqui as bibliotecas de cliente para diferentes linguagens de programação.
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)
- Coloque um servidor em execução e defina um endpoint acessível publicamente (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 usando a 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. }); } } }
Revise o guia de apps da Web do lado do servidor para saber 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 do 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(...); }
Revise o guia de apps da Web do lado do cliente para saber como acessar as APIs do Google no lado do cliente.
Cliente de desktop
Se você determinar que seu app está usando o fluxo OOB em um cliente de computador,
migre para o
fluxo de endereço IP de loopback (localhost
ou 127.0.0.1
).