คุณสามารถใช้การตรวจสอบสิทธิ์ Firebase เพื่อให้ผู้ใช้ตรวจสอบสิทธิ์กับ Firebase โดยใช้ที่อยู่อีเมลและรหัสผ่าน และเพื่อจัดการบัญชีที่ใช้รหัสผ่านของแอป
ก่อนที่คุณจะเริ่มต้น
- เพิ่ม Firebase ในโครงการ C++ ของ คุณ
- หากคุณยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้เชื่อมต่อจาก คอนโซล Firebase
- เปิดใช้งานการลงชื่อเข้าใช้ด้วยอีเมล/รหัสผ่าน:
- ใน คอนโซล Firebase ให้เปิดส่วนการ รับรอง ความถูกต้อง
- บนแท็บ วิธีการลงชื่อเข้า ใช้ ให้เปิดใช้งานวิธีการลงชื่อเข้าใช้ด้วย อีเมล/รหัสผ่าน แล้วคลิก บันทึก
เข้าถึงคลาส firebase::auth::Auth
คลาส Auth
เป็นเกตเวย์สำหรับการเรียก API ทั้งหมด- เพิ่มไฟล์ส่วนหัวของ Auth และ App:
#include "firebase/app.h" #include "firebase/auth.h"
- ในโค้ดเริ่มต้นของคุณ ให้สร้างคลาส
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__)
- รับคลาส
firebase::auth::Auth
สำหรับfirebase::App
ของคุณ มีการแมปแบบหนึ่งต่อหนึ่งระหว่างApp
และAuth
firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
สร้างบัญชีที่ใช้รหัสผ่าน
หากต้องการสร้างบัญชีผู้ใช้ใหม่ด้วยรหัสผ่าน ให้ทำตามขั้นตอนต่อไปนี้ในรหัสลงชื่อเข้าใช้แอปของคุณ:
- เมื่อผู้ใช้ใหม่ลงชื่อสมัครใช้โดยใช้แบบฟอร์มลงชื่อสมัครใช้ของแอป ให้ทำตามขั้นตอนการตรวจสอบความถูกต้องของบัญชีใหม่ที่แอปของคุณต้องการ เช่น ตรวจสอบว่ารหัสผ่านของบัญชีใหม่พิมพ์ถูกต้องและตรงตามข้อกำหนดด้านความซับซ้อนของคุณ
- สร้างบัญชีใหม่โดยส่งที่อยู่อีเมลและรหัสผ่านของผู้ใช้ใหม่ไปที่
Auth::CreateUserWithEmailAndPassword
:firebase::Future<firebase::auth::AuthResult> result = auth->CreateUserWithEmailAndPassword(email, password);
- หากโปรแกรมของคุณมีลูปการอัปเดตที่ทำงานเป็นประจำ (พูดที่ 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()); } }
หรือถ้าโปรแกรมของคุณขับเคลื่อนด้วยเหตุการณ์ คุณอาจต้องการ เพื่อ ลงทะเบียนการโทรกลับในอนาคต
ลงชื่อเข้าใช้ผู้ใช้ด้วยที่อยู่อีเมลและรหัสผ่าน
ขั้นตอนในการลงชื่อเข้าใช้ผู้ใช้ด้วยรหัสผ่านจะคล้ายกับขั้นตอนสำหรับการสร้างบัญชีใหม่ ในฟังก์ชันการลงชื่อเข้าใช้แอปของคุณ ให้ทำดังต่อไปนี้:
- เมื่อผู้ใช้ลงชื่อเข้าใช้แอปของคุณ ให้ส่งที่อยู่อีเมลและรหัสผ่านของผู้ใช้ไปยัง
firebase::auth::Auth::SignInWithEmailAndPassword
:firebase::Future<firebase::auth::AuthResult> result = auth->SignInWithEmailAndPassword(email, password);
- หากโปรแกรมของคุณมีลูปการอัปเดตที่ทำงานเป็นประจำ (พูดที่ 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 บางวิธีที่ใช้ที่อยู่อีเมลเป็นพารามิเตอร์ทำให้เกิดข้อผิดพลาดเฉพาะ หากที่อยู่อีเมลไม่ได้ลงทะเบียนเมื่อต้องลงทะเบียน (เช่น เมื่อลงชื่อเข้าใช้ด้วยที่อยู่อีเมลและรหัสผ่าน) หรือลงทะเบียนเมื่อไม่ได้ใช้งาน (เช่น เมื่อเปลี่ยนที่อยู่อีเมลของผู้ใช้) แม้ว่าสิ่งนี้จะเป็นประโยชน์สำหรับการแนะนำวิธีแก้ไขเฉพาะแก่ผู้ใช้ แต่ผู้ไม่ประสงค์ดีก็สามารถใช้ในทางที่ผิดเพื่อค้นหาที่อยู่อีเมลที่ลงทะเบียนโดยผู้ใช้ของคุณ
เพื่อลดความเสี่ยงนี้ เราขอแนะนำให้คุณ เปิดใช้งานการป้องกันการแจงนับอีเมล สำหรับโครงการของคุณโดยใช้เครื่องมือ Google Cloud gcloud
โปรดทราบว่าการเปิดใช้คุณลักษณะนี้จะเปลี่ยนพฤติกรรมการรายงานข้อผิดพลาดของ Firebase Authentication ตรวจสอบให้แน่ใจว่าแอปของคุณไม่ได้อาศัยข้อผิดพลาดที่เฉพาะเจาะจงมากกว่านี้
ขั้นตอนถัดไป
หลังจากที่ผู้ใช้ลงชื่อเข้าใช้เป็นครั้งแรก บัญชีผู้ใช้ใหม่จะถูกสร้างขึ้นและเชื่อมโยงกับข้อมูลประจำตัว ซึ่งก็คือชื่อผู้ใช้และรหัสผ่าน หมายเลขโทรศัพท์ หรือข้อมูลผู้ให้บริการตรวจสอบสิทธิ์ ซึ่งผู้ใช้ลงชื่อเข้าใช้ด้วย บัญชีใหม่นี้จัดเก็บเป็นส่วนหนึ่งของโปรเจ็กต์ Firebase และสามารถใช้ระบุผู้ใช้ในทุกแอปในโครงการ ไม่ว่าผู้ใช้จะลงชื่อเข้าใช้ด้วยวิธีใดก็ตาม
ในแอปของคุณ คุณสามารถรับข้อมูลโปรไฟล์พื้นฐานของผู้ใช้ได้จาก
firebase::auth::User
object: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 คุณสามารถรับ ID ผู้ใช้ที่ไม่ซ้ำกันของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร
auth
ความถูกต้อง และใช้เพื่อควบคุมข้อมูลที่ผู้ใช้สามารถเข้าถึงได้
คุณสามารถอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้แอปของคุณโดยใช้ผู้ให้บริการตรวจสอบสิทธิ์หลายรายโดย เชื่อมโยงข้อมูลประจำตัวของผู้ให้บริการตรวจสอบสิทธิ์กับบัญชีผู้ใช้ที่มีอยู่
หากต้องการลงชื่อออกจากผู้ใช้ ให้โทร SignOut()
:
auth->SignOut();