Usar o App Check para proteger sua chave da API Maps JavaScript

1. Antes de começar

Uma página mostrando o aplicativo em funcionamento

O que você vai criar.

Neste codelab, você vai usar o App Check para adicionar outra camada de proteção à sua chave de API usada em um ambiente da Web.

Especificamente, as seguintes etapas serão seguidas no codelab para unir a funcionalidade:

  • Crie uma página da Web para hospedar um mapa usando a API Javascript da Plataforma Google Maps.
  • Hospede a página para que ela possa ser acessada on-line.
  • Restrinja os domínios e as APIs que podem usar a API com o Console do Cloud.
  • Adicione e inicialize a biblioteca do App Check pelo Firebase.
  • Adicione o provedor de atestado para verificar a validade dos aplicativos.
  • Forçar a verificação no app e no monitor.

Ao final do codelab, você terá um site funcional que aplica a segurança nas chaves de API usadas, nos domínios de acesso e nos tipos de aplicativos que podem usá-las.

2. Pré-requisitos

Para ativar o App Check, é necessário usar três serviços do Google para oferecer proteção. Familiarize-se com essas áreas.

Firebase: oferece a aplicação dos serviços que verificam se as chaves de API estão sendo referenciadas nos domínios adequados. Isso também vai fornecer a funcionalidade de hospedagem e implantação usando o Firebase Studio.

reCAPTCHA: oferece a funcionalidade para verificar se humanos estão usando o aplicativo e também fornece as chaves pública e privada para conectar o Firebase ao domínio do aplicativo cliente.

Google Cloud Platform: fornece as chaves de API usadas pela Plataforma Google Maps e pelo Firebase, além da restrição no domínio usando a chave do Maps.

Confira como tudo isso funciona junto no diagrama de arquitetura a seguir:

Uma visão geral da arquitetura do sistema

Ao usar o App Check e a Plataforma Google Maps, os seguintes elementos trabalham juntos para determinar se as solicitações vêm de um aplicativo e um usuário válidos, usando o atestado fornecido por um provedor de atestado, neste caso, o reCAPTCHA.

Isso é feito usando o SDK do App Check fornecido pelo Firebase, que verifica a validade do aplicativo de chamada e fornece um token para o aplicativo com que as chamadas subsequentes à API JavaScript da Plataforma Google Maps são feitas. Por sua vez, a API JavaScript da Plataforma Google Maps verifica a validade do token fornecido com o Firebase para garantir que ele venha do domínio correto e do provedor de atestado de um usuário válido.

Saiba mais sobre como usar o App Check e a API Maps JavaScript neste local e familiarize-se com as etapas necessárias.

https://developers.google.com/maps/documentation/javascript/maps-app-check

3. Começar a configuração

Se você ainda não tiver uma conta do Google Cloud, configure uma com o faturamento ativado no início. Siga as instruções para criar isso antes de começar.

Configurar a Plataforma Google Maps

Caso você ainda não tenha uma conta do Google Cloud Platform e um projeto com faturamento ativado, veja como criá-los no guia da Plataforma Google Maps.

  1. No Console do Cloud, clique no menu suspenso do projeto e selecione o projeto que você quer usar neste codelab.

  1. Ative as APIs e os SDKs da Plataforma Google Maps necessários para este codelab no Google Cloud Marketplace. Para fazer isso, siga as etapas descritas neste vídeo ou nesta documentação.
  2. Gere uma chave de API na página Credenciais do Console do Cloud. Siga as etapas indicadas neste vídeo ou nesta documentação. Todas as solicitações à Plataforma Google Maps exigem uma chave de API.

Outros requisitos para o codelab

Para concluir este codelab, você precisará das seguintes contas, serviços e ferramentas:

  • Conhecimento básico de JavaScript, HTML e CSS
  • Uma conta do Google Cloud com o faturamento ativado (como mencionado)
  • Uma chave de API da Plataforma Google Maps com a API Maps JavaScript ativada. Isso será feito durante o codelab.
  • Conhecimento básico de hospedagem e implantação na Web (você vai receber orientações sobre isso no codelab). Isso será feito pelo console do Firebase e pelo Firebase Studio.
  • Um navegador da Web para visualizar os arquivos enquanto trabalha.

4. Criar uma página no Firebase Studio

