Ir para o console

Autenticar com o Firebase usando um número de telefone e o C++

Use o Firebase Authentication para fazer o login de um usuário. Basta enviar uma mensagem SMS para o telefone dele. O usuário faz login utilizando um código de uso único contido na mensagem SMS.

Este documento descreve como implementar um fluxo de login com número de telefone usando o SDK do Firebase.

Antes de começar

  1. Adicione o Firebase ao seu projeto de C++.

  2. Caso você ainda não tenha conectado o app ao seu projeto do Firebase, faça isso no Firebase console.

No iOS, note que o login de número de telefone requer um dispositivo físico e não funciona em um simulador.

Preocupações com segurança

A autenticação usando apenas um número de telefone é conveniente, porém menos segura do que os outros métodos disponíveis, já que um número de telefone pode ser facilmente transferido entre usuários. Além disso, em dispositivos com vários perfis de usuário, qualquer um que receba mensagens SMS pode fazer login em uma conta usando o número de telefone do dispositivo.

Caso use o login por número de telefone no seu app, você precisa oferecê-lo junto com métodos de login mais seguros e informar aos usuários as implicações de segurança do uso desse tipo de login.

Ativar o login com número de telefone para o projeto do Firebase

Para fazer login de usuários por SMS, ative primeiro o método de login com número de telefone para o projeto do Firebase:

  1. No Console do Firebase, abra a seção Autenticação.
  2. Na página Método de login, ative o método de login por Número de telefone.

A cota de solicitação de login com número de telefone do Firebase é alta o suficiente para evitar que a maioria dos apps seja afetada. No entanto, se for necessário fazer login de um grande volume de usuários com autenticação por telefone, atualize o plano de preços. Consulte a página de preços.

Começar a receber notificações de APNs (iOS)

Para usar a autenticação de número de telefone no iOS, o app precisa receber notificações de APNs do Firebase. Quando você faz o login de um usuário com número de telefone pela primeira vez em um dispositivo, o Firebase Authentication envia uma notificação push silenciosa ao dispositivo para verificar se a solicitação de login do número de telefone vem do seu app. Por isso, o login com número de telefone não pode ser usado em um simulador.

Para ativar notificações de APNs para uso com o Firebase Authentication:

  1. No Xcode, ative notificações push para seu projeto.
  2. Faça upload do certificado de APNs para o Firebase. Se você ainda não tiver um certificado de APNs, consulte o artigo Aprovisionamento de certificados SSL para APNs.

    1. No seu projeto do Firebase console, selecione o ícone de engrenagem, Configurações do projeto e a guia Cloud Messaging.

    2. Para fazer o upload dos certificados de desenvolvimento ou de produção, selecione o botão Carregar certificado. É obrigatório ter ao menos um dos dois certificados.

    3. Selecione o arquivo .p12 de cada um deles e informe a senha, se houver. Verifique se o código de pacote corresponde ao código de pacote do seu app. Selecione Salvar.

Enviar um código de verificação para o telefone do usuário

