ตรวจสอบสิทธิ์โดยใช้ GitHub และ C++

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

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

  1. เพิ่ม Firebase ไปยังโปรเจ็กต์ C++
  2. ในคอนโซล Firebase ให้เปิดส่วน Auth
  3. ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้ผู้ให้บริการ GitHub
  4. เพิ่มรหัสไคลเอ็นต์และรหัสลับไคลเอ็นต์จาก Play Console ของผู้ให้บริการรายนั้นลงใน การกำหนดค่าผู้ให้บริการ:
    1. ลงทะเบียนแอป ในฐานะแอปพลิเคชันสำหรับนักพัฒนาซอฟต์แวร์ใน GitHub และรับรหัสไคลเอ็นต์ OAuth 2.0 ของแอป และรหัสลับไคลเอ็นต์
    2. ตรวจสอบว่า URL การเปลี่ยนเส้นทาง OAuth ของ Firebase (เช่น my-app-12345.firebaseapp.com/__/auth/handler) มีการตั้งค่าเป็น URL เรียกกลับเรื่องการให้สิทธิ์ในหน้าการตั้งค่าของแอปบนหน้า การกำหนดค่าของแอป GitHub
  5. คลิกบันทึก

เข้าถึงชั้นเรียน 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 และ iOS+ เพื่อรับโทเค็นสำหรับผู้ใช้ GitHub ที่ลงชื่อเข้าใช้
  2. หลังจากที่ผู้ใช้ลงชื่อเข้าใช้สำเร็จแล้ว ให้แลกเปลี่ยนโทเค็นเป็น ข้อมูลเข้าสู่ระบบ Firebase และตรวจสอบสิทธิ์กับ Firebase โดยใช้ Firebase ข้อมูลเข้าสู่ระบบ:
    firebase::auth::Credential credential =     firebase::auth::GitHubAuthProvider::GetCredential(token); firebase::Future<firebase::auth::AuthResult> result =     auth->SignInAndRetrieveDataWithCredential(credential);
  3. หากโปรแกรมของคุณมีลูปการอัปเดตที่ทำงานเป็นประจำ (เช่น 30 หรือ 60 วินาที ครั้งต่อวินาที) คุณสามารถตรวจสอบผลลัพธ์ได้ 1 ครั้งต่อการอัปเดตด้วย Auth::SignInAndRetrieveDataWithCredentialLastResult:
    firebase::Future<firebase::auth::AuthResult> result =     auth->SignInAndRetrieveDataWithCredentialLastResult(); if (result.status() == firebase::kFutureStatusComplete) {   if (result.error() == firebase::auth::kAuthErrorNone) {     firebase::auth::AuthResult auth_result = *result.result();     printf("Sign in succeeded for `%s`\n",            auth_result.user.display_name().c_str());   } else {     printf("Sign in failed with error '%s'\n", result.error_message());   } }
    หรือหากโปรแกรมของคุณมีการจัดกิจกรรม คุณอาจต้องการ ลงทะเบียนการโทรกลับใน อนาคต

ลงทะเบียนติดต่อกลับในอนาคต

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