콘솔로 이동

맞춤 인증 시스템과 C++를 사용하여 Firebase 인증하기

Firebase 인증에 맞춤 인증 시스템을 통합할 수 있습니다. 사용자가 정상적으로 로그인할 때 맞춤 서명 토큰을 발행하도록 인증 서버를 수정하면 됩니다. 그러면 앱이 이 토큰을 받아 Firebase 인증에 사용합니다.

시작하기 전에

  1. C++ 프로젝트에 Firebase를 추가합니다.

  2. 다음과 같이 프로젝트의 서버 키를 가져옵니다.
    1. 프로젝트 설정의 서비스 계정 페이지로 이동합니다.
    2. 서비스 계정 페이지의 Firebase Admin SDK 섹션 하단에서 새 비공개 키 생성을 클릭합니다.
    3. 새 서비스 계정의 공개키/비공개키 쌍이 자동으로 컴퓨터에 저장됩니다. 이 파일을 인증 서버에 복사합니다.

Firebase로 인증하기

Auth 클래스는 모든 API 호출에 대한 게이트웨이입니다.
  1. Auth 및 App 헤더 파일을 추가합니다.
    #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::Appfirebase::auth::Auth 클래스를 가져옵니다. AppAuth는 1:1 매핑 관계입니다.
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
    
인증 서버에서 받은 토큰을 사용해 Auth::SignInWithCustomToken을 호출합니다.
  1. 사용자가 앱에 로그인하면 사용자의 로그인 인증 정보(예: 사용자 이름과 비밀번호)를 인증 서버로 전송하세요. 서버가 사용자 인증 정보를 확인하여 정보가 유효하면 맞춤 토큰을 반환합니다.
  2. 인증 서버에서 맞춤 토큰을 받은 후 다음과 같이 이 토큰을 Auth::SignInWithCustomToken에 전달하여 사용자를 로그인 처리합니다.
    firebase::Future<firebase::auth::User*> result =
        auth->SignInWithCustomToken(custom_token);
    
  3. 프로그램에 정기적으로 실행되는 업데이트 루프(예: 초당 30회 또는 60회)가 있는 경우 다음과 같이 Auth::SignInWithCustomTokenLastResult를 사용해 업데이트 시마다 한 번씩 결과를 확인할 수 있습니다.
    firebase::Future<firebase::auth::User*> result =
        auth->SignInWithCustomTokenLastResult();
    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에 콜백을 등록하는 것이 바람직할지도 모릅니다.

다음 단계

사용자가 처음으로 로그인하면 신규 사용자 계정이 생성되고 사용자 인증 정보(사용자가 로그인할 때 사용한 사용자 이름과 비밀번호, 전화번호 또는 인증 제공업체 정보)에 연결됩니다. 이 신규 계정은 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 보안 규칙에서 로그인한 사용자의 순 사용자 ID를 auth 변수로부터 가져온 후 이 ID를 통해 사용자가 액세스할 수 있는 데이터를 관리할 수 있습니다.

인증 제공업체의 사용자 인증 정보를 기존 사용자 계정에 연결하면 사용자가 여러 인증 제공업체를 통해 앱에 로그인할 수 있습니다.

사용자를 로그아웃시키려면 SignOut()을 호출합니다.

auth->SignOut();