C++ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ-āĻ­āĻŋāĻ¤ā§āϤāĻŋāĻ• āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ Firebase-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻ•āϰ⧁āύ

āφāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϤāĻžāĻĻ⧇āϰ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ Firebase āĻāϰ āϏāĻžāĻĨ⧇ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ-āĻ­āĻŋāĻ¤ā§āϤāĻŋāĻ• āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϗ⧁āϞāĻŋ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāϤ⧇ āφāĻĒāύāĻŋ Firebase Authentication āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āφāĻĒāύāĻŋ āĻļ⧁āϰ⧁ āĻ•āϰāĻžāϰ āφāϗ⧇

  1. āφāĻĒāύāĻžāϰ C++ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇ Firebase āϝ⧋āĻ— āĻ•āϰ⧁āύ āĨ¤
  2. āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻ–āύāĻ“ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒāϟāĻŋāϕ⧇ āφāĻĒāύāĻžāϰ Firebase āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āύāĻž āĻ•āϰ⧇ āĻĨāĻžāϕ⧇āύ, āϤāĻžāĻšāϞ⧇ Firebase āĻ•āύāϏ⧋āϞ āĻĨ⧇āϕ⧇ āϤāĻž āĻ•āϰ⧁āύ⧎
  3. āχāĻŽā§‡āϞ/āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϏāĻžāχāύ-āχāύ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ:
    1. Firebase āĻ•āύāϏ⧋āϞ⧇ , Auth āĻŦāĻŋāĻ­āĻžāĻ—āϟāĻŋ āϖ⧁āϞ⧁āύāĨ¤
    2. āϏāĻžāχāύ āχāύ āĻĒāĻĻā§āϧāϤāĻŋ āĻŸā§āϝāĻžāĻŦ⧇, āχāĻŽā§‡āϞ/āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϏāĻžāχāύ-āχāύ āĻĒāĻĻā§āϧāϤāĻŋ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύāĨ¤

firebase::auth::Auth āĻ•ā§āϞāĻžāϏ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰ⧁āύ

Auth āĻ•ā§āϞāĻžāϏ āĻšāϞ āϏāĻŽāĻ¸ā§āϤ API āĻ•āϞ⧇āϰ āϗ⧇āϟāĻ“āϝāĻŧ⧇āĨ¤
  1. Auth āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻĒ āĻšā§‡āĻĄāĻžāϰ āĻĢāĻžāχāϞ āϝ⧋āĻ— āĻ•āϰ⧁āύ:
    #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 āĻ•ā§āϞāĻžāϏ āĻ…āĻ°ā§āϜāύ āĻ•āϰ⧁āύāĨ¤ App āĻāĻŦāĻ‚ Auth āĻŽāĻ§ā§āϝ⧇ āĻ“āϝāĻŧāĻžāύ-āϟ⧁-āĻ“āϝāĻŧāĻžāύ āĻŽā§āϝāĻžāĻĒāĻŋāĻ‚ āφāϛ⧇āĨ¤
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);

āĻāĻ•āϟāĻŋ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ-āĻ­āĻŋāĻ¤ā§āϤāĻŋāĻ• āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

