Conecte seu aplicativo ao emulador de autenticação

Antes de usar o emulador de autenticação com seu aplicativo, entenda o fluxo de trabalho geral do Firebase Local Emulator Suite e instale e configure o Local Emulator Suite e revise seus comandos CLI .

Este tópico pressupõe que você já esteja familiarizado com o desenvolvimento de soluções do Firebase Authentication para produção. Se necessário, revise a documentação para sua combinação de plataforma e técnica de autenticação .

O que posso fazer com o emulador de autenticação?

O emulador de autenticação fornece emulação local de alta fidelidade dos serviços do Firebase Authentication, fornecendo grande parte da funcionalidade encontrada na produção do Firebase Authentication . Emparelhado com as plataformas Apple, Android e Web Firebase SDKs, o emulador permite:

  • Crie, atualize e gerencie contas de usuário emuladas para testar e-mail/senha, número de telefone/SMS, SMS multifatorial e autenticação de provedor de identidade de terceiros (por exemplo, Google).
  • Visualize e edite usuários emulados
  • Protótipo de sistemas de autenticação de token personalizados
  • Verifique as mensagens relacionadas à autenticação na guia Logs da IU do emulador.

Escolha um projeto do Firebase

O Firebase Local Emulator Suite emula produtos para um único projeto do Firebase.

Para selecionar o projeto a ser usado, antes de iniciar os emuladores, na CLI, execute firebase use em seu diretório de trabalho. Ou você pode passar o sinalizador --project para cada comando do emulador.

O Local Emulator Suite oferece suporte à emulação de projetos reais do Firebase e projetos de demonstração .

Tipo de projeto Características Use com emuladores
Real

Um projeto real do Firebase é aquele que você criou e configurou (provavelmente por meio do console do Firebase).

Projetos reais têm recursos ativos, como instâncias de banco de dados, intervalos de armazenamento, funções ou qualquer outro recurso configurado para esse projeto do Firebase.

Ao trabalhar com projetos reais do Firebase, você pode executar emuladores para qualquer um ou todos os produtos compatíveis.

Para quaisquer produtos que você não esteja emulando, seus aplicativos e código interagirão com o recurso ativo (instância de banco de dados, depósito de armazenamento, função, etc.).

Demonstração

Um projeto de demonstração do Firebase não tem configuração real do Firebase nem recursos ativos. Esses projetos geralmente são acessados ​​por meio de codelabs ou outros tutoriais.

Os IDs de projeto para projetos de demonstração têm o prefixo demo- .

Ao trabalhar com projetos de demonstração do Firebase, seus aplicativos e códigos interagem apenas com emuladores . Se o seu aplicativo tentar interagir com um recurso para o qual um emulador não está em execução, esse código falhará.

Recomendamos que você use projetos de demonstração sempre que possível. Os benefícios incluem:

  • Configuração mais fácil, pois você pode executar os emuladores sem nunca criar um projeto Firebase
  • Maior segurança, pois se o seu código invocar acidentalmente recursos não emulados (de produção), não há chance de alteração de dados, utilização e cobrança
  • Melhor suporte offline, já que não há necessidade de acesso à internet para baixar a configuração do seu SDK.

Instrumente seu aplicativo para conversar com o emulador

SDKs para Android, iOS e Web

Defina sua configuração no aplicativo ou classes de teste para interagir com o emulador de autenticação da seguinte maneira.

Kotlin+KTX
Firebase.auth.useEmulator("10.0.2.2", 9099)
Java
FirebaseAuth.getInstance().useEmulator("10.0.2.2", 9099);
Rápido
Auth.auth().useEmulator(withHost:"127.0.0.1", port:9099)

Web modular API

import { getAuth, connectAuthEmulator } from "firebase/auth";

const auth = getAuth();
connectAuthEmulator(auth, "http://127.0.0.1:9099");

Web namespaced API

const auth = firebase.auth();
auth.useEmulator("http://127.0.0.1:9099");

Nenhuma configuração adicional é necessária para prototipar e testar interações entre Authentication e Cloud Functions ou regras de segurança do Firebase para Cloud Firestore ou Realtime Database. Quando o emulador de autenticação está configurado e outros emuladores estão em execução, eles trabalham juntos automaticamente.

SDKs de administrador

Os SDKs Admin do Firebase se conectam automaticamente ao emulador de autenticação quando a variável de ambiente FIREBASE_AUTH_EMULATOR_HOST é definida.

