Autenticar com Firebase usando links de e-mail

Você pode usar o Firebase Authentication para fazer login de um usuário, enviando-lhe um e-mail contendo um link, no qual ele pode clicar para fazer login. No processo, o endereço de e-mail do usuário também é verificado.

Existem inúmeros benefícios em fazer login por e-mail:

  • Inscrição e login de baixo atrito.
  • Menor risco de reutilização de senhas entre aplicativos, o que pode prejudicar a segurança até mesmo de senhas bem selecionadas.
  • A capacidade de autenticar um usuário e ao mesmo tempo verificar se o usuário é o proprietário legítimo de um endereço de e-mail.
  • Um usuário só precisa de uma conta de e-mail acessível para fazer login. Não é necessária a propriedade de um número de telefone ou conta de mídia social.
  • Um usuário pode fazer login com segurança sem a necessidade de fornecer (ou lembrar) uma senha, o que pode ser complicado em um dispositivo móvel.
  • Um usuário existente que tenha feito login anteriormente com um identificador de e-mail (senha ou federado) pode ser atualizado para entrar apenas com o e-mail. Por exemplo, um usuário que esqueceu a senha ainda pode fazer login sem precisar redefinir a senha.

Antes de você começar

  1. Se ainda não o fez, siga as etapas no Guia de primeiros passos .

  2. Ative o login do Email Link para seu projeto do Firebase.

    Para fazer login de usuários por link de e-mail, primeiro você deve ativar o método de login Provedor de e-mail e Link de e-mail para seu projeto do Firebase:

    1. No console do Firebase , abra a seção Auth .
    2. Na guia Método de login , habilite o provedor de e-mail/senha . Observe que o login por e-mail/senha deve estar habilitado para usar o login por link de e-mail.
    3. Na mesma seção, habilite o método de login do link de e-mail (login sem senha) .
    4. Clique em Salvar .

Para iniciar o fluxo de autenticação, apresente uma interface que solicite ao usuário o endereço de e-mail e, em seguida, chame sendSignInLinkToEmail() para solicitar que o Firebase envie o link de autenticação para o e-mail do usuário.

  1. Construa o objeto ActionCodeSettings, que fornece ao Firebase instruções sobre como construir o link de e-mail. Defina os seguintes campos:

    • url : o link direto a ser incorporado e qualquer estado adicional a ser repassado. O domínio do link deve estar na lista de permissões da lista de domínios autorizados do Firebase Console, que pode ser encontrada na guia Método de login (Autenticação -> Método de login). O link redirecionará o usuário para esse URL se o aplicativo não estiver instalado no dispositivo e não puder ser instalado.

    • androidPackageName e IOSBundleId : os aplicativos a serem usados ​​quando o link de login for aberto em um dispositivo Android ou iOS. Saiba mais sobre como configurar o Firebase Dynamic Links para abrir links de ação de e-mail por meio de aplicativos móveis.

    • handleCodeInApp : definido como true . A operação de login deve sempre ser concluída no aplicativo, ao contrário de outras ações de e-mail fora de banda (redefinição de senha e verificações de e-mail). Isso ocorre porque, ao final do fluxo, espera-se que o usuário esteja conectado e seu estado Auth persista no aplicativo.

    • dynamicLinkDomain : quando vários domínios de link dinâmico personalizados são definidos para um projeto, especifique qual deles usar quando o link for aberto por meio de um aplicativo móvel especificado (por exemplo, example.page.link ). Caso contrário, o primeiro domínio será selecionado automaticamente.

    var acs = ActionCodeSettings(
        // URL you want to redirect back to. The domain (www.example.com) for this
        // URL must be whitelisted in the Firebase Console.
        url: 'https://www.example.com/finishSignUp?cartId=1234',
        // This must be true
        handleCodeInApp: true,
        iOSBundleId: 'com.example.ios',
        androidPackageName: 'com.example.android',
        // installIfNotAvailable
        androidInstallApp: true,
        // minimumVersion
        androidMinimumVersion: '12');
    
  2. Peça ao usuário o e-mail.

  3. Envie o link de autenticação para o e-mail do usuário e salve o e-mail do usuário caso ele conclua o login de e-mail no mesmo dispositivo.

    var emailAuth = 'someemail@domain.com';
    FirebaseAuth.instance.sendSignInLinkToEmail(
            email: emailAuth, actionCodeSettings: acs)
        .catchError((onError) => print('Error sending email verification $onError'))
        .then((value) => print('Successfully sent email verification'));
    });
    

Preocupações com segurança