āĻāĻ•āϟāĻŋ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϏāĻš āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇, āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āϏāĻžāχāύ-āχāύ āϕ⧋āĻĄā§‡ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒāϗ⧁āϞāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āϰ⧁āύ:

  1. āϝāĻ–āύ āĻāĻ•āϜāύ āύāϤ⧁āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āϏāĻžāχāύ-āφāĻĒ āĻĢāĻ°ā§āĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϏāĻžāχāύ āφāĻĒ āĻ•āϰ⧇āύ, āϤāĻ–āύ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āϝ⧇āϕ⧋āύ āύāϤ⧁āύ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϝāĻžāϚāĻžāχāĻ•āϰāϪ⧇āϰ āϧāĻžāĻĒāϗ⧁āϞāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āϰ⧁āύ, āϝ⧇āĻŽāύ āύāϤ⧁āύ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡āϰ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āϟāĻžāχāĻĒ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻ•āĻŋāύāĻž āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āϜāϟāĻŋāϞāϤāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻž āĻĒā§‚āϰāĻŖ āĻ•āϰ⧇ āϤāĻž āϝāĻžāϚāĻžāχ āĻ•āϰāĻžāĨ¤
  2. āύāϤ⧁āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ Auth::CreateUserWithEmailAndPassword āĻ āĻĻāĻŋāϝāĻŧ⧇ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύāĨ¤
    firebase::Future<firebase::auth::AuthResult> result =
        auth->CreateUserWithEmailAndPassword(email, password);
  3. āϝāĻĻāĻŋ āφāĻĒāύāĻžāϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡ āĻāĻ•āϟāĻŋ āφāĻĒāĻĄā§‡āϟ āϞ⧁āĻĒ āĻĨāĻžāϕ⧇ āϝāĻž āύāĻŋāϝāĻŧāĻŽāĻŋāϤ āϚāϞ⧇ (āĻŦāϞ⧁āύ āĻĒā§āϰāϤāĻŋ āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡ 30 āĻŦāĻž 60 āĻŦāĻžāϰ), āφāĻĒāύāĻŋ Auth::CreateUserWithEmailAndPasswordLastResult āϏāĻžāĻĨ⧇ āφāĻĒāĻĄā§‡āϟ āĻĒā§āϰāϤāĻŋ āĻāĻ•āĻŦāĻžāϰ āĻĢāϞāĻžāĻĢāϞ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:
    firebase::Future<firebase::auth::AuthResult> result =
        auth->CreateUserWithEmailAndPasswordLastResult();
    if (result.status() == firebase::kFutureStatusComplete) {
      if (result.error() == firebase::auth::kAuthErrorNone) {
        const firebase::auth::AuthResult auth_result = *result.result();
        printf("Create user succeeded for email %s\n",
               auth_result.user.email().c_str());
      } else {
        printf("Created user failed with error '%s'\n", result.error_message());
      }
    }
    āĻ…āĻĨāĻŦāĻž, āϝāĻĻāĻŋ āφāĻĒāύāĻžāϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āχāϭ⧇āĻ¨ā§āϟ āϚāĻžāϞāĻŋāϤ āĻšāϝāĻŧ, āφāĻĒāύāĻŋ āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇ āĻāĻ•āϟāĻŋ āĻ•āϞāĻŦā§āϝāĻžāĻ• āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰāϤ⧇ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āĻāĻ•āϟāĻŋ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĻāĻŋāϝāĻŧ⧇ āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϏāĻžāχāύ āχāύ āĻ•āϰ⧁āύ

