Permita que os usuários se autentiquem com o Firebase usando as contas do Facebook deles. Basta integrar o login do Facebook ao seu aplicativo.
Antes de começar
- Adicione o Firebase ao seu projeto de C++.
- No site Facebook for Developers, acesse o ID e o secret do app.
- Ative o login do Facebook:
- No console do Firebase, abra a seção Autenticação.
- Na guia Método de login, ative o método de login pelo Facebook e especifique o ID e o Secret do app recebidos do Facebook.
- Em seguida, verifique se o URI de redirecionamento do OAuth (por exemplo,
my-app-12345.firebaseapp.com/__/auth/handler
) está listado como um dos URIs de redirecionamento do OAuth na página de configurações do app Facebook. No site Facebook for Developers, acesse Product Settings > Facebook Login.
Acessar a classe firebase::auth::Auth
A classe Auth
é o gateway para todas as chamadas de API.
- Adicione os arquivos de cabeçalho Auth e App:
#include "firebase/app.h" #include "firebase/auth.h"
- 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__)
- Adquira a classe
firebase::auth::Auth
para seufirebase::App
. Há um mapeamento de um para um entreApp
eAuth
.firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
Autenticar no Firebase
- Siga as instruções para Android e iOS+ e receba um token de acesso referente ao usuário conectado ao Facebook.
- Depois que um usuário fizer login, troque o token de acesso por uma credencial do Firebase e faça a autenticação com ela:
firebase::auth::Credential credential = firebase::auth::FacebookAuthProvider::GetCredential(access_token); firebase::Future<firebase::auth::AuthResult> result = auth->SignInAndRetrieveDataWithCredential(credential);
- Se o programa tiver uma rotina de atualização executada regularmente (30 ou 60 vezes por segundo), você poderá confirmar os resultados a cada atualização
Auth::SignInAndRetrieveDataWithCredentialLastResult
:firebase::Future<firebase::auth::AuthResult> result = auth->SignInAndRetrieveDataWithCredentialLastResult(); 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()); } }
Ou, se seu programa for orientado por eventos, você pode preferir registrar um retorno de chamada na classe Future do Google Analytics.
Registrar um retorno de chamada em uma classe Future
Alguns programas têm funçãoUpdate
que são chamadas 30 ou 60 vezes por segundo.
Muitos jogos, por exemplo, seguem esse modelo. Esses programas podem invocar as funções LastResult
para pesquisar chamadas assíncronas.
Caso seu programa seja baseado em eventos, pode ser preferível registrar funções de retorno de chamada.
Essas funções são chamadas na conclusão da classe Future.
void OnCreateCallback(const firebase::Future<firebase::auth::User*>& result, void* user_data) { // The callback is called when the Future enters the `complete` state. assert(result.status() == firebase::kFutureStatusComplete); // Use `user_data` to pass-in program context, if you like. MyProgramContext* program_context = static_cast<MyProgramContext*>(user_data); // Important to handle both success and failure situations. if (result.error() == firebase::auth::kAuthErrorNone) { firebase::auth::User* user = *result.result(); printf("Create user succeeded for email %s\n", user->email().c_str()); // Perform other actions on User, if you like. firebase::auth::User::UserProfile profile; profile.display_name = program_context->display_name; user->UpdateUserProfile(profile); } else { printf("Created user failed with error '%s'\n", result.error_message()); } } void CreateUser(firebase::auth::Auth* auth) { // Callbacks work the same for any firebase::Future. firebase::Future<firebase::auth::AuthResult> result = auth->CreateUserWithEmailAndPasswordLastResult(); // `&my_program_context` is passed verbatim to OnCreateCallback(). result.OnCompletion(OnCreateCallback, &my_program_context); }Se você preferir, a função de retorno de chamada também pode ser um lambda.
void CreateUserUsingLambda(firebase::auth::Auth* auth) { // Callbacks work the same for any firebase::Future. firebase::Future<firebase::auth::AuthResult> result = auth->CreateUserWithEmailAndPasswordLastResult(); // The lambda has the same signature as the callback function. result.OnCompletion( [](const firebase::Future<firebase::auth::User*>& result, void* user_data) { // `user_data` is the same as &my_program_context, below. // Note that we can't capture this value in the [] because std::function // is not supported by our minimum compiler spec (which is pre C++11). MyProgramContext* program_context = static_cast<MyProgramContext*>(user_data); // Process create user result... (void)program_context; }, &my_program_context); }
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();