export FIREBASE_AUTH_EMULATOR_HOST="127.0.0.1:9099"

Observe que o emulador do Cloud Functions reconhece automaticamente o emulador do Authentication, então você pode pular esta etapa ao testar integrações entre o Cloud Functions e os emuladores do Authentication. A variável de ambiente será definida automaticamente para o Admin SDK no Cloud Functions.

Com a variável de ambiente definida, os SDKs Admin do Firebase aceitarão tokens de ID não assinados e cookies de sessão emitidos pelo emulador de autenticação (por meio dos métodos verifyIdToken e createSessionCookie , respectivamente) para facilitar o desenvolvimento e os testes locais. Certifique-se de não definir a variável de ambiente na produção.

Se quiser que o código do SDK Admin se conecte a um emulador compartilhado em execução em outro ambiente, você precisará especificar o mesmo ID do projeto definido usando a CLI do Firebase . Você pode passar um ID de projeto diretamente para initializeApp ou definir a variável de ambiente GCLOUD_PROJECT .

SDK administrativo do Node.js
admin.initializeApp({ projectId: "your-project-id" });
Variável de ambiente
export GCLOUD_PROJECT="your-project-id"

Tokens de identificação

Por motivos de segurança, o emulador do Authentication emite tokens de ID não assinados , que só são aceitos por outros emuladores do Firebase ou pelo SDK Admin do Firebase quando configurados . Esses tokens serão rejeitados pelos serviços de produção do Firebase ou pelo Firebase Admin SDK em execução no modo de produção (por exemplo, o comportamento padrão sem as etapas de configuração descritas acima).

Inicie o emulador

Você pode usar o emulador de autenticação de forma interativa por meio da UI do Emulator Suite e de forma não interativa por meio de sua interface REST local. As seções a seguir cobrem casos de uso interativos e não interativos.

Para iniciar o emulador de autenticação, sua interface REST e a IU do Emulator Suite, execute:

firebase emulators:start

Para autenticação anônima , seu aplicativo pode exercitar a lógica de login da sua plataforma ( iOS , Android , web ).

Para autenticação por e-mail/senha , você pode iniciar a prototipagem adicionando contas de usuário ao emulador de autenticação do seu aplicativo usando métodos do SDK de autenticação ou usando a IU do Emulator Suite.

  1. Na UI do Emulator Suite, clique na guia Autenticação .
  2. Clique no botão Adicionar usuário .
  3. Siga o assistente de criação de conta de usuário, preenchendo os campos de autenticação de e-mail.

Com um usuário de teste criado, seu aplicativo pode conectar e desconectar o usuário com a lógica do SDK para sua plataforma ( iOS , Android , web ).

Para testar a verificação/login de e-mail com fluxos de link de e-mail, o emulador imprime uma URL no terminal no qual firebase emulators:start foi executado.

i  To verify the email address customer@ex.com, follow this link:
http://127.0.0.1:9099/emulator/action?mode=verifyEmail&lang=en&oobCode=XYZ123&apiKey=fake-api-key

Cole o link em seu navegador para simular o evento de verificação e verifique se a verificação foi bem-sucedida.

{
  "authEmulator": {
    "success": "The email has been successfully verified.",
    "email": "customer@example.com"
  }
}

Para testar redefinições de senha, o emulador imprime uma URL semelhante, incluindo um parâmetro newPassword (que você pode alterar conforme necessário), no terminal.

http://127.0.0.1:9099/emulator/action?mode=resetPassword&oobCode=XYZ!23&apiKey=fake-api-key&newPassword=YOUR_NEW_PASSWORD

Teste não interativo

Em vez de usar a UI do Emulator Suite ou o código do cliente para gerenciar contas de usuário de e-mail/senha, você pode escrever scripts de configuração de teste que chamam APIs REST para criar e excluir contas de usuário e buscar códigos de verificação de e-mail fora de banda para preencher a verificação de e-mail do emulador URL. Isso mantém a plataforma e o código de teste separados e permite testar de forma não interativa.

Para fluxos de teste de e-mail e senha não interativos, a sequência típica é a seguinte.

  1. Crie usuários com o endpoint REST de inscrição de autenticação.
  2. Faça login dos usuários usando e-mails e senhas para realizar testes.
  3. Se aplicável aos seus testes, busque os códigos de verificação de e-mail fora de banda disponíveis no endpoint REST específico do emulador .
  4. Libere os registros do usuário com o endpoint REST específico do emulador para limpar os dados.

Autenticação emulada de telefone/SMS

