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

คุณสามารถอนุญาตให้ผู้ใช้ตรวจสอบสิทธิ์กับ Firebase โดยใช้ผู้ให้บริการ OAuth เช่น Microsoft Azure Active Directory ได้ด้วยการผสานรวมการเข้าสู่ระบบ OAuth ทั่วไปที่อิงตามเว็บเข้ากับแอปโดยใช้ Firebase SDK เพื่อดำเนินการขั้นตอนการลงชื่อเข้าใช้ตั้งแต่ต้นจนจบ เนื่องจากขั้นตอนดังกล่าวต้องใช้ Firebase SDK ที่อิงตามโทรศัพท์ จึงรองรับเฉพาะแพลตฟอร์ม Android และ Apple เท่านั้น

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

  1. เพิ่ม Firebase ลงในโปรเจ็กต์ C++
  2. ในคอนโซล Firebase ให้ไปที่ ความปลอดภัย > การตรวจสอบสิทธิ์
  3. ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้ผู้ให้บริการการลงชื่อเข้าใช้ Microsoft
  4. เพิ่มรหัสไคลเอ็นต์ และข้อมูลลับของไคลเอ็นต์ จากคอนโซลนักพัฒนาแอปของผู้ให้บริการดังกล่าว ลงในการกำหนดค่าผู้ให้บริการ:
    1. หากต้องการลงทะเบียนไคลเอ็นต์ OAuth ของ Microsoft ให้ทำตามวิธีการใน คู่มือเริ่มต้นฉบับย่อ: ลงทะเบียนแอปกับปลายทาง Azure Active Directory v2.0 โปรดทราบว่าปลายทางนี้รองรับการลงชื่อเข้าใช้โดยใช้บัญชี Microsoft ส่วนบุคคล รวมถึงบัญชี Azure Active Directory ดูข้อมูลเพิ่มเติมเกี่ยวกับ Azure Active Directory v2.0.
    2. เมื่อลงทะเบียนแอปกับผู้ให้บริการเหล่านี้ โปรดลงทะเบียนโดเมน *.firebaseapp.com สำหรับโปรเจ็กต์เป็นโดเมนเปลี่ยนเส้นทาง สำหรับแอป
  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 SDK

หากต้องการจัดการขั้นตอนการลงชื่อเข้าใช้ด้วย Firebase SDK ให้ทำตามขั้นตอนต่อไปนี้

  1. สร้างอินสแตนซ์ของ FederatedOAuthProviderData ที่กำหนดค่าด้วยรหัสผู้ให้บริการที่เหมาะสมสำหรับ Microsoft

    firebase::auth::FederatedOAuthProviderData
        provider_data(firebase::auth::MicrosoftAuthProvider::kProviderId);
    
  2. ไม่บังคับ: ระบุพารามิเตอร์ OAuth ที่กำหนดเองเพิ่มเติมที่ต้องการ ส่งพร้อมกับคำขอ OAuth

    // Prompt user to re-authenticate to Microsoft.
    provider_data.custom_parameters["prompt"] = "login";
    
    // Target specific email with login hint.
    provider_data.custom_parameters["login_hint"] =
        "user@firstadd.onmicrosoft.com";
    

    ดูพารามิเตอร์ที่ Microsoft รองรับได้ใน เอกสารประกอบเกี่ยวกับ OAuth ของ Microsoft โปรดทราบว่าคุณไม่สามารถส่งพารามิเตอร์ที่ Firebase กำหนดไว้ด้วย setCustomParameters() พารามิเตอร์เหล่านี้ ได้แก่ client_id, response_type, redirect_uri, state, scope และ response_mode

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

    // Optional "tenant" parameter in case you are using an Azure AD tenant.
    // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com'
    // or "common" for tenant-independent tokens.
    // The default value is "common".
    provider_data.custom_parameters["tenant"] ="TENANT_ID";
    
  3. ไม่บังคับ: ระบุขอบเขต OAuth 2.0 เพิ่มเติมนอกเหนือจากโปรไฟล์พื้นฐานที่ ต้องการขอจากผู้ให้บริการตรวจสอบสิทธิ์

    provider_data.scopes.push_back("mail.read");
    provider_data.scopes.push_back("calendars.read");
    

    ดูข้อมูลเพิ่มเติมได้ใน เอกสารประกอบเกี่ยวกับสิทธิ์และความยินยอมของ Microsoft

  4. เมื่อกำหนดค่าข้อมูลผู้ให้บริการแล้ว ให้ใช้ข้อมูลดังกล่าวเพื่อสร้าง FederatedOAuthProvider

    // Construct a FederatedOAuthProvider for use in Auth methods.
    firebase::auth::FederatedOAuthProvider provider(provider_data);
    
  5. ตรวจสอบสิทธิ์กับ Firebase โดยใช้ออบเจ็กต์ผู้ให้บริการตรวจสอบสิทธิ์ โปรดทราบว่าการดำเนินการนี้จะควบคุม UI ของคุณโดยแสดงมุมมองเว็บที่ผู้ใช้สามารถป้อนข้อมูลเข้าสู่ระบบ ซึ่งแตกต่างจากการดำเนินการอื่นๆ ของ FirebaseAuth

    หากต้องการเริ่มขั้นตอนการลงชื่อเข้าใช้ ให้เรียกใช้ SignInWithProvider ดังนี้

    firebase::Future<firebase::auth::AuthResult> result =
      auth->SignInWithProvider(provider_data);
    

    จากนั้นแอปพลิเคชันอาจรอหรือ ลงทะเบียนการเรียกกลับใน Future

    คุณสามารถเรียกใช้ Microsoft Graph API ได้โดยใช้โทเค็นเพื่อการเข้าถึง OAuth

    Microsoft ไม่ได้ให้ URL รูปภาพ แต่ต้องขอข้อมูลไบนารีสำหรับรูปโปรไฟล์ผ่าน Microsoft Graph APIซึ่งแตกต่างจากผู้ให้บริการรายอื่นๆ ที่ Firebase Auth รองรับ

  6. แม้ว่าตัวอย่างข้างต้นจะเน้นที่ขั้นตอนการลงชื่อเข้าใช้ แต่คุณยังสามารถลิงก์ผู้ให้บริการ Microsoft Azure Active Directory กับผู้ใช้ที่มีอยู่ได้โดยใช้ LinkWithProvider เช่น คุณสามารถลิงก์ผู้ให้บริการหลายรายกับผู้ใช้รายเดียวกันเพื่อให้ผู้ใช้ลงชื่อเข้าใช้ด้วยผู้ให้บริการรายใดก็ได้

    firebase::Future<firebase::auth::AuthResult> result = user.LinkWithProvider(provider_data);
    
  7. คุณสามารถใช้รูปแบบเดียวกันกับ ReauthenticateWithProvider ซึ่งใช้เพื่อดึงข้อมูลเข้าสู่ระบบใหม่สำหรับการดำเนินการที่ละเอียดอ่อนซึ่งต้องมีการเข้าสู่ระบบล่าสุด

    firebase::Future<firebase::auth::AuthResult> result =
      user.ReauthenticateWithProvider(provider_data);
    

    จากนั้นแอปพลิเคชันอาจรอหรือลงทะเบียนการเรียกกลับใน Future

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

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