āĻāĻ•āϟāĻŋ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĻāĻŋāϝāĻŧ⧇ āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϏāĻžāχāύ āχāύ āĻ•āϰāĻžāϰ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒāϗ⧁āϞāĻŋ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋāϰ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒāϗ⧁āϞāĻŋāϰ āĻ…āύ⧁āϰ⧂āĻĒ⧎ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āϏāĻžāχāύ-āχāύ āĻĢāĻžāĻ‚āĻļāύ⧇, āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤāϗ⧁āϞāĻŋ āĻ•āϰ⧁āύ:

  1. āϝāĻ–āύ āĻāĻ•āϜāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇ āϏāĻžāχāύ āχāύ āĻ•āϰ⧇āύ, āϤāĻ–āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄāϟāĻŋ firebase::auth::Auth::SignInWithEmailAndPassword āĻ āĻĒāĻžāϏ āĻ•āϰ⧁āύāĨ¤
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInWithEmailAndPassword(email, password);
  2. āϝāĻĻāĻŋ āφāĻĒāύāĻžāϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡ āĻāĻ•āϟāĻŋ āφāĻĒāĻĄā§‡āϟ āϞ⧁āĻĒ āĻĨāĻžāϕ⧇ āϝāĻž āύāĻŋāϝāĻŧāĻŽāĻŋāϤāĻ­āĻžāĻŦ⧇ āϚāϞ⧇ (āĻŦāϞ⧁āύ āĻĒā§āϰāϤāĻŋ āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡ 30 āĻŦāĻž 60 āĻŦāĻžāϰ), āφāĻĒāύāĻŋ Auth::SignInWithEmailAndPasswordLastResult āϏāĻžāĻĨ⧇ āφāĻĒāĻĄā§‡āϟ āĻĒā§āϰāϤāĻŋ āĻāĻ•āĻŦāĻžāϰ āĻĢāϞāĻžāĻĢāϞ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ :
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInWithEmailAndPasswordLastResult();
    if (result.status() == firebase::kFutureStatusComplete) {
      if (result.error() == firebase::auth::kAuthErrorNone) {
        const firebase::auth::AuthResult auth_result = *result.result();
        printf("Sign in succeeded for email %s\n",
               auth_result.user.email().c_str());
      } else {
        printf("Sign in failed with error '%s'\n", result.error_message());
      }
    }
    āĻ…āĻĨāĻŦāĻž, āϝāĻĻāĻŋ āφāĻĒāύāĻžāϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āχāϭ⧇āĻ¨ā§āϟ āϚāĻžāϞāĻŋāϤ āĻšāϝāĻŧ, āφāĻĒāύāĻŋ āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇ āĻāĻ•āϟāĻŋ āĻ•āϞāĻŦā§āϝāĻžāĻ• āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰāϤ⧇ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āĻāĻ•āϟāĻŋ āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇ āĻāĻ•āϟāĻŋ āĻ•āϞāĻŦā§āϝāĻžāĻ• āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰ⧁āύ

āĻ•āĻŋāϛ⧁ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡ Update āĻĢāĻžāĻ‚āĻļāύ āĻĨāĻžāϕ⧇ āϝāĻž āĻĒā§āϰāϤāĻŋ āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡ 30 āĻŦāĻž 60 āĻŦāĻžāϰ āĻŦāϞāĻž āĻšāϝāĻŧāĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻ…āύ⧇āĻ• āϗ⧇āĻŽ āĻāχ āĻŽāĻĄā§‡āϞ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇āĨ¤ āĻāχ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϗ⧁āϞāĻŋ āĻ…ā§āϝāĻžāϏāĻŋāĻ™ā§āĻ•ā§āϰ⧋āύāĻžāϏ āĻ•āϞāϗ⧁āϞāĻŋ āĻĒā§‹āϞ āĻ•āϰāϤ⧇ LastResult āĻĢāĻžāĻ‚āĻļāύāϗ⧁āϞāĻŋāϕ⧇ āĻ•āϞ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āϝāĻžāχāĻšā§‹āĻ•, āϝāĻĻāĻŋ āφāĻĒāύāĻžāϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āχāϭ⧇āĻ¨ā§āϟ āϚāĻžāϞāĻŋāϤ āĻšāϝāĻŧ, āφāĻĒāύāĻŋ āĻ•āϞāĻŦā§āϝāĻžāĻ• āĻĢāĻžāĻ‚āĻļāύ āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰāϤ⧇ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āĻāĻ•āϟāĻŋ āĻ•āϞāĻŦā§āϝāĻžāĻ• āĻĢāĻžāĻ‚āĻļāύ āĻ­āĻŦāĻŋāĻˇā§āϝāϤ āϏāĻŽāĻžāĻĒā§āϤāĻŋāϰ āωāĻĒāϰ āĻŦāϞāĻž āĻšāϝāĻŧāĨ¤
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);
}
āĻ•āϞāĻŦā§āϝāĻžāĻ• āĻĢāĻžāĻ‚āĻļāύāϟāĻŋāĻ“ āĻāĻ•āϟāĻŋ āĻ˛ā§āϝāĻžāĻŽā§āĻŦāĻĄāĻž āĻšāϤ⧇ āĻĒāĻžāϰ⧇, āϝāĻĻāĻŋ āφāĻĒāύāĻŋ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰ⧇āύāĨ¤
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);
}