Este codelab não pressupõe que você já tenha um aplicativo criado e usa o Firebase Studio para criar uma página que hospede o aplicativo de mapa e o implante no Firebase para fins de teste. Se você tiver um aplicativo, também poderá usá-lo. Basta mudar os domínios de host, snippets de código e chaves de API adequados para garantir a implementação correta.

Acesse o Firebase Studio (requer uma Conta do Google) e crie um novo aplicativo HTML simples. Talvez seja necessário clicar no botão "Ver todos os modelos" para mostrar essa opção ou apenas clicar neste link para acesso direto.

Imagem mostrando o modelo HTML simples

Dê um nome adequado ao espaço de trabalho, como myappcheck-map (mais um número aleatório para exclusividade, que será adicionado automaticamente). O Firebase Studio vai criar o espaço de trabalho.

Imagem mostrando as novas opções do Workspace

Depois de preencher o nome, clique no botão "Criar" para iniciar o processo de criação do projeto.

Imagem mostrando a caixa de diálogo de criação de projeto

Depois de criado, substitua o texto no arquivo index.html pelo código a seguir, que cria uma página com um mapa.

<!doctype html>
<html>

<head>
 <title>Secure Map</title>
 <style>
   #map {
     height: 100%;
   }

   html,
   body {
     height: 100%;
     margin: 0;
     padding: 0;
     font-family: Arial, Helvetica, sans-serif;
   }
 </style>
</head>

<body>
 <h3>App Check Security Demo</h3>
 <!--The div element for the map -->
 <div id="map"></div>
 <script>
   (g => { var h, a, k, p = "The Google Maps JavaScript API", c = "google", l = "importLibrary", q = "__ib__", m = document, b = window; b = b[c] || (b[c] = {}); var d = b.maps || (b.maps = {}), r = new Set, e = new URLSearchParams, u = () => h || (h = new Promise(async (f, n) => { await (a = m.createElement("script")); e.set("libraries", [...r] + ""); for (k in g) e.set(k.replace(/[A-Z]/g, t => "_" + t[0].toLowerCase()), g[k]); e.set("callback", c + ".maps." + q); a.src = `https://maps.${c}apis.com/maps/api/js?` + e; d[q] = f; a.onerror = () => h = n(Error(p + " could not load.")); a.nonce = m.querySelector("script[nonce]")?.nonce || ""; m.head.append(a) })); d[l] ? console.warn(p + " only loads once. Ignoring:", g) : d[l] = (f, ...n) => r.add(f) && u().then(() => d[l](f, ...n)) })({
     key: "YOUR_API_KEY",
     v: "weekly",
     // Use the 'v' parameter to indicate the version to use (weekly, beta, alpha, etc.).
     // Add other bootstrap parameters as needed, using camel case.
   });
 </script>
 <script>
   let map;
   async function initMap() {
     const { Map } = await google.maps.importLibrary("maps");
     map = new Map(document.getElementById("map"), {
       center: { lat: 51.5208, lng: -0.0977 },
       zoom: 17,
     });
   }
   initMap();
 </script>
</body>

</html>

Ao executar, o should vai mostrar uma página com um mapa do aplicativo em funcionamento, como mostrado na imagem, mas!

Imagem mostrando o aplicativo em funcionamento.

Quando a página for carregada, um erro vai aparecer porque ela precisa de uma chave de API da Plataforma Google Maps, que será adicionada em uma seção posterior.

Imagem mostrando a notificação &quot;Algo deu errado&quot;.

A mensagem de erro real pode ser vista no console da Web do Firebase Studio.

Mensagem de erro de chave inválida.

Para corrigir isso, precisamos adicionar uma chave de API à página. A chave de API é a maneira como a página e a implementação da API Maps JavaScript estão vinculadas. Também é uma área de exploração, já que precisa estar contida na página de maneira não criptografada, em que a chave de API pode ser extraída e usada em sites diferentes.

Um método de proteção é o uso de restrições de aplicativo, seja pelo tipo de aplicativo usado ou pelo domínio ou endereço IP de referência chamado. Saiba mais sobre as práticas recomendadas neste site:

https://developers.google.com/maps/api-security-best-practices#rec-best-practices

ou pelo uso de chamadas diretas da linha de comando ou do servidor, aplicativos que não têm como fornecer um referenciador ou serem rastreados, sendo potencialmente uma falha de segurança.

5. Criar um aplicativo do Firebase

