คุณสามารถอนุญาตให้ผู้ใช้ตรวจสอบสิทธิ์กับ Firebase โดยใช้ผู้ให้บริการ OAuth เช่น Microsoft Azure Active Directory ได้ด้วยการผสานรวมการเข้าสู่ระบบ OAuth ทั่วไปที่อิงตามเว็บเข้ากับแอปโดยใช้ Firebase SDK เพื่อดำเนินการขั้นตอนการลงชื่อเข้าใช้ตั้งแต่ต้นจนจบ เนื่องจากขั้นตอนดังกล่าวต้องใช้ Firebase SDK ที่อิงตามโทรศัพท์ จึงรองรับเฉพาะแพลตฟอร์ม Android และ Apple เท่านั้น
ก่อนเริ่มต้น
- เพิ่ม Firebase ลงในโปรเจ็กต์ C++
- ในคอนโซล Firebase ให้ไปที่ ความปลอดภัย > การตรวจสอบสิทธิ์
- ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้ผู้ให้บริการการลงชื่อเข้าใช้ Microsoft
-
เพิ่มรหัสไคลเอ็นต์ และข้อมูลลับของไคลเอ็นต์ จากคอนโซลนักพัฒนาแอปของผู้ให้บริการดังกล่าว
ลงในการกำหนดค่าผู้ให้บริการ:
- หากต้องการลงทะเบียนไคลเอ็นต์ OAuth ของ Microsoft ให้ทำตามวิธีการใน คู่มือเริ่มต้นฉบับย่อ: ลงทะเบียนแอปกับปลายทาง Azure Active Directory v2.0 โปรดทราบว่าปลายทางนี้รองรับการลงชื่อเข้าใช้โดยใช้บัญชี Microsoft ส่วนบุคคล รวมถึงบัญชี Azure Active Directory ดูข้อมูลเพิ่มเติมเกี่ยวกับ Azure Active Directory v2.0.
-
เมื่อลงทะเบียนแอปกับผู้ให้บริการเหล่านี้ โปรดลงทะเบียนโดเมน
*.firebaseapp.comสำหรับโปรเจ็กต์เป็นโดเมนเปลี่ยนเส้นทาง สำหรับแอป
- คลิกบันทึก
เข้าถึงชั้นเรียน 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::AppAppและAuthมีการแมปแบบหนึ่งต่อหนึ่งfirebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
จัดการขั้นตอนการลงชื่อเข้าใช้ด้วย Firebase SDK
หากต้องการจัดการขั้นตอนการลงชื่อเข้าใช้ด้วย Firebase SDK ให้ทำตามขั้นตอนต่อไปนี้
สร้างอินสแตนซ์ของ
FederatedOAuthProviderDataที่กำหนดค่าด้วยรหัสผู้ให้บริการที่เหมาะสมสำหรับ Microsoftfirebase::auth::FederatedOAuthProviderData provider_data(firebase::auth::MicrosoftAuthProvider::kProviderId);ไม่บังคับ: ระบุพารามิเตอร์ 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";ไม่บังคับ: ระบุขอบเขต OAuth 2.0 เพิ่มเติมนอกเหนือจากโปรไฟล์พื้นฐานที่ ต้องการขอจากผู้ให้บริการตรวจสอบสิทธิ์
provider_data.scopes.push_back("mail.read"); provider_data.scopes.push_back("calendars.read");ดูข้อมูลเพิ่มเติมได้ใน เอกสารประกอบเกี่ยวกับสิทธิ์และความยินยอมของ Microsoft
เมื่อกำหนดค่าข้อมูลผู้ให้บริการแล้ว ให้ใช้ข้อมูลดังกล่าวเพื่อสร้าง
FederatedOAuthProvider// Construct a FederatedOAuthProvider for use in Auth methods. firebase::auth::FederatedOAuthProvider provider(provider_data);ตรวจสอบสิทธิ์กับ 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 รองรับ
แม้ว่าตัวอย่างข้างต้นจะเน้นที่ขั้นตอนการลงชื่อเข้าใช้ แต่คุณยังสามารถลิงก์ผู้ให้บริการ Microsoft Azure Active Directory กับผู้ใช้ที่มีอยู่ได้โดยใช้
LinkWithProviderเช่น คุณสามารถลิงก์ผู้ให้บริการหลายรายกับผู้ใช้รายเดียวกันเพื่อให้ผู้ใช้ลงชื่อเข้าใช้ด้วยผู้ให้บริการรายใดก็ได้firebase::Future<firebase::auth::AuthResult> result = user.LinkWithProvider(provider_data);คุณสามารถใช้รูปแบบเดียวกันกับ
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();