Google 致力于为黑人社区推动种族平等。查看具体举措

Аутентификация с использованием входа в Facebook и C ++

Вы можете позволить своим пользователям проходить аутентификацию с помощью Firebase, используя свои учетные записи Facebook, интегрировав вход через Facebook в свое приложение.

Прежде чем вы начнете

  1. Добавить Firebase в свой проект C ++ .
  2. На Facebook для разработчиков сайта, получить идентификатор приложения и App секрет для вашего приложения.
  3. Включить вход в Facebook:
    1. В Firebase консоли откройте раздел Auth.
    2. На вкладке Входа в методе, включите вход в Facebook метода и указать идентификатор приложения и App Secret вы получили от Facebook.
    3. Затем убедитесь , что ваш OAuth перенаправление URI (например , my-app-12345.firebaseapp.com/__/auth/handler ) указано в качестве одного из вашего OAuth URI переадресации на странице настроек Facebook приложения на Facebook для разработчиков сайта в продукте Настройки> Facebook Войти конфиг.

Доступ к firebase::auth::Auth класс

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::auth::Auth класс для вашего firebase::App . Существует отображение один к одному между App и Auth .
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
    

Аутентифицироваться с Firebase

  1. Следуйте инструкциям для Android и прошивкой , чтобы получить маркер доступа для подписанного в Facebook пользователь.
  2. После того, как пользователь успешно знаки в, обменять маркер доступа для учетных данных Firebase и аутентификацию с использованием Firebase Firebase удостоверение:
    firebase::auth::Credential credential =
        firebase::auth::FacebookAuthProvider::GetCredential(access_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());
      }
    }
    
    Или, если ваша программа приводится событие, вы можете предпочесть чтобы зарегистрировать обратный вызов на будущее .

Зарегистрируйте обратный звонок на будущее

Некоторые программы имеют 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);
}
Функция обратного вызова также может быть лямбда, если вы предпочитаете.
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 переменной и использовать его , чтобы контролировать , какие данные пользователь заходит может.

Вы можете позволить пользователям входить в ваше приложение с помощью нескольких поставщиков проверки подлинности с помощью ссылки AUTH учетных данных поставщика к существующему учетной записи пользователя.

Чтобы выйти пользователь, вызовите SignOut() :

auth->SignOut();