O Firebase é usado para fornecer a funcionalidade de vincular o provedor de atestado para verificar o seguinte:

  • As solicitações vêm do seu app autêntico
  • As solicitações vêm de um dispositivo e uma sessão de usuário autênticos que não foram comprometidos.

Neste codelab, o reCAPTCHA v3 será usado como o provedor dessa declaração.

Crie um aplicativo e um host do Firebase.

Acesse https://firebase.google.com/ e crie um projeto do Firebase usando o link Acessar console.

Imagem mostrando o link do console

Clique na área a seguir para criar um projeto.

Crie um novo projeto do Firebase.

Escolha um nome para o projeto, como Meu projeto do App Check. Não precisa ser o mesmo nome usado antes, já que é apenas para referência. O nome real do projeto pode ser editado logo abaixo do texto. Ele será composto pelo nome inserido e, se não for exclusivo, terá um número adicionado.

Imagem mostrando detalhes para inserir o nome do projeto.

Se você receber uma solicitação para adicionar outros serviços (como o Google Analytics) ao aplicativo, aceite ou não. No entanto, para este codelab, eles não são necessários e podem ser deixados de fora.

Clique no botão "Criar projeto" e aguarde a criação. Você vai receber uma notificação quando esse processo for concluído.

Imagem mostrando a caixa de diálogo de criação do projeto.

Clique em "Continuar" quando estiver tudo pronto para começar a interagir com o projeto.

Imagem mostrando a caixa de diálogo de projeto concluído.

Na página principal, você pode começar adicionando o Firebase ao seu app e escolhendo a opção "Web".

Comece adicionando.

Escolha configurar o Firebase Hosting no seu site para que os arquivos sejam enviados após a implantação. Para seu site real, você pode usar sua própria opção, mas para acompanhar este codelab, você vai implantar no Firebase Hosting.

Registre o novo aplicativo.

Clique em "Registrar app" para criar o aplicativo. Em seguida, você vai usar o script criado para referenciar o projeto no Firebase do seu aplicativo da Web.

O código de configuração do Firebase na próxima guia será usado no aplicativo para conectar o Firebase e as APIs Maps. Por isso, vale a pena copiar da seção "Usar a tag de script". que você vai colar no index.html do projeto.

Tag de script a ser incluída na página.

Clique em "Próxima" para as outras seções e confira o app criado na seção de configurações do projeto no site.

Se você precisar voltar e encontrar os detalhes da configuração em uma data posterior, também poderá encontrar os detalhes do app no botão "Configurações", como mostrado abaixo:

Item de menu &quot;Configurações do projeto&quot;.

Antes de sair desta seção, anote o domínio do site de hospedagem do Firebase criado para uso posterior com o reCAPTCHA. Isso permite que o nome do site seja vinculado ao provedor de atestado, ou seja, apenas solicitações desse site serão verificadas.

Acesse a seção de hospedagem nos atalhos do projeto ou no menu "Build" à esquerda.

Imagem mostrando o atalho de hospedagem. ou Imagem mostrando o menu de build de hospedagem.

Na seção, procure o domínio criado para o aplicativo. Talvez seja necessário clicar em algumas telas para configurar o recurso, se ele ainda não tiver sido configurado.

Imagem mostrando a caixa de diálogo do domínio de hospedagem.

6. Proteger chaves de API

Acesse o console do Cloud na mesma conta em que você está usando o Firebase para conferir o projeto criado.

link

Imagem mostrando o link do Console do Cloud

Se você tiver vários projetos, use o menu suspenso ou a caixa de pesquisa para selecionar o correto, com o nome do seu projeto do Firebase.

Imagem mostrando a lista &quot;Selecionar projeto&quot;

Isso vai abrir o projeto recém-criado. Agora você vai adicionar a API Maps JavaScript a esse projeto para que ela possa ser usada nele, incluindo a restrição do uso a uma chave de API e um domínio de hospedagem específicos.

Imagem mostrando a página de recepção do projeto.

Use o menu à esquerda para ativar as APIs Maps no projeto. Selecione a opção "APIs e serviços" e "APIs e serviços ativados".

Imagem mostrando o menu &quot;Ativar APIs&quot; em uso.

Selecione a opção "ATIVAR APIS E SERVIÇOS".

Imagem mostrando o menu &quot;Selecionar e ativar APIs&quot;.

Digite "API Maps JavaScript" na caixa de pesquisa.