Para evitar que um link de login seja usado para fazer login como um usuário não intencional ou em um dispositivo não intencional, o Firebase Auth exige que o endereço de e-mail do usuário seja fornecido ao concluir o fluxo de login. Para que o login seja bem-sucedido, esse endereço de e-mail deve corresponder ao endereço para o qual o link de login foi enviado originalmente.

Você pode agilizar esse fluxo para usuários que abrem o link de login no mesmo dispositivo em que solicitam o link, armazenando seus endereços de email localmente (por exemplo, usando SharedPreferences) quando você envia o email de login. Em seguida, use este endereço para concluir o fluxo. Não passe o e-mail do usuário nos parâmetros da URL de redirecionamento e reutilize-o, pois isso pode permitir injeções de sessão.

Após a conclusão do login, qualquer mecanismo de login anterior não verificado será removido do usuário e todas as sessões existentes serão invalidadas. Por exemplo, se alguém criou anteriormente uma conta não verificada com o mesmo e-mail e senha, a senha do usuário será removida para evitar que o imitador que reivindicou a propriedade e criou a conta não verificada faça login novamente com o e-mail e a senha não verificados.

Certifique-se também de usar uma URL HTTPS na produção para evitar que seu link seja potencialmente interceptado por servidores intermediários.

O Firebase Authentication usa Firebase Dynamic Links para enviar o link do e-mail para um dispositivo móvel. Para a conclusão do login por meio do aplicativo móvel, o aplicativo deve ser configurado para detectar o link de entrada do aplicativo, analisar o link direto subjacente e, em seguida, concluir o login.

  1. Configure seu aplicativo para receber links dinâmicos no Flutter no guia .

  2. No seu manipulador de link, verifique se o link se destina à autenticação de link de e-mail e, em caso afirmativo, conclua o processo de login.

    // Confirm the link is a sign-in with email link.
    if (FirebaseAuth.instance.isSignInWithEmailLink(emailLink)) {
      try {
        // The client SDK will parse the code from the link for you.
        final userCredential = await FirebaseAuth.instance
            .signInWithEmailLink(email: emailAuth, emailLink: emailLink);
    
        // You can access the new user via userCredential.user.
        final emailAddress = userCredential.user?.email;
    
        print('Successfully signed in with email link!');
      } catch (error) {
        print('Error signing in with email link.');
      }
    }
    

Você também pode vincular esse método de autenticação a um usuário existente. Por exemplo, um usuário previamente autenticado com outro provedor, como um número de telefone, pode adicionar esse método de login à sua conta existente.

A diferença estaria na segunda metade da operação:

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.linkWithCredential(authCredential);
} catch (error) {
    print("Error linking emailLink credential.");
}

Isso também pode ser usado para autenticar novamente um usuário de link de e-mail antes de executar uma operação confidencial.

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.reauthenticateWithCredential(authCredential);
} catch (error) {
    print("Error reauthenticating credential.");
}

No entanto, como o fluxo pode terminar em um dispositivo diferente onde o usuário original não estava conectado, esse fluxo pode não ser concluído. Nesse caso, um erro pode ser mostrado ao usuário para forçá-lo a abrir o link no mesmo dispositivo. Algum estado pode ser passado no link para fornecer informações sobre o tipo de operação e o uid do usuário.

Se você criou seu projeto em ou após 15 de setembro de 2023, a proteção de enumeração de e-mail será habilitada por padrão. Esse recurso melhora a segurança das contas de usuário do seu projeto, mas desativa o método fetchSignInMethodsForEmail() , que recomendamos anteriormente para implementar fluxos que priorizam o identificador.

Embora você possa desativar a proteção de enumeração de e-mail para o seu projeto, não recomendamos fazer isso.

Consulte a documentação sobre proteção de enumeração de email para obter mais detalhes.

Próximos passos

Depois que um usuário cria uma nova conta, ela é armazenada como parte do seu projeto do Firebase e pode ser usada para identificar um usuário em todos os aplicativos do seu projeto, independentemente do método de login usado pelo usuário.

Nos seus aplicativos, você pode obter as informações básicas do perfil do usuário no objeto User . Consulte Gerenciar usuários .

Nas regras de segurança do Firebase Realtime Database e do Cloud Storage, você pode obter o ID de usuário exclusivo do usuário conectado na variável auth e usá-lo para controlar quais dados um usuário pode acessar.

Você pode permitir que os usuários façam login no seu aplicativo usando vários provedores de autenticação vinculando as credenciais do provedor de autenticação a uma conta de usuário existente.

Para desconectar um usuário, chame signOut() :

await FirebaseAuth.instance.signOut();