Para autenticação por telefone, o emulador Auth não oferece suporte:

  • Fluxos reCAPTCHA e APN. Uma vez configurados para interagir com o emulador, os SDKs do cliente desativam esses métodos de verificação de maneira semelhante à descrita para testes de integração ( iOS , Android , web ).
  • Teste números de telefone com códigos pré-configurados no console do Firebase.

Caso contrário, em termos de código do cliente, o fluxo de autenticação por telefone/SMS é idêntico ao descrito para produção ( iOS , Android , web ).

Usando a IU do Emulator Suite:

  1. Na UI do Emulator Suite, clique na guia Autenticação .
  2. Clique no botão Adicionar usuário .
  3. Siga o assistente de criação de conta de usuário, preenchendo os campos de autenticação do telefone.

No entanto, para fluxos de autenticação por telefone, o emulador NÃO acionará a entrega de nenhuma mensagem de texto, pois entrar em contato com uma operadora está fora do escopo e não é amigável para testes locais! Em vez disso, o emulador imprime o código que teria sido enviado via SMS para o mesmo terminal em que você executou firebase emulators:start ; insira este código no aplicativo para simular usuários verificando suas mensagens de texto.

Teste não interativo

Para testes de autenticação telefônica não interativos, use a API REST do emulador de autenticação para recuperar códigos SMS disponíveis. Observe que o código é diferente toda vez que você inicia o fluxo.

A sequência típica é a seguinte.

  1. Chame a plataforma signInWithPhoneNumber para iniciar o processo de verificação.
  2. Recupere o código de verificação usando o endpoint REST específico do emulador .
  3. Chame confirmationResult.confirm(code) normalmente com o código de verificação.

SMS multifatorial

O emulador de autenticação oferece suporte à prototipagem e ao teste dos fluxos de autenticação multifator (MFA) de SMS disponíveis em produção para iOS , Android e Web .

Ao adicionar um usuário simulado ao emulador, você pode ativar o MFA e configurar um ou mais números de telefone para os quais as mensagens SMS de segundo fator serão enviadas. As mensagens são enviadas para o mesmo terminal em que você executou firebase emulators:start e estão disponíveis na interface REST.

Autenticação emulada de provedor de identidade de terceiros (IDP)

O emulador de autenticação permite testar muitos fluxos de autenticação de terceiros em seus aplicativos iOS, Android ou Web sem alterações no código de produção. Para obter exemplos de fluxos de autenticação, consulte a documentação das diversas combinações de provedores e plataformas que você pode usar em seu aplicativo .

De modo geral, você pode usar o SDK do Firebase para autenticar de duas maneiras:

  • Seu aplicativo permite que o SDK lide com todo o processo de ponta a ponta, incluindo todas as interações com provedores de IDP terceirizados para recuperar credenciais.
  • Seu aplicativo recupera manualmente credenciais de um provedor terceirizado usando o SDK desse terceiro e passa essas credenciais para o SDK de autenticação.

Novamente, verifique o link da documentação acima e certifique-se de estar familiarizado com qualquer fluxo (gerenciado pelo SDK do Firebase versus recuperação manual de credenciais) que você deseja usar. O emulador de autenticação oferece suporte a testes de qualquer abordagem.

Testando fluxos de IDP orientados pelo SDK do Firebase

Se seu aplicativo usar qualquer fluxo completo do SDK do Firebase, como OAuthProvider para login na Microsoft, GitHub ou Yahoo, para testes interativos, o emulador do Authentication exibirá uma versão local da página de login correspondente para ajudar você a testar autenticação de aplicativos da web que chamam o método signinWithPopup ou signInWithRedirect . Essa página de login veiculada localmente também aparece em aplicativos móveis, renderizados pela biblioteca webview da sua plataforma.

O emulador cria contas e credenciais simuladas de usuários de terceiros conforme necessário à medida que os fluxos prosseguem.

Testando fluxos de IDP com recuperação manual de credenciais

Se você usar técnicas de login "manuais" e chamar o método signInWithCredentials da sua plataforma, então, como de costume, seu aplicativo solicitará login real de terceiros e recuperará credenciais reais de terceiros.

Observe que o emulador só oferece suporte à autenticação signInWithCredential para credenciais recuperadas do Google Sign-In, Apple e outros provedores que usam tokens de ID implementados como JSON Web Tokens (JWTs). Tokens de acesso (por exemplo, aqueles fornecidos pelo Facebook ou Twitter, que não são JWTs) não são suportados. A próxima seção discute uma alternativa nesses casos.