Imagem mostrando a caixa de pesquisa da API

Selecione o resultado correspondente.

Imagem mostrando a caixa &quot;Selecionar API correspondente&quot;

Em seguida, clique em "Ativar" na API para adicioná-la ao projeto. Isso pode já ter sido feito se você usou esse projeto antes.

Imagem mostrando a caixa &quot;Ativar API correspondente&quot;

Depois de ativar essa opção, você pode adicionar e restringir uma chave de API, mas por enquanto vamos pular essa etapa.

Usando novamente as opções do menu à esquerda, volte para a seção "API e serviços" e selecione a chave do navegador criada para você.

Imagem mostrando a restrição de APIs.

Adicione a API Maps JavaScript a uma das restrições de API.

Selecione a API Maps para filtrar.

Para chaves em um aplicativo ativo, você também colocaria uma limitação no domínio que estava hospedando o aplicativo. Faça isso agora usando o domínio criado para você no Firebase. Adicione também /* ao final do domínio para garantir que ele cubra todos os caminhos abaixo dele.

Domínio a ser restringido.

Para mais detalhes sobre como ativar essa opção, consulte o seguinte local para saber mais sobre como restringir chaves de API.

https://developers.google.com/maps/api-security-best-practices#restricting-api-keys

7. Criar secrets do reCAPTCHA

A próxima etapa é criar um projeto do reCAPTCHA para fornecer a declaração e as chaves do cliente e do servidor.

Acesse o site do reCAPTCHA em https://www.google.com/recaptcha/ e clique no botão "Começar".

Imagem mostrando &quot;Comece a usar o reCAPTCHA&quot;.

Em seguida, registre um novo site e insira o domínio correto para restringir.

Imagem mostrando o registro do site do reCAPTCHA.

Verifique também se você selecionou o mesmo projeto do Google Cloud que o Firebase criou, caso tenha mais de um.

Isso cria duas chaves: uma secreta, que você vai inserir no console do Firebase e que nunca deve ser colocada em nenhuma página ou aplicativo que possa ser visualizado publicamente, e uma chave de site, que será usada no aplicativo da Web.

Imagem mostrando a página de chaves reCAPTCHA.

Mantenha esta página aberta, porque você vai precisar dela. Clique no botão "Copiar chave secreta" e volte ao site do Firebase.

8. Adicionar o reCAPTCHA ao Firebase

No console de administrador do Firebase, acesse os itens do menu à esquerda. No item de menu Build, escolha App Check.

Imagem mostrando o menu de build do Hosting.

A lista de serviços não pode ser ativada até que um app seja registrado. Isso foi criado anteriormente quando a hospedagem foi adicionada ao site. Clique em "Começar" se precisar configurar isso.

Clique na guia "App", abra o app da Web, insira o segredo que você copiou do site do reCAPTCHA e clique em "Salvar".

Imagem mostrando a entrada do segredo

Agora, uma marca de seleção verde vai aparecer ao lado do provedor do reCAPTCHA. Agora, esse aplicativo da Web pode usar o reCAPTCHA para atestar se um usuário ou site está chamando o serviço corretamente.

Marca de seleção verde mostrando que o reCAPTCHA está ativado

Na guia "APIs", agora vai aparecer que a API da Plataforma Google Maps está ativa, mas não aplicada.

O App Check está ativo, mas não aplicado.

Agora você vinculou o segredo do reCAPTCHA ao projeto do Firebase e pode adicionar o código à página da Web para corresponder a chave do site ao provedor certo para uso com o aplicativo Maps.

A chave de site é verificada pelo reCAPTCHA para corresponder à chave secreta. Depois disso, ela confirma que a página de chamada está correta, e o App Check fornece um token que pode ser usado por chamadas subsequentes à API JavaScript do Maps. Sem essa declaração, o token não será fornecido, e as solicitações não poderão ser validadas.

9. Adicione a verificação à página e faça a implantação.

Volte ao console do Cloud e copie a chave de API necessária para usar a API Maps.

Você pode encontrar essa informação no menu lateral do console, em "APIs e serviços" e na opção "Credenciais".

Imagem mostrando o menu &quot;Credenciais&quot;.

Nela, você pode selecionar a chave do navegador atual (embora, como observado, seja possível usar outra chave ou criar uma nova).

Imagem mostrando a opção &quot;Chave do navegador atual&quot;.

Clique no botão "Mostrar chave" e copie a chave da janela de diálogo exibida.

Volte ao projeto do Firebase Studio em que a página HTML criada foi aberta anteriormente. Agora você pode adicionar a chave de API à página para que a API Maps funcione onde a página tem "YOUR_API_KEY".

Atualizar a chave de API

Quando você executar a página novamente, uma mensagem de erro diferente vai aparecer.

Mensagem de erro &quot;Referenciador não permitido&quot;

Isso significa que o domínio de desenvolvimento em que você está hospedando a página não é permitido. Só adicionamos o domínio implantado. Vamos precisar publicar esse site no domínio correto usando o Firebase Hosting. Confira mais detalhes neste link:

Implantar com o Firebase Hosting

e este vídeo

Crie, teste e implante seus apps da Web do Firebase mais rápido no Project IDX

Erro de faturamento não ativado.

Mais detalhes podem ser encontrados em Erros de carregamento de mapa no site da API Maps JavaScript.

Se você tiver o RefererNotAllowedMapError, corrija isso implantando a página no domínio correto.

Volte ao Firebase Studio e clique no ícone "Firebase Studio". Ele pode estar no lado esquerdo ou direito, dependendo da opção configurada. Assim, as opções de hospedagem vão aparecer.

Imagem mostrando o ícone do Firebase Studio.

Neste codelab, você precisará "Hospedar o app com o Firebase" para conectar sua instância do Firebase ao aplicativo do Studio.

Opção de hospedagem com o Firebase.

Em seguida , clique em Autenticar Firebase para iniciar o processo de autenticação. Isso permite que sua conta automatize a hospedagem com o back-end no Studio.

Imagem mostrando a opção &quot;Autenticar Firebase&quot;.

Siga as instruções na janela de comando para autorizar a implantação.

Imagem mostrando instruções de autenticação.

Siga as instruções na tela (incluindo abrir uma nova janela), copie o código de autorização quando solicitado e cole-o na janela de comando do Firebase Studio.

Imagem mostrando o código de autorização do Firebase.

Confira mais detalhes sobre esse processo aqui:

https://firebase.google.com/docs/studio/deploy-app

Depois disso, clique em "Inicializar o Firebase Hosting" para vincular o projeto ao projeto do Firebase.

Selecione "Usar um projeto existente" e escolha o projeto que você criou na seção anterior. Aceite o restante dos padrões. Seu exemplo pode variar dependendo do nome escolhido ao configurar o projeto.

Configuração do projeto do Firebase Hosting.

Volte para a visualização do explorador e substitua o arquivo index.html criado no diretório público pelo que você já tinha no diretório raiz.

Imagem mostrando a estrutura de arquivos de hospedagem.

Agora você pode voltar para a barra lateral do Firebase Studio e implantar o site em produção.

Imagem mostrando &quot;Implantando na produção&quot;.

Isso vai mostrar as etapas de implantação no console.

Imagem mostrando as etapas da implantação.

Abra o site implantado no URL de hospedagem mostrado (neste caso, https://my-app-check-project.web.app/, mas será diferente para seu projeto).

O aplicativo vai mostrar o mapa na página enquanto as APIs funcionam para os domínios em uso.

Imagem mostrando o menu de build do Hosting.

Agora há uma página funcional, com restrições feitas ao tipo de APIs que podem ser usadas com a chave de API e também aos domínios em que a chave de API pode ser usada. A próxima etapa é bloquear o acesso apenas a esse domínio. Para isso, adicione a seção de script do Firebase gerada anteriormente para proteger a página usando o App Check. Isso será feito na próxima seção.

10. Página segura

Embora a página atual proteja a chave de API para o domínio, ela não adiciona a etapa de comprovação para garantir que ela esteja sendo usada pelo aplicativo correto e por uma pessoa. A chave ainda pode ser roubada e usada por um usuário malicioso. Para interromper isso, a configuração, o provedor e a chave do site do Firebase precisam ser adicionados à página para receber o token correto do cliente.

Você também pode ver que o uso da API Maps está sendo rastreado no Firebase. Como não está usando tokens corretos, ele está fazendo solicitações não verificadas.

Os detalhes de conexão necessários podem ser obtidos no projeto do Firebase.

Acesse os detalhes do Firebase no console, que contém os detalhes de configuração do Firebase. Acesse a página de configurações do projeto no Firebase e, na seção CDN do app, pegue a seção de código para a configuração da CDN (a mais simples).

No projeto do Firebase, escolha a engrenagem para mostrar as configurações do projeto.

Imagem mostrando as configurações do projeto do Firebase

Isso abre a seguinte página, que contém os detalhes na seção "Geral", em "Seus apps".

Configurações de configuração do app Firebase.

Copie isso para a página do Firebase Studio (public/index.html) que contém o mapa e está hospedada. que vai ficar assim (com seus detalhes, não exatamente os deste arquivo):

<!doctype html>
<html>

<head>
 <title>Secure Map</title>
 <style>
   #map {
     height: 100%;
   }

   html,
   body {
     height: 100%;
     margin: 0;
     padding: 0;
     font-family: Arial, Helvetica, sans-serif;
   }
 </style>
</head>

<body>
 <h3>App Check Security Demo</h3>
 <!--The div element for the map -->
 <div id="map"></div>
 <script>
   (g => { var h, a, k, p = "The Google Maps JavaScript API", c = "google", l = "importLibrary", q = "__ib__", m = document, b = window; b = b[c] || (b[c] = {}); var d = b.maps || (b.maps = {}), r = new Set, e = new URLSearchParams, u = () => h || (h = new Promise(async (f, n) => { await (a = m.createElement("script")); e.set("libraries", [...r] + ""); for (k in g) e.set(k.replace(/[A-Z]/g, t => "_" + t[0].toLowerCase()), g[k]); e.set("callback", c + ".maps." + q); a.src = `https://maps.${c}apis.com/maps/api/js?` + e; d[q] = f; a.onerror = () => h = n(Error(p + " could not load.")); a.nonce = m.querySelector("script[nonce]")?.nonce || ""; m.head.append(a) })); d[l] ? console.warn(p + " only loads once. Ignoring:", g) : d[l] = (f, ...n) => r.add(f) && u().then(() => d[l](f, ...n)) })({
     key: "YOUR_API_KEY",
     v: "weekly",
     // Use the 'v' parameter to indicate the version to use (weekly, beta, alpha, etc.).
     // Add other bootstrap parameters as needed, using camel case.
   });
 </script>
 <script type="module">
   // Import the functions you need from the SDKs you need
   import { initializeApp } from "https://www.gstatic.com/firebasejs/12.2.1/firebase-app.js";

   const firebaseConfig = {
     apiKey: "YOUR_API_KEY",
     authDomain: "appcheck-map.firebaseapp.com",
     projectId: "appcheck-map",
     storageBucket: "appcheck-map.firebasestorage.app",
     messagingSenderId: "YOUR_SENDER_KEY",
     appId: "YOUR_APP_ID"
   };
    // Initialize Firebase
   const app = initializeApp(firebaseConfig);

   let map;
   async function initMap() {
     const { Map } = await google.maps.importLibrary("maps");
     map = new Map(document.getElementById("map"), {
       center: { lat: 51.5208, lng: -0.0977 },
       zoom: 17,
     });
   }
   initMap();
 </script>
</body>

</html>

Agora que o Firebase foi adicionado ao nosso aplicativo, as chamadas para a biblioteca reCAPTCHA usam a chave do site fornecida que você recebeu anteriormente do site do reCAPTCHA (de antes).

Imagem mostrando a entrada da chave do site reCAPTCHA.

Para mais detalhes sobre como adicionar essas seções, consulte a seguinte página de documentação do Maps:

https://developers.google.com/maps/documentation/javascript/maps-app-check

Adicione a biblioteca do App Check à página, carregue as funções para inicializar o App Check com a configuração do Firebase e receba o token usando o ReCaptchaV3Provider.

Primeiro, importe a biblioteca do App Check:

       import {
           getToken,
           initializeAppCheck,
           ReCaptchaV3Provider,
       } from "https://www.gstatic.com/firebasejs/12.2.1/firebase-app-check.js";

Em seguida, adicione o código para inicializar o App Check com a configuração do Firebase e o provedor reCAPTCHA usando o token do site.

       // Get App Check Token
       const appCheck = initializeAppCheck(app, {
           provider: new ReCaptchaV3Provider('<INSERT SITE KEY>'),
           isTokenAutoRefreshEnabled: true,
       });

Por fim, anexe uma função ao controle de mapa usando a função de configurações da biblioteca principal do Maps para receber um token. Isso fará as solicitações de token conforme necessário pelo controle do mapa, dependendo da duração do token.

       const { Settings } = await google.maps.importLibrary('core');
     Settings.getInstance().fetchAppCheckToken = () =>
           getToken(appCheck, /* forceRefresh = */ false);

