Esegui l'autenticazione utilizzando GitHub e C++

Puoi consentire ai tuoi utenti di eseguire l'autenticazione con Firebase utilizzando i loro account GitHub integrando l'autenticazione GitHub nella tua app.

Prima di iniziare

  1. Aggiungi Firebase al tuo progetto C++.
  2. Nella console Firebase, apri la sezione Autorizzazione.
  3. Nella scheda Metodo di accesso, attiva il provider GitHub.
  4. Aggiungi al campo l'ID client e il client secret dalla console per gli sviluppatori del provider. configurazione del provider:
    1. Registrare l'app in qualità di applicazione sviluppatore su GitHub e ottieni l'ID client OAuth 2.0 della tua app e Client Secret.
    2. Assicurati che l'URI di reindirizzamento OAuth di Firebase (ad es. my-app-12345.firebaseapp.com/__/auth/handler) sia impostato come URL di callback di autorizzazione nella pagina delle impostazioni dell'app sul tuo Configurazione dell'app GitHub.
  5. Fai clic su Salva.

Accedi al corso firebase::auth::Auth

La classe Auth è il gateway per tutte le chiamate API.
  1. Aggiungi i file di autenticazione e di intestazione dell'app:
    #include "firebase/app.h"
    #include "firebase/auth.h"
    
  2. Nel codice di inizializzazione, crea un'istanza 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. Acquista il corso firebase::auth::Auth per firebase::App. Esiste una mappatura uno a uno tra App e Auth.
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
    

Autenticazione con Firebase

  1. Segui le istruzioni per Android e iOS+ per ottenere un token per l'utente GitHub che ha eseguito l'accesso.
  2. Dopo che un utente ha eseguito l'accesso, scambia il token con la credenziale Firebase ed esegui l'autenticazione con Firebase credenziale:
    firebase::auth::Credential credential =
        firebase::auth::GitHubAuthProvider::GetCredential(token);
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInAndRetrieveDataWithCredential(credential);
    
  3. Se il tuo programma ha un ciclo di aggiornamento che viene eseguito regolarmente (ad esempio, 30 o 60 volte al secondo), puoi controllare i risultati una volta per aggiornamento con 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());
      }
    }
    
    Oppure, se il tuo programma è basato su eventi, potresti preferire registra un callback sul Futuro.

Registrare una richiamata per Future

Alcuni programmi hanno funzioni Update che vengono chiamate 30 o 60 volte al secondo. Ad esempio, molti giochi seguono questo modello. Questi programmi possono chiamare LastResult per eseguire il polling delle chiamate asincrone. Tuttavia, se il tuo programma è basato su eventi, potresti preferire registrare le funzioni di callback. Una funzione di callback viene chiamata al completamento del Futuro.
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);
}
La funzione di callback può essere utilizzata anche come lambda, se preferisci.
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);
}

Passaggi successivi

Dopo che un utente ha eseguito l'accesso per la prima volta, viene creato un nuovo account utente e collegati alle credenziali, ovvero nome utente, password, numero o informazioni del provider di autenticazione, ovvero l'utente con cui ha eseguito l'accesso. Questo nuovo viene archiviato come parte del progetto Firebase e può essere utilizzato per identificare a un utente in ogni app del progetto, a prescindere da come esegue l'accesso.

  • Nelle tue app puoi ottenere le informazioni di base del profilo dell'utente dal Oggetto 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();
    }
    
  • In Firebase Realtime Database e Cloud Storage Regole di sicurezza, puoi ottieni l'ID utente unico dell'utente che ha eseguito l'accesso dalla variabile auth, e usarli per controllare i dati a cui un utente può accedere.

Puoi consentire agli utenti di accedere alla tua app utilizzando più autenticazioni collegando le credenziali del provider di autenticazione a un a un account utente esistente.

Per disconnettere un utente, chiama SignOut():

auth->SignOut();