Teste não interativo

Uma abordagem para testes não interativos é automatizar os cliques dos usuários na página de login servida pelo emulador. Para aplicativos da web, use uma interface de controle como o WebDriver. Para dispositivos móveis, use as ferramentas de teste de UI da sua plataforma, como Espresso ou Xcode.

Alternativamente, você pode atualizar seu código para usar signInWithCredential (por exemplo, em uma ramificação de código) e usar um fluxo de autenticação de token com tokens de ID simulados para contas em vez de credenciais reais.

  1. Reconecte ou comente a parte do seu código que recupera idTokens do IDP; isso elimina a necessidade de inserir nomes de usuário e senhas reais durante seus testes e alivia seus testes de cotas de API e limites de taxa no IDP.
  2. Segundo, use uma string JSON literal no lugar do token para signInWithCredential . Usando o SDK da web como exemplo, você pode alterar o código para:
firebase.auth().signInWithCredential(firebase.auth.GoogleAuthProvider.credential(
  '{"sub": "abc123", "email": "foo@example.com", "email_verified": true}'
));

Quando usado com o emulador, este código autenticará com êxito um usuário com o e-mail foo@example.com no Google. Pense no subcampo como uma chave primária, que pode ser alterada para qualquer string, simulando o login de diferentes usuários. Você pode substituir firebase.auth.GoogleAuthProvider por, por exemplo, new firebase.auth.OAuthProvider('yahoo.com') ou qualquer outro ID de provedor que você queira simular.

Autenticação de token personalizado emulado

O emulador de autenticação lida com a autenticação com JSON Web Tokens personalizados usando chamadas para o método signInWithCustomToken em plataformas suportadas, conforme descrito na documentação de produção de autenticação .

Como o emulador de autenticação difere da produção

O emulador do Firebase Authentication simula muitos recursos do produto de produção. No entanto, como qualquer tipo de sistema de autenticação depende muito da segurança em vários níveis (dispositivo, provedores terceirizados, Firebase, etc.), é difícil para o emulador recriar adequadamente todos os fluxos.

Nuvem IAM

O Firebase Emulator Suite não tenta replicar ou respeitar qualquer comportamento relacionado ao IAM para execução. Os emuladores aderem às regras de segurança do Firebase fornecidas, mas em situações em que o IAM normalmente seria usado, por exemplo, para definir o Cloud Functions que invoca a conta de serviço e, portanto, as permissões, o emulador não é configurável e usará a conta disponível globalmente na sua máquina de desenvolvedor. semelhante a executar um script local diretamente.

Como nas plataformas móveis o login do link de e-mail depende do Firebase Dynamic Links, todos esses links serão abertos na plataforma web (móvel).

Login de terceiros

Para fluxos de login de terceiros, o Firebase Authentication depende de credenciais seguras de provedores terceirizados, como Twitter e Github.

Credenciais reais de provedores OpenID Connect, como Google e Apple, são aceitas pelo emulador de autenticação. Credenciais de provedores que não sejam do OpenID Connect não são suportadas.

Login por e-mail/SMS

Em aplicativos de produção, os fluxos de login por email e SMS envolvem uma operação assíncrona na qual o usuário verifica uma mensagem recebida e insere um código de login em uma interface de login. O emulador de autenticação não envia e-mails ou mensagens SMS, mas conforme descrito acima , ele gera códigos de login e os envia para o terminal para serem usados ​​nos testes.

O emulador não oferece suporte à capacidade de definir números de telefone de teste com códigos de login fixos, como pode ser feito usando o console do Firebase.

Autenticação de token personalizado

O emulador de autenticação não valida a assinatura ou expiração de tokens personalizados. Isso permite que você use tokens artesanais e reutilize tokens indefinidamente em cenários de prototipagem e teste.

Limitação de taxa/antiabuso

O emulador de autenticação não replica recursos de limitação de taxa de produção ou antiabuso.

Funções de bloqueio

Na produção, os usuários são gravados no armazenamento uma vez após os eventos beforeCreate e beforeSignIn serem acionados. No entanto, devido a limitações técnicas, o emulador de autenticação grava duas vezes no armazenamento, uma após a criação do usuário e outra após o login. Isso significa que para novos usuários, você pode chamar getAuth().getUser() com sucesso em beforeSignIn no emulador de autenticação, mas você encontrará um erro ao fazer isso na produção.

Qual o proximo?