O arquivo completo é este:

<!doctype html>
<html>

<head>
 <title>Secure Map</title>
 <style>
   #map {
     height: 100%;
   }

   html,
   body {
     height: 100%;
     margin: 0;
     padding: 0;
     font-family: Arial, Helvetica, sans-serif;
   }
 </style>
</head>

<body>
 <h3>App Check Security Demo</h3>
 <!--The div element for the map -->
 <div id="map"></div>
 <script>
   (g => { var h, a, k, p = "The Google Maps JavaScript API", c = "google", l = "importLibrary", q = "__ib__", m = document, b = window; b = b[c] || (b[c] = {}); var d = b.maps || (b.maps = {}), r = new Set, e = new URLSearchParams, u = () => h || (h = new Promise(async (f, n) => { await (a = m.createElement("script")); e.set("libraries", [...r] + ""); for (k in g) e.set(k.replace(/[A-Z]/g, t => "_" + t[0].toLowerCase()), g[k]); e.set("callback", c + ".maps." + q); a.src = `https://maps.${c}apis.com/maps/api/js?` + e; d[q] = f; a.onerror = () => h = n(Error(p + " could not load.")); a.nonce = m.querySelector("script[nonce]")?.nonce || ""; m.head.append(a) })); d[l] ? console.warn(p + " only loads once. Ignoring:", g) : d[l] = (f, ...n) => r.add(f) && u().then(() => d[l](f, ...n)) })({
     key: "YOUR_API_KEY",
     v: "weekly",
     // Use the 'v' parameter to indicate the version to use (weekly, beta, alpha, etc.).
     // Add other bootstrap parameters as needed, using camel case.
   });
 </script>
 <script type="module">
   import { initializeApp } from "https://www.gstatic.com/firebasejs/12.2.1/firebase-app.js";

   import {
     getToken,
     initializeAppCheck,
     ReCaptchaV3Provider,
   } from "https://www.gstatic.com/firebasejs/12.2.1/firebase-app-check.js";

   const firebaseConfig = {
     apiKey: "YOUR_API_KEY",
     authDomain: "appcheck-map.firebaseapp.com",
     projectId: "appcheck-map",
     storageBucket: "appcheck-map.firebasestorage.app",
     messagingSenderId: "YOUR_SENDER_KEY",
     appId: "YOUR_APP_ID"
   };

   // Initialize Firebase
   const app = initializeApp(firebaseConfig);

   // Get App Check Token
   const appCheck = initializeAppCheck(app, {
     provider: new ReCaptchaV3Provider('<INSERT SITE KEY>'),
     isTokenAutoRefreshEnabled: true,
   });

   let map;
   async function initMap() {
     const { Map } = await google.maps.importLibrary("maps");

     const { Settings } = await google.maps.importLibrary('core');
     Settings.getInstance().fetchAppCheckToken = () =>
       getToken(appCheck, /* forceRefresh = */ false);

     map = new Map(document.getElementById("map"), {
       center: { lat: 51.5208, lng: -0.0977 },
       zoom: 17,
     });
   }
   initMap();
 </script>