āĻĒā§āϰāĻ¸ā§āϤāĻžāĻŦāĻŋāϤ: āĻāĻ•āϟāĻŋ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āύ⧀āϤāĻŋ āϏ⧇āϟ āĻ•āϰ⧁āύ

āφāĻĒāύāĻŋ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϜāϟāĻŋāϞāϤāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻž āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰ⧇ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āωāĻ¨ā§āύāϤ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āύ⧀āϤāĻŋ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāϤ⧇, Firebase āĻ•āύāϏ⧋āϞ⧇āϰ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āϏ⧇āϟāĻŋāĻ‚āϏ āĻĒ⧃āĻˇā§āĻ āĻžāϝāĻŧ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āύ⧀āϤāĻŋ āĻŸā§āϝāĻžāĻŦāϟāĻŋ āϖ⧁āϞ⧁āύ:

āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āϏ⧇āϟāĻŋāĻ‚āϏ

Firebase Authentication āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āύ⧀āϤāĻŋ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻž āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇:

  • āϛ⧋āϟ āĻšāĻžāϤ⧇āϰ āĻ…āĻ•ā§āώāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ

  • āĻŦāĻĄāĻŧ āĻšāĻžāϤ⧇āϰ āĻ…āĻ•ā§āώāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ

  • āϏāĻ‚āĻ–ā§āϝāĻžāϏ⧂āϚāĻ• āĻ…āĻ•ā§āώāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ

  • āύāύ-āφāϞāĻĢāĻžāύāĻŋāωāĻŽā§‡āϰāĻŋāĻ• āĻ…āĻ•ā§āώāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ

    āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻ…āĻ•ā§āώāϰāϗ⧁āϞāĻŋ āĻ…-āφāϞāĻĢāĻžāύāĻŋāωāĻŽā§‡āϰāĻŋāĻ• āĻ…āĻ•ā§āώāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻž āĻĒā§‚āϰāĻŖ āĻ•āϰ⧇: ^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~

  • āĻ¨ā§āϝ⧂āύāϤāĻŽ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĻ⧈āĻ°ā§āĻ˜ā§āϝ (6 āĻĨ⧇āϕ⧇ 30 āĻ…āĻ•ā§āώāϰ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ; āĻĄāĻŋāĻĢāĻ˛ā§āϟ 6 āĻĒāĻ°ā§āϝāĻ¨ā§āϤ)

  • āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄā§‡āϰ āϏāĻ°ā§āĻŦā§‹āĻšā§āϚ āĻĻ⧈āĻ°ā§āĻ˜ā§āϝ (āϏāĻ°ā§āĻŦāĻžāϧāĻŋāĻ• āĻĻ⧈āĻ°ā§āĻ˜ā§āϝ 4096 āĻ…āĻ•ā§āώāϰ)

āφāĻĒāύāĻŋ āĻĻ⧁āϟāĻŋ āĻŽā§‹āĻĄā§‡ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āύ⧀āϤāĻŋ āĻĒā§āϰāϝāĻŧā§‹āĻ— āϏāĻ•ā§āώāĻŽ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:

  • āĻĒā§āϰāϝāĻŧā§‹āϜāύ : āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āφāĻĒāύāĻžāϰ āύ⧀āϤāĻŋ āĻŽā§‡āύ⧇ āϚāϞāĻž āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āφāĻĒāĻĄā§‡āϟ āύāĻž āĻ•āϰāĻž āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āϏāĻžāχāύ āφāĻĒ āĻ•āϰāĻžāϰ āĻĒā§āϰāĻšā§‡āĻˇā§āϟāĻž āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϝāĻŧāĨ¤

  • āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ : āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻāĻ•āϟāĻŋ āĻ…-āϏāĻ™ā§āĻ—āϤ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĻāĻŋāϝāĻŧ⧇ āϏāĻžāχāύ āφāĻĒ āĻ•āϰāĻžāϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧāĨ¤ āĻāχ āĻŽā§‹āĻĄāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄāϟāĻŋ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻĒāĻ•ā§āώ⧇āϰ āύ⧀āϤāĻŋāϰ āϏāĻžāĻĨ⧇ āϏāĻ™ā§āĻ—āϤāĻŋāĻĒā§‚āĻ°ā§āĻŖ āĻ•āĻŋāύāĻž āϤāĻž āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻž āωāϚāĻŋāϤ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āϤāĻžāĻĻ⧇āϰ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ…āύ⧁āϰ⧋āϧ āĻ•āϰāĻž āωāϚāĻŋāϤ āϝāĻĻāĻŋ āĻāϟāĻŋ āĻŽā§‡āύ⧇ āύāĻž āϚāϞ⧇āĨ¤