Para dar início ao login com número de telefone, apresente ao usuário uma interface que solicite o número de telefone dele e, em seguida, chame PhoneAuthProvider::VerifyPhoneNumber para pedir que o Firebase envie um código de autenticação ao telefone do usuário por SMS:

  1. Solicite o número de telefone do usuário.

    Os requisitos legais variam, mas como prática recomendada e para definir as expectativas dos usuários, informe a eles que, se fizerem login com telefone, poderão receber uma mensagem SMS para verificação. Além disso, poderão ser cobrados por esse serviço.

  2. Chame PhoneAuthProvider::VerifyPhoneNumber, transmitindo a ele o número de telefone do usuário.
    class PhoneListener : public PhoneAuthProvider::Listener {
     public:
      ~PhoneListener() override {}
    
      void OnVerificationCompleted(Credential credential) override {
        // Auto-sms-retrieval or instant validation has succeeded (Android only).
        // No need for the user to input the verification code manually.
        // `credential` can be used instead of calling GetCredential().
      }
    
      void OnVerificationFailed(const std::string& error) override {
        // Verification code not sent.
      }
    
      void OnCodeSent(const std::string& verification_id,
                      const PhoneAuthProvider::ForceResendingToken&
                          force_resending_token) override {
        // Verification code successfully sent via SMS.
        // Show the Screen to enter the Code.
        // Developer may want to save that verification_id along with other app states in case
        // the app is terminated before the user gets the SMS verification code.
      }
    };
    
    PhoneListener phone_listener;
    PhoneAuthProvider& phone_provider = PhoneAuthProvider::GetInstance(auth);
    phone_provider->VerifyPhoneNumber(phone_number, kAutoVerifyTimeOut, null,
                                      &phone_listener);
    
    Quando você chama PhoneAuthProvider::VerifyPhoneNumber, o Firebase realiza as seguintes ações:
    • No iOS, ele envia uma notificação push silenciosa para seu app.
    • O Firebase envia uma mensagem SMS contendo um código de autenticação ao número de telefone especificado e passa uma identificação de verificação para sua função de conclusão. Você precisará do código de verificação e da identificação da verificação para fazer o login do usuário.
  3. Salve a identificação da verificação e restaure-a depois que o app for carregado. Ao fazer isso, você tem a garantia de ter uma identificação da verificação válida caso o app seja encerrado antes que o usuário conclua o fluxo de login (por exemplo, ao alternar para o app de SMS).

    Prossiga com a identificação de verificação da maneira que quiser. Se você estiver gravando com uma biblioteca C ++ entre plataformas, ela deve fornecer notificações sobre o encerramento e a restauração do app. Nesses eventos, você pode salvar e restaurar, respectivamente, a identificação da verificação.

Se a chamada para VerifyPhoneNumber resultar em uma chamada para OnCodeSent no seu Listener, você poderá solicitar que o usuário digite o código de verificação assim que o receber na mensagem SMS.

Por outro lado, se a chamada para VerifyPhoneNumber resultar em OnVerificationCompleted, a verificação automática terá sido bem-sucedida e você passará a ter uma Credential que pode usar conforme descrito abaixo.

Fazer login do usuário com o código de verificação

Depois que o usuário informar o código de verificação da mensagem SMS ao app, faça o login desse usuário. Para isso, crie um objeto Credential por meio do código e da identificação da verificação e transmita-o para Auth::SignInWithCredential

  1. Solicite o código de verificação ao usuário.
  2. Crie um objeto Credential do código de verificação e da identificação da verificação.
    Credential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. Faça o login do usuário com o objeto Credential:
    Future<User*> future = auth_->SignInWithCredential(credential);
    future.OnCompletion(
        [](const Future<User*>& result, void*) {
          if (result.error() == kAuthErrorNone) {
            // Successful.
            // User is signed in.
            const User* user = *result.result();
    
            // This should display the phone number.
            printf("Phone number: %s", user->phone_number().c_str());
    
            // The phone number provider UID is the phone number itself.
            printf("Phone provider uid: %s", user->uid().c_str());
    
            // The phone number providerID is 'phone'
            printf("Phone provider ID: %s", user->provider_id().c_str());
          } else {
            // Error.
            printf("Sign in error: %s", result.error_message().c_str());
          }
        },
        nullptr);
    

Próximas etapas

Depois que um usuário faz login pela primeira vez, uma nova conta é criada e vinculada às credenciais, que podem ser o número do telefone, o nome de usuário e a senha ou as informações do provedor de autenticação. Essa nova conta é armazenada como parte do projeto do Firebase e pode ser usada para identificar um usuário em todos os apps do projeto, seja qual for o método de login utilizado.

  • Nos apps, é possível acessar as informações básicas de perfil do usuário a partir do objeto firebase::auth::User:

    firebase::auth::User* user = auth->current_user();
    if (user != nullptr) {
      std::string name = user->display_name();
      std::string email = user->email();
      std::string photo_url = user->photo_url();
      // The user's ID, unique to the Firebase project.
      // Do NOT use this value to authenticate with your backend server,
      // if you have one. Use firebase::auth::User::Token() instead.
      std::string uid = user->uid();
    }
    
  • Nas Regras de segurança do Firebase Realtime Database e do Cloud Storage, é possível usar a variável auth para encontrar o código exclusivo do usuário conectado. Use essa informação para controlar o acesso dele aos dados.

Os usuários podem fazer login no app usando vários provedores de autenticação. Basta vincular as credenciais desses provedores a uma conta de usuário.

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

auth->SignOut();