</body>

</html>

Implante isso no site do Firebase usando o Firebase Studio e execute a página.

11. Aplicar o monitoramento

Agora que a página está configurada, quando ela for executada, você vai ver que ela está sendo verificada. Volte ao console do Firebase e abra a seção "App Check" novamente. O App Check agora vai monitorar a API Maps JavaScript.

Verificando se o monitoramento está ativado.

Ao abrir a janela, você vai ver que os clientes estão fazendo solicitações e que o atestado está funcionando (mostrado por solicitações "verificadas" em azul-escuro no gráfico). Outras solicitações vão mostrar chamadas durante a fase de desenvolvimento antes da conclusão da verificação.

Gráfico mostrando solicitações verificadas.

Agora que os clientes estão funcionando, é possível ativar a aplicação no site para garantir que as chaves de API não possam ser usadas em um aplicativo cliente inválido. Clique no botão "Aplicar" para iniciar a aplicação.

Imagem mostrando o botão de aplicação.

Ao clicar nisso, você vai receber um grande sinal de alerta mostrando que isso vai bloquear seu aplicativo. No mundo real, você só faria isso quando soubesse que todos os seus clientes têm as chaves certas e estão funcionando. Caso contrário, os usuários não poderão acessar o site.

Imagem mostrando a caixa de diálogo de aplicação.