āύāϤ⧁āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϏāĻ°ā§āĻŦāĻĻāĻž āĻāĻ•āϟāĻŋ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϚāϝāĻŧāύ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϝāĻž āφāĻĒāύāĻžāϰ āύ⧀āϤāĻŋ āĻŽā§‡āύ⧇ āϚāϞ⧇āĨ¤

āφāĻĒāύāĻžāϰ āϝāĻĻāĻŋ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻĨāĻžāϕ⧇, āφāĻŽāϰāĻž āϏ⧁āĻĒāĻžāϰāĻŋāĻļ āĻ•āϰāĻŋ āϏāĻžāχāύ āχāύ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻœā§‹āϰ āĻ•āϰ⧇ āφāĻĒāĻ—ā§āϰ⧇āĻĄ āϏāĻ•ā§āώāĻŽ āύāĻž āĻ•āϰāĻž āϝāϤāĻ•ā§āώāĻŖ āύāĻž āφāĻĒāύāĻŋ āĻāĻŽāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻŦā§āϞāĻ• āĻ•āϰāϤ⧇ āϚāĻžāύ āϝāĻžāĻĻ⧇āϰ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄāϗ⧁āϞāĻŋ āφāĻĒāύāĻžāϰ āύ⧀āϤāĻŋ āĻŽā§‡āύ⧇ āϚāϞ⧇ āύāĻžā§ˇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇, āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ āĻŽā§‹āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ, āϝāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϤāĻžāĻĻ⧇āϰ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĻāĻŋāϝāĻŧ⧇ āϏāĻžāχāύ āχāύ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧ āĻāĻŦāĻ‚ āϤāĻžāĻĻ⧇āϰ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄā§‡āϰ āĻ…āĻ­āĻžāĻŦ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻž āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϤāĻžāĻĻ⧇āϰ āĻ…āĻŦāĻšāĻŋāϤ āĻ•āϰ⧇āĨ¤

āĻĒā§āϰāĻ¸ā§āϤāĻžāĻŦāĻŋāϤ: āχāĻŽā§‡āϞ āĻ—āĻŖāύāĻž āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ

āĻ•āĻŋāϛ⧁ Firebase Authentication āĻĒāĻĻā§āϧāϤāĻŋ āϝāĻž āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻžāϗ⧁āϞāĻŋāϕ⧇ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰ⧇ āϏ⧇āϗ⧁āϞāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ¤ā§āϰ⧁āϟāĻŋāϗ⧁āϞāĻŋ āĻĢ⧇āϞ⧇ āϝāĻĻāĻŋ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻžāϟāĻŋ āύāĻŋāĻŦāĻ¨ā§āϧāĻŋāϤ āύāĻž āĻĨāĻžāĻ•āĻž āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āĻĨāĻžāϕ⧇ (āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻāĻ•āϟāĻŋ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĻāĻŋāϝāĻŧ⧇ āϏāĻžāχāύ āχāύ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ), āĻŦāĻž āϝāĻ–āύ āĻāϟāĻŋ āĻ…āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧ āϤāĻ–āύ āύāĻŋāĻŦāĻ¨ā§āϧāĻŋāϤ āĻšāϝāĻŧ (āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ)āĨ¤ āϝāĻĻāĻŋāĻ“ āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĒā§āϰāϤāĻŋāĻ•āĻžāϰ⧇āϰ āĻĒāϰāĻžāĻŽāĻ°ā§āĻļ āĻĻ⧇āĻ“āϝāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āϏāĻšāĻžāϝāĻŧāĻ• āĻšāϤ⧇ āĻĒāĻžāϰ⧇, āĻāϟāĻŋ āφāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻĻā§āĻŦāĻžāϰāĻž āύāĻŋāĻŦāĻ¨ā§āϧāĻŋāϤ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻžāϗ⧁āϞāĻŋ āφāĻŦāĻŋāĻˇā§āĻ•āĻžāϰ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻĻā§‚āώāĻŋāϤ āĻ…āĻ­āĻŋāύ⧇āϤāĻžāĻĻ⧇āϰ āĻĻā§āĻŦāĻžāϰāĻž āĻ…āĻĒāĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āĻāχ āĻā§āρāĻ•āĻŋ āĻ•āĻŽāĻžāϤ⧇, āφāĻŽāϰāĻž āφāĻĒāύāĻžāϕ⧇ Google Cloud gcloud āϟ⧁āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϜāĻ¨ā§āϝ āχāĻŽā§‡āϞ āĻ—āĻŖāύāĻž āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻ•ā§āώāĻŽ āĻ•āϰāĻžāϰ āϏ⧁āĻĒāĻžāϰāĻŋāĻļ āĻ•āϰāĻ›āĻŋāĨ¤ āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āύ āϝ⧇ āĻāχ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϟāĻŋ āϏāĻ•ā§āώāĻŽ āĻ•āϰāϞ⧇ Firebase Authentication āĻ¤ā§āϰ⧁āϟāĻŋ āϰāĻŋāĻĒā§‹āĻ°ā§āϟāĻŋāĻ‚ āφāϚāϰāĻŖ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻšāϝāĻŧ: āύāĻŋāĻļā§āϚāĻŋāϤ āĻšāύ āϝ⧇ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒāϟāĻŋ āφāϰāĻ“ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ¤ā§āϰ⧁āϟāĻŋāϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇ āύāĻžāĨ¤

āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒ

āĻāĻ•āϜāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āϏāĻžāχāύ āχāύ āĻ•āϰāĻžāϰ āĻĒāϰ⧇, āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ‚ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāĻž āĻšāϝāĻŧ—āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ, āĻĢā§‹āύ āύāĻŽā§āĻŦāϰ, āĻŦāĻž āĻĒā§āϰāĻŽāĻžāĻŖ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀āϰ āϤāĻĨā§āϝ — āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϏāĻžāχāύ āχāύ āĻ•āϰ⧇āϛ⧇āύāĨ¤ āĻāχ āύāϤ⧁āύ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϟāĻŋ āφāĻĒāύāĻžāϰ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻ…āĻ‚āĻļ āĻšāĻŋāϏāĻžāĻŦ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϕ⧀āĻ­āĻžāĻŦ⧇ āϏāĻžāχāύ āχāύ āĻ•āϰ⧁āύ āύāĻž āϕ⧇āύ, āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ…ā§āϝāĻžāĻĒ āϜ⧁āĻĄāĻŧ⧇ āĻāĻ•āϜāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āĻļāύāĻžāĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

  • āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇, āφāĻĒāύāĻŋ 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();
    }
  • āφāĻĒāύāĻžāϰ Firebase Realtime Database āĻāĻŦāĻ‚ Cloud Storage āϏ⧁āϰāĻ•ā§āώāĻž āύāĻŋāϝāĻŧāĻŽā§‡ , āφāĻĒāύāĻŋ auth āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āĻĨ⧇āϕ⧇ āϏāĻžāχāύ-āχāύ āĻ•āϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ…āύāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āφāχāĻĄāĻŋ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϕ⧋āύ āĻĄā§‡āϟāĻž āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āϤāĻž āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāϤ⧇ āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀āϰ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇ āϏāĻžāχāύ āχāύ āĻ•āϰāĻžāϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āĻāĻ•āϜāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āϏāĻžāχāύ āφāωāϟ āĻ•āϰāϤ⧇, SignOut() āĻ•āϞ āĻ•āϰ⧁āύ :

auth->SignOut();