Google은 흑인 공동체를 위한 인종적 평등을 추구하기 위해 노력하고 있습니다. 자세히 알아보기

Google 로그인 및 C++를 사용하여 인증

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

Google 로그인을 앱에 통합하여 사용자가 Google 계정을 사용하여 Firebase에 인증하도록 할 수 있습니다.

시작하기 전에

  1. C++ 프로젝트에 Firebase를 추가합니다 .
  2. Firebase 콘솔에서 로그인 방법으로 Google을 활성화합니다.
    1. Firebase 콘솔 에서 인증 섹션을 엽니다.
    2. 로그인 방법 탭에서 Google 로그인 방법을 활성화하고 저장 을 클릭합니다.

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::App 에 대한 firebase::auth::Auth 클래스를 가져옵니다. AppAuth 간에 일대일 매핑이 있습니다.
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
    

Firebase로 인증

  1. AndroidiOS+용 지침에 따라 Google 로그인용 ID 토큰을 받으세요.
  2. 사용자가 성공적으로 로그인한 후 ID 토큰을 Firebase 자격 증명으로 교환하고 Firebase 자격 증명을 사용하여 Firebase에 인증합니다.
    firebase::auth::Credential credential =
        firebase::auth::GoogleAuthProvider::GetCredential(google_id_token,
                                                          nullptr);
    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 에 콜백을 등록합니다 .

Future에 콜백 등록

일부 프로그램에는 초당 30번 또는 60번 호출되는 Update 기능이 있습니다. 예를 들어 많은 게임이 이 모델을 따릅니다. 이러한 프로그램은 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);
}
원하는 경우 콜백 함수를 람다가 사용할 수도 있습니다.
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();
    }
    
  • Firebase 실시간 데이터베이스 및 Cloud Storage 보안 규칙 에서 auth 변수에서 로그인한 사용자의 고유 사용자 ID를 가져와 사용자가 액세스할 수 있는 데이터를 제어하는 ​​데 사용할 수 있습니다.

인증 공급자 자격 증명을 기존 사용자 계정에 연결하여 사용자가 여러 인증 공급자를 사용하여 앱에 로그인하도록 허용할 수 있습니다.

사용자를 로그아웃하려면 SignOut() 을 호출하십시오.

auth->SignOut();