Também pode levar algum tempo para que ela seja aplicada. Isso é indicado na tela. Se você testar a aplicação imediatamente, talvez ela não tenha tido tempo de ser propagada.

15 minutos para aplicar.

Ao fazer a solicitação da página, você vai notar que ela funciona como antes, sem nenhuma mudança no site.

Com o tempo, o número de solicitações verificadas no console vai aumentar, como mostrado aqui:

Gráfico mostrando o aumento das solicitações de verificação.

Para testar se ele está funcionando, volte ao exemplo original no codelab e crie uma nova página sem a funcionalidade de verificação do app. Chame essa página de algo como nocheck.html e coloque-a na pasta pública no mesmo lugar que index.html.

<!doctype html>
<html>

<head>
 <title>Secure Map</title>
 <style>
   #map {
     height: 100%;
   }

   html,
   body {
     height: 100%;
     margin: 0;
     padding: 0;
     font-family: Arial, Helvetica, sans-serif;
   }
 </style>
</head>

<body>
 <h3>App Check Security Demo</h3>
 <!--The div element for the map -->
 <div id="map"></div>
 <script>
   (g => { var h, a, k, p = "The Google Maps JavaScript API", c = "google", l = "importLibrary", q = "__ib__", m = document, b = window; b = b[c] || (b[c] = {}); var d = b.maps || (b.maps = {}), r = new Set, e = new URLSearchParams, u = () => h || (h = new Promise(async (f, n) => { await (a = m.createElement("script")); e.set("libraries", [...r] + ""); for (k in g) e.set(k.replace(/[A-Z]/g, t => "_" + t[0].toLowerCase()), g[k]); e.set("callback", c + ".maps." + q); a.src = `https://maps.${c}apis.com/maps/api/js?` + e; d[q] = f; a.onerror = () => h = n(Error(p + " could not load.")); a.nonce = m.querySelector("script[nonce]")?.nonce || ""; m.head.append(a) })); d[l] ? console.warn(p + " only loads once. Ignoring:", g) : d[l] = (f, ...n) => r.add(f) && u().then(() => d[l](f, ...n)) })({
     key: "YOUR_API_KEY",
     v: "weekly",
     // Use the 'v' parameter to indicate the version to use (weekly, beta, alpha, etc.).
     // Add other bootstrap parameters as needed, using camel case.
   });
 </script>
 <script>
   let map;
   async function initMap() {
     const { Map } = await google.maps.importLibrary("maps");
     map = new Map(document.getElementById("map"), {
       center: { lat: 51.5208, lng: -0.0977 },
       zoom: 17,
     });
   }
   initMap();
 </script>
