Autenticar com o Firebase usando um sistema de autenticação personalizado e o C++

É possível integrar o Firebase Authentication a um sistema de autenticação personalizado modificando o servidor de autenticação para produzir tokens assinados personalizados quando um usuário faz login. Seu app recebe e usa esse token para se autenticar com o Firebase.

Antes de começar

  1. Adicione o Firebase ao seu projeto em C++.
  2. Para consultar as chaves de servidor do seu projeto, siga estas etapas:
    1. Acesse a página Contas de serviço nas configurações do seu projeto.
    2. Clique em Gerar uma nova chave privada na parte inferior da seção SDK Admin do Firebase da página Contas de serviço.
    3. O novo par de chaves pública/privada da conta de serviço é salvo automaticamente no seu computador. Copie esse arquivo para seu servidor de autenticação.

Autenticar no Firebase

A classe Auth é o gateway para todas as chamadas de API.
  1. Adicione os arquivos de cabeçalho Auth e App:
    #include "firebase/app.h"
    #include "firebase/auth.h"
  2. No código de inicialização, crie uma classe firebase::App.
    #if defined(__ANDROID__)
      firebase::App* app =
          firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity);
    #else
      firebase::App* app = firebase::App::Create(firebase::AppOptions());
    #endif  // defined(__ANDROID__)
  3. Adquira a classe firebase::auth::Auth para seu firebase::App. Há um mapeamento de um para um entre App e Auth.
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
Chame Auth::SignInWithCustomToken com o token do servidor de autenticação.
  1. Quando os usuários fazem login no seu app, envie as credenciais de login deles (por exemplo, nome de usuário e senha) para seu servidor de autenticação. O servidor verifica as credenciais e retorna um token personalizado se elas forem válidas.
  2. Depois de receber o token personalizado do servidor de autenticação, transmita-o para Auth::SignInWithCustomToken e faça o login do usuário.
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInWithCustomToken(custom_token);
  3. Se seu programa tiver uma rotina de atualização regular, por exemplo, 30 ou 60 vezes por segundo, será possível verificar os resultados uma vez por ciclo usando Auth::SignInWithCustomTokenLastResult:
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInWithCustomTokenLastResult();
    if (result.status() == firebase::kFutureStatusComplete) {
      if (result.error() == firebase::auth::kAuthErrorNone) {
        firebase::auth::AuthResult auth_result = *result.result();
        printf("Sign in succeeded for `%s`\n",
               auth_result.user.display_name().c_str());
      } else {
        printf("Sign in failed with error '%s'\n", result.error_message());
      }
    }
    Se o programa for baseado em eventos, pode ser preferível registrar um retorno de chamada na classe "Future".

Próximas etapas

Depois que um usuário faz login pela primeira vez, uma nova conta de usuário é 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 seus apps, use o objeto firebase::auth::User para receber as informações básicas de perfil do usuário.

    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 Firebase Realtime Database e Cloud Storage, você pode acessar o ID exclusivo do usuário conectado pela variável auth e usar essas informações para controlar quais dados um usuário pode acessar.

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();