ตรวจสอบสิทธิ์ด้วย Firebase โดยใช้บัญชีด้วยรหัสผ่านโดยใช้ C++

คุณใช้ Firebase Authentication เพื่อให้ผู้ใช้ตรวจสอบสิทธิ์กับ Firebase โดยใช้อีเมลและรหัสผ่านของตนเอง และเพื่อจัดการบัญชีที่ใช้รหัสผ่านของแอปได้

ก่อนเริ่มต้น

  1. เพิ่ม Firebase ลงในโปรเจ็กต์ C++
  2. หากยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้เชื่อมต่อจากFirebase คอนโซล
  3. เปิดใช้การลงชื่อเข้าใช้ด้วยอีเมล/รหัสผ่าน
    1. ในคอนโซล Firebase ให้เปิด ส่วนการตรวจสอบสิทธิ์
    2. ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้อีเมล/รหัสผ่าน แล้วคลิกบันทึก

เข้าถึงชั้นเรียน 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 มีการแมประหว่าง 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 ครั้งต่อวินาที) คุณสามารถตรวจสอบผลลัพธ์ได้ครั้งละ 1 รายการต่อการอัปเดตด้วย 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 ครั้งต่อวินาที) คุณสามารถตรวจสอบผลลัพธ์ได้ครั้งละ 1 รายการต่อการอัปเดตด้วย 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());   } }
    หรือหากโปรแกรมของคุณอิงตามเหตุการณ์ คุณอาจต้องการลงทะเบียนการเรียกกลับในอนาคต

ลงทะเบียนฟังก์ชันเรียกกลับใน Future

บางโปรแกรมมีUpdateฟังก์ชันที่เรียกใช้ 30 หรือ 60 ครั้งต่อวินาที เช่น เกมหลายเกมใช้โมเดลนี้ โปรแกรมเหล่านี้สามารถเรียกใช้LastResult ฟังก์ชันเพื่อสำรวจการเรียกแบบไม่พร้อมกันได้ อย่างไรก็ตาม หากโปรแกรมของคุณทำงานตามเหตุการณ์ คุณอาจต้องการลงทะเบียนฟังก์ชันเรียกกลับ ระบบจะเรียกใช้ฟังก์ชัน Callback เมื่อ 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::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 อักขระ)

คุณเปิดใช้การบังคับใช้นโยบายรหัสผ่านได้ 2 โหมด ดังนี้

  • กำหนด: การพยายามลงชื่อสมัครใช้จะล้มเหลวจนกว่าผู้ใช้จะอัปเดตรหัสผ่าน ที่เป็นไปตามนโยบายของคุณ

  • แจ้ง: ผู้ใช้จะลงชื่อสมัครใช้ด้วยรหัสผ่านที่ไม่เป็นไปตามนโยบายได้ เมื่อใช้โหมดนี้ คุณควรตรวจสอบว่ารหัสผ่านของผู้ใช้เป็นไปตามนโยบายในฝั่งไคลเอ็นต์หรือไม่ และแจ้งให้ผู้ใช้อัปเดตรหัสผ่านหากไม่เป็นไปตามนโยบาย

ผู้ใช้ใหม่จะต้องเลือกรหัสผ่านที่เป็นไปตามนโยบายของคุณเสมอ

หากมีผู้ใช้ที่ใช้งานอยู่ เราขอแนะนำว่าอย่าเปิดใช้การบังคับอัปเกรดเมื่อลงชื่อเข้าใช้ เว้นแต่คุณต้องการบล็อกการเข้าถึงของผู้ใช้ที่มีรหัสผ่านไม่เป็นไปตาม นโยบายของคุณ แต่ให้ใช้โหมดแจ้งเตือนแทน ซึ่งจะช่วยให้ผู้ใช้ลงชื่อเข้าใช้ด้วย รหัสผ่านปัจจุบันได้ และแจ้งให้ผู้ใช้ทราบถึงข้อกำหนดที่รหัสผ่านยังขาดอยู่

แนะนำ: เปิดใช้การป้องกันการแจงนับอีเมล

เมธอด Firebase Authentication บางอย่างที่ใช้อีเมลเป็นพารามิเตอร์จะแสดงข้อผิดพลาดที่เฉพาะเจาะจงหากอีเมลไม่ได้ลงทะเบียนในกรณีที่ต้องลงทะเบียน (เช่น เมื่อลงชื่อเข้าใช้ด้วยอีเมลและรหัสผ่าน) หรือลงทะเบียน ในกรณีที่ต้องไม่ได้ใช้ (เช่น เมื่อเปลี่ยนอีเมลของผู้ใช้) แม้ว่าฟีเจอร์นี้จะเป็นประโยชน์ในการแนะนำวิธีแก้ไขปัญหาที่เฉพาะเจาะจงแก่ผู้ใช้ แต่ผู้ไม่ประสงค์ดีก็อาจใช้ฟีเจอร์นี้ในทางที่ผิดเพื่อค้นหาอีเมลที่ผู้ใช้ของคุณลงทะเบียนไว้ได้เช่นกัน

เราขอแนะนำให้คุณเปิดใช้การป้องกันการแจงนับอีเมล สำหรับโปรเจ็กต์โดยใช้เครื่องมือ gcloud ของ Google Cloud เพื่อลดความเสี่ยงนี้ โปรดทราบว่าการเปิดใช้ฟีเจอร์นี้จะเปลี่ยนลักษณะการทำงานของการรายงานข้อผิดพลาดของ Firebase Authentication ดังนั้นโปรดตรวจสอบว่าแอปของคุณไม่ได้อิงตามข้อผิดพลาดที่เฉพาะเจาะจงมากขึ้น

ขั้นตอนถัดไป

หลังจากที่ผู้ใช้ลงชื่อเข้าใช้เป็นครั้งแรก ระบบจะสร้างบัญชีผู้ใช้ใหม่และ ลิงก์กับข้อมูลเข้าสู่ระบบ ซึ่งได้แก่ ชื่อผู้ใช้และรหัสผ่าน หมายเลขโทรศัพท์ หรือข้อมูลผู้ให้บริการตรวจสอบสิทธิ์ที่ผู้ใช้ลงชื่อเข้าใช้ ระบบจะจัดเก็บบัญชีใหม่นี้เป็นส่วนหนึ่งของโปรเจ็กต์ Firebase และสามารถใช้เพื่อระบุตัวตน ผู้ใช้ในทุกแอปในโปรเจ็กต์ได้ ไม่ว่าผู้ใช้จะลงชื่อเข้าใช้ด้วยวิธีใดก็ตาม

  • ในแอป คุณจะดูข้อมูลโปรไฟล์พื้นฐานของผู้ใช้ได้จากออบเจ็กต์ 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();