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

Você pode usar o Firebase Authentication para fazer login de um usuário enviando uma mensagem SMS para o telefone do usuário. O usuário faz login usando um código único contido na mensagem SMS.

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

Antes de você começar

  1. Adicione o Firebase ao seu projeto C++ .
  2. Se você ainda não conectou seu aplicativo ao projeto do Firebase, faça isso no console do Firebase .
  3. Entenda os requisitos da plataforma para login com número de telefone:
    • O login com número de telefone é apenas para plataformas móveis.
    • No iOS, o login com 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, embora conveniente, é menos segura do que outros métodos disponíveis, porque a posse de um número de telefone pode ser facilmente transferida entre usuários. Além disso, em dispositivos com vários perfis de usuário, qualquer usuário que possa receber mensagens SMS poderá fazer login em uma conta usando o número de telefone do dispositivo.

Se você usar o login baseado em número de telefone em seu aplicativo, deverá oferecê-lo junto com métodos de login mais seguros e informar os usuários sobre as desvantagens de segurança do uso do login por número de telefone.

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

Para fazer login de usuários por SMS, primeiro você precisa ativar o método de login por número de telefone para seu projeto do Firebase:

  1. No console do Firebase , abra a seção Autenticação .
  2. Na página Método de login , habilite o método de login com número de telefone .

A cota de solicitações de login por número de telefone do Firebase é alta o suficiente para que a maioria dos aplicativos não seja afetada. No entanto, se você precisar conectar um volume muito grande de usuários com autenticação por telefone, talvez seja necessário atualizar seu plano de preços. Veja a página de preços .

Comece a receber notificações de APNs (plataformas Apple)

Para usar a autenticação de número de telefone em plataformas Apple, seu aplicativo deve ser capaz de receber notificações de APNs do Firebase. Quando você faz login de um usuário com o número de telefone dele 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 aplicativo. (Por esse motivo, 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, habilite notificações push para seu projeto.
  2. Faça upload do seu certificado de APNs para o Firebase. Se você ainda não possui um certificado APNs, crie um no Apple Developer Member Center .

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

    2. Selecione o botão Carregar Certificado para seu certificado de desenvolvimento, seu certificado de produção ou ambos. Pelo menos um é necessário.

    3. Para cada certificado, selecione o arquivo .p12 e forneça a senha, se houver. Certifique-se de que o ID do pacote deste certificado corresponda ao ID do pacote do seu aplicativo. Selecione Salvar .

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

Para iniciar o login pelo número de telefone, apresente ao usuário uma interface que solicita que ele forneça seu número de telefone e, em seguida, ligue para PhoneAuthProvider::VerifyPhoneNumber para solicitar que o Firebase envie um código de autenticação ao telefone do usuário por SMS:

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

    Os requisitos legais variam, mas como prática recomendada e para definir expectativas para seus usuários, você deve informá-los de que, se usarem login por telefone, poderão receber uma mensagem SMS para verificação e serão aplicadas taxas padrão.

  2. Chame PhoneAuthProvider::VerifyPhoneNumber , passando para ele o número de telefone do usuário.
    class PhoneListener : public PhoneAuthProvider::Listener {
     public:
      ~PhoneListener() override {}
    
      void OnVerificationCompleted(PhoneAuthCredential 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;
    PhoneAuhtOptions options;
    options.timeout_milliseconds = kAutoVerifyTimeOut;
    options.phone_number = phone_number;
    PhoneAuthProvider& phone_provider = PhoneAuthProvider::GetInstance(auth);
    phone_provider->VerifyPhoneNumber(options, &phone_listener);
    
    Quando você chama PhoneAuthProvider::VerifyPhoneNumber , Firebase,
    • (no iOS) envia uma notificação push silenciosa para seu aplicativo,
    • envia uma mensagem SMS contendo um código de autenticação para o número de telefone especificado e passa um ID de verificação para sua função de conclusão. Você precisará do código de verificação e do ID de verificação para fazer login do usuário.
  3. Salve o ID de verificação e restaure-o quando o aplicativo for carregado. Ao fazer isso, você pode garantir que ainda terá um ID de verificação válido se seu aplicativo for encerrado antes que o usuário conclua o fluxo de login (por exemplo, ao mudar para o aplicativo SMS).

    Você pode persistir o ID de verificação da maneira que desejar. Se você estiver escrevendo com uma estrutura C++ multiplataforma, ela deverá fornecer notificações para encerramento e restauração do aplicativo. Nestes eventos, você pode salvar e restaurar, respectivamente, o ID de verificação.

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

Por outro lado, se a chamada para VerifyPhoneNumber resultar em OnVerificationCompleted , a verificação automática foi bem-sucedida e agora você terá um PhoneAuthCredential com o qual poderá usar conforme descrito abaixo.

Faça login no usuário com o código de verificação

Depois que o usuário fornecer ao aplicativo o código de verificação da mensagem SMS, faça login do usuário criando um objeto PhoneAuthCredential a partir do código de verificação e do ID de verificação e transmitindo esse objeto para Auth::SignInWithCredential .

  1. Obtenha o código de verificação do usuário.
  2. Crie um objeto Credential a partir do código de verificação e do ID de verificação.
    PhoneAuthCredential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. Faça 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.
            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óximos passos

Depois que um usuário faz login pela primeira vez, uma nova conta de usuário é criada e vinculada às credenciais (ou seja, nome de usuário e senha, número de telefone ou informações do provedor de autenticação) com as quais o usuário fez login. Essa nova conta é 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 de como o usuário faz login.

  • Nos seus aplicativos, você pode obter as informações básicas do perfil do usuário no objeto firebase::auth::User :

    firebase::auth::User user = auth->current_user();
    if (user.is_valid()) {
      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 , 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() :

auth->SignOut();