</body>

</html>

Depois de fazer isso e inserir a chave de API correta, ao solicitar a página (use seu domínio/nocheck.html), você vai encontrar a seguinte caixa de erro cinza.

Erro &quot;Algo deu errado&quot;.

Ao verificar o console, você vai encontrar uma mensagem de erro como esta:

Mensagem de erro de verificação de app inválida

A verificação de app bloqueou a solicitação do mapa na página porque não está mais recebendo o token de verificação de app para o site aplicado.

12. Parabéns!

Parabéns! Você ativou o App Check no seu site.

Uma página mostrando o aplicativo em funcionamento

Você criou um aplicativo que usa o Firebase App Check para garantir que as solicitações venham de um domínio e usuário válidos.

O que você aprendeu

  • Como usar o Firebase Studio para hospedar e implantar uma página da Web.
  • Como usar o console do Cloud para ativar e proteger as APIs da Plataforma Google Maps.
  • Como usar o reCAPTURE para gerar chaves que podem ser usadas para atestar chamadas.
  • Como usar e integrar o Firebase App Check à API Maps JavaScript.
  • Saiba como aplicar e monitorar chamadas para sites protegidos com o Firebase Studio.

A seguir

  • Confira a documentação do App Check para a API Google Maps JavaScript.
  • Saiba mais sobre o App Check no Firebase.
  • Teste outro codelab com o App Check e a API Places do Google Maps.
  • Saiba mais sobre o reCAPTCHA.