אימות באמצעות Microsoft ו-C++

ניתן לאפשר למשתמשים לבצע אימות מול Firebase באמצעות ספקי OAuth כמו Microsoft Azure Active Directory על ידי שילוב OAuth התחברות כללית מבוססת-אינטרנט להיכנס לאפליקציה באמצעות Firebase SDK כדי לבצע את תהליך הכניסה מקצה לקצה. מכיוון שהתהליך הזה מחייב שימוש בערכות SDK של Firebase שמבוססות על טלפון, נתמך בפלטפורמות Android ו-Apple.

לפני שמתחילים

  1. מוסיפים את Firebase לפרויקט C++‎.
  2. במסוף Firebase, פותחים את הקטע אימות.
  3. בכרטיסייה Sign in method, מפעילים את הספק Microsoft.
  4. מוסיפים את Client ID ואת Client Secret ממסוף המפתחים של הספק הזה אל תצורת ספק:
    1. כדי לרשום לקוח Microsoft OAuth, פועלים לפי ההוראות הבאות: מדריך למתחילים: רישום אפליקציה באמצעות נקודת הקצה של Azure Active Directory גרסה 2.0. חשוב לשים לב שנקודת הקצה הזו תומכת בכניסה באמצעות חשבונות Microsoft לשימוש אישי וגם באמצעות Azure חשבונות Active Directory. מידע נוסף על Azure Active Directory v2.0
    2. כשרושמים אפליקציות אצל הספקים האלה, חשוב לרשום את הדומיין *.firebaseapp.com של הפרויקט כדומיין ההפניה האוטומטית של אפליקציה.
  5. לוחצים על שמירה.

גישה לכיתה 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);
    

איך מבצעים את תהליך הכניסה באמצעות 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, ראו מסמכי תיעוד של Microsoft OAuth. שימו לב שאי אפשר להעביר פרמטרים שנדרשים ל-Firebase עם setCustomParameters() הפרמטרים האלה הם client_id,‏ response_type,‏ redirect_uri,‏ state,‏ scope ו-response_mode.

    כדי לאפשר רק למשתמשים מדייר (tenant) מסוים של 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 באמצעות אובייקט של ספק האימות. שימו לב שבניגוד ל- פעולות אחרות של FirebaseAuth – הן יכולות לשלוט בממשק המשתמש שלכם על ידי הקפצה תצוגת אינטרנט שבה המשתמש יכול להזין את פרטי הכניסה שלו.

    כדי להתחיל את תהליך הכניסה, צריך לקרוא ל-SignInWithProvider:

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

    לאחר מכן הבקשה עשויה להמתין או רישום קריאה חוזרת (callback) לגבי העתיד.

    באמצעות אסימון הגישה של OAuth, אפשר לקרוא ל- Microsoft Graph API.

    בניגוד לספקים אחרים שנתמכים על ידי Firebase Auth, Microsoft לא מספקים כתובת URL של תמונה, ובמקום זאת, הנתונים הבינאריים של תמונת פרופיל לשליחת בקשה דרך Microsoft Graph API.

  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);
    

    לאחר מכן, האפליקציה יכולה להמתין או לרשום קריאה חוזרת בעתיד.

השלבים הבאים

אחרי שמשתמש נכנס בפעם הראשונה, נוצר חשבון משתמש חדש שמקושרות לפרטי הכניסה - כלומר שם המשתמש והסיסמה, מספר הטלפון מספר, או פרטים של ספק אימות – המשתמש נכנס באמצעותו. החשבון החדש הזה מאוחסן כחלק מפרויקט 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();