Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

使用 GitHub 和 C++ 進行身份驗證

您可以通過將 GitHub 身份驗證集成到您的應用中,讓您的用戶使用他們的 GitHub 帳戶通過 Firebase 進行身份驗證。

在你開始之前

  1. 添加火力地堡到C ++項目
  2. 火力地堡控制台,打開驗證部分。
  3. 登錄方法選項卡,選中GitHub的供應商。
  4. 添加來自供應商的開發者控制台提供者配置的客戶端ID客戶端密鑰
    1. 註冊您的應用程序作為在GitHub上開發的應用程序,讓你的應用程序的OAuth 2.0客戶端ID客戶端密鑰
    2. 確保你的火力地堡的OAuth重定向URI(my-app-12345.firebaseapp.com/__/auth/handler )設置為你的應用程序的設置頁面的授權回調網址,您的GitHub上的應用程序的配置
  5. 單擊保存

進入firebase::auth::Auth

Auth類是所有API調用的網關。
  1. 添加驗證和應用頭文件:
    #include "firebase/app.h"
    #include "firebase/auth.h"
    
  2. 在你的初始化代碼,創建一個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. 獲得firebase::auth::Auth類的firebase::App 。之間存在一個一到一映射AppAuth
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
    

使用 Firebase 進行身份驗證

  1. 遵循指令的AndroidiOS的獲得為登錄的用戶GitHub的令牌。
  2. 當用戶在成功的跡象,交換信物的火力地堡憑據,並驗證與火力地堡使用火力地堡憑據:
    firebase::auth::Credential credential =
        firebase::auth::GitHubAuthProvider::GetCredential(token);
    firebase::Future<firebase::auth::User*> result =
        auth->SignInWithCredential(credential);
    
  3. 如果你的程序有一個更新循環,定期運行(以每秒30或60次說),你可以檢查每用一次更新的結果Auth::SignInWithCredentialLastResult
    firebase::Future<firebase::auth::User*> result =
        auth->SignInWithCredentialLastResult();
    if (result.status() == firebase::kFutureStatusComplete) {
      if (result.error() == firebase::auth::kAuthErrorNone) {
        firebase::auth::User* user = *result.result();
        printf("Sign in succeeded for `%s`\n", user->display_name().c_str());
      } else {
        printf("Sign in failed with error '%s'\n", result.error_message());
      }
    }
    
    或者,如果你的程序是事件驅動的,你可能更喜歡以登記在未來的回調

在 Future 上註冊回調

有些程序Update被稱為每秒30或60次功能。例如,許多遊戲都遵循這種模式。這些程序可以調用LastResult功能輪詢異步調用。但是,如果您的程序是事件驅動的,您可能更喜歡註冊回調函數。在 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::User*> result =
      auth->CreateUserWithEmailAndPasswordLastResult();

  // `&my_program_context` is passed verbatim to OnCreateCallback().
  result.OnCompletion(OnCreateCallback, &my_program_context);
}
回調函數也可以是一個lambda,如果你喜歡。
void CreateUserUsingLambda(firebase::auth::Auth* auth) {
  // Callbacks work the same for any firebase::Future.
  firebase::Future<firebase::auth::User*> 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);
}

下一步

用戶首次登錄後,將創建一個新用戶帳戶並將其鏈接到用戶登錄時使用的憑據(即用戶名和密碼、電話號碼或身份驗證提供商信息)。這個新帳戶作為 Firebase 項目的一部分存儲,可用於識別項目中每個應用中的用戶,無論用戶如何登錄。

  • 在您的應用程序,你可以從用戶的基本資料信息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();
    }
    
  • 在你的火力地堡實時數據庫和雲存儲安全規則,你可以得到簽署的,從用戶的唯一的用戶ID auth的變量,並用它來控制哪些數據的用戶可以訪問。

您可以允許用戶通過使用多個身份驗證提供登錄到您的應用程序連接身份驗證提供憑據到現有的用戶帳戶。

要註銷用戶,調用SignOut()

auth->SignOut();