אימות באמצעות Microsoft בפלטפורמות של Apple

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

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

כדי לאפשר למשתמשים להיכנס באמצעות חשבונות מיקרוסופט (Azure Active Directory וחשבונות מיקרוסופט אישיים), קודם צריך להפעיל את מיקרוסופט כספק כניסה לפרויקט Firebase:

  1. איך מוסיפים את Firebase לפרויקט Apple
  2. במסוף Firebase, עוברים אל Security (אבטחה) > Authentication (אימות).
  3. בכרטיסייה שיטת התחברות, מפעילים את ספק הכניסה של מיקרוסופט.
  4. מוסיפים את מזהה הלקוח ואת סוד הלקוח ממסוף המפתחים של הספק להגדרות הספק:
    1. כדי לרשום לקוח Microsoft OAuth, פועלים לפי ההוראות במאמר Quickstart: Register an app with the Azure Active Directory v2.0 endpoint. שימו לב שנקודת הקצה הזו תומכת בכניסה באמצעות חשבונות מיקרוסופט אישיים וגם באמצעות חשבונות Azure Active Directory. מידע נוסף על Azure Active Directory v2.0
    2. כשרושמים אפליקציות אצל הספקים האלה, חשוב לרשום את הדומיין *.firebaseapp.com של הפרויקט כדומיין ההפניה של האפליקציה.
  5. לוחצים על שמירה.

טיפול בתהליך הכניסה באמצעות Firebase SDK

כדי לטפל בתהליך הכניסה באמצעות Firebase Apple platforms SDK, פועלים לפי השלבים הבאים:

  1. מוסיפים תוכניות מותאמות אישית של כתובות URL לפרויקט Xcode:

    1. פותחים את הגדרות הפרויקט: לוחצים לחיצה כפולה על שם הפרויקט בתצוגת העץ הימנית. בוחרים את האפליקציה בקטע יעדים, ואז בוחרים בכרטיסייה מידע ומרחיבים את הקטע סוגי כתובות URL.
    2. לוחצים על הלחצן + ומוסיפים את מזהה האפליקציה המקודד כסכימת כתובות URL. משאירים את שאר השדות ריקים.

      אפשר למצוא את מזהה האפליקציה המקודד במסוף Firebase: עוברים אל הגדרות > הכרטיסייה כללי, ואז גוללים למטה לקטע האפליקציות שלך כדי לראות פרטים על אפליקציית iOS.

      בסיום התהליך, ההגדרה אמורה להיראות בערך כך (אבל עם הערכים הספציפיים לאפליקציה שלכם):

      צילום מסך של ממשק ההגדרה של סכמת כתובת URL מותאמת אישית ב-Xcode
  2. יוצרים מופע של OAuthProvider באמצעות מזהה הספק microsoft.com.

    Swift

        var provider = OAuthProvider(providerID: "microsoft.com")
        

    Objective-C

        FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"microsoft.com"];
        
  3. אופציונלי: מציינים פרמטרים נוספים של OAuth בהתאמה אישית שרוצים לשלוח עם בקשת ה-OAuth.

    Swift

        provider.customParameters = [
          "prompt": "consent",
          "login_hint": "user@firstadd.onmicrosoft.com"
        ]
        

    Objective-C

        [provider setCustomParameters:@{@"prompt": @"consent", @"login_hint": @"user@firstadd.onmicrosoft.com"}];
        

    לפרמטרים שמיקרוסופט תומכת בהם, אפשר לעיין במסמכי התיעוד של מיקרוסופט בנושא OAuth. שימו לב: אי אפשר להעביר פרמטרים שנדרשים ב-Firebase באמצעות התג setCustomParameters. הפרמטרים האלה הם client_id,‏ response_type, ‏ redirect_uri, ‏ state, ‏ scope ו-response_mode.

    כדי לאפשר רק למשתמשים מדייר (tenant) מסוים ב-Azure AD להיכנס לאפליקציה, אפשר להשתמש בשם הדומיין הידידותי של הדייר (tenant) ב-Azure AD או במזהה ה-GUID של הדייר (tenant). כדי לעשות את זה, מציינים את השדה tenant (דייר) באובייקט הפרמטרים המותאמים אישית.

    Swift

        provider.customParameters = [
          // 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".
          "tenant": "TENANT_ID"
        ]
        

    Objective-C

        // 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.customParameters = @{@"tenant": @"TENANT_ID"};
        
  4. אופציונלי: מציינים היקפי הרשאות נוספים של OAuth 2.0 מעבר לפרופיל הבסיסי שרוצים לבקש מספק האימות.

    Swift

        provider.scopes = ["mail.read", "calendars.read"]
        

    Objective-C

        [provider setScopes:@[@"mail.read", @"calendars.read"]];
        

    מידע נוסף מופיע במאמרי העזרה של מיקרוסופט בנושא הרשאות והסכמה.

  5. אופציונלי: אם רוצים להתאים אישית את האופן שבו האפליקציה מציגה את SFSafariViewController או UIWebView כשמציגים למשתמש את reCAPTCHA, צריך ליצור מחלקה מותאמת אישית שתואמת לפרוטוקול AuthUIDelegate ולהעביר אותה אל credentialWithUIDelegate.

  6. מתבצע אימות ב-Firebase באמצעות אובייקט ספק OAuth.

    Swift

        // Replace nil with the custom class that conforms to AuthUIDelegate
        // you created in last step to use a customized web view.
        provider.getCredentialWith(nil) { credential, error in
          if error != nil {
            // Handle error.
          }
          if credential != nil {
            Auth().signIn(with: credential) { authResult, error in
              if error != nil {
                // Handle error.
              }
              // User is signed in.
              // IdP data available in authResult.additionalUserInfo.profile.
              // OAuth access token can also be retrieved:
              // (authResult.credential as? OAuthCredential)?.accessToken
              // OAuth ID token can also be retrieved:
              // (authResult.credential as? OAuthCredential)?.idToken
            }
          }
        }
        

    Objective-C

        [provider getCredentialWithUIDelegate:nil
                                   completion:^(FIRAuthCredential *_Nullable credential, NSError *_Nullable error) {
          if (error) {
           // Handle error.
          }
          if (credential) {
            [[FIRAuth auth] signInWithCredential:credential
                                      completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) {
              if (error) {
                // Handle error.
              }
              // User is signed in.
              // IdP data available in authResult.additionalUserInfo.profile.
              // OAuth access token can also be retrieved:
              // ((FIROAuthCredential *)authResult.credential).accessToken
              // OAuth ID token can also be retrieved:
              // ((FIROAuthCredential *)authResult.credential).idToken
            }];
          }
        }];
        

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

    לדוגמה, כדי לקבל את פרטי הפרופיל הבסיסיים, אפשר לקרוא ל-API בארכיטקטורת REST ולהעביר את טוקן הגישה בכותרת Authorization:

    https://graph.microsoft.com/v1.0/me

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

    בנוסף לטוקן הגישה מסוג OAuth, אפשר לאחזר את טוקן של מזהה מסוג OAuth של המשתמש מאובייקט OAuthCredential. הטענה sub בטוקן של מזהה היא ספציפית לאפליקציה ולא תהיה זהה למזהה המשתמש המאוחד שמשמש את Firebase Auth ונגיש דרך user.providerData[0].uid. במקומו צריך להשתמש בשדה התביעה oid. כשמשתמשים בדייר Azure AD כדי להיכנס, התביעה oid תהיה זהה לחלוטין. לעומת זאת, במקרה של משתמשים שלא שייכים לדומיין, השדה oid מרופד. למזהה מאוחד 4b2eabcdefghijkl, הערך oid יהיה בפורמט 00000000-0000-0000-4b2e-abcdefghijkl.

  7. הדוגמאות שלמעלה מתמקדות בתהליכי כניסה, אבל אפשר גם לקשר ספק של מיקרוסופט למשתמש קיים באמצעות linkWithCredential. לדוגמה, אתם יכולים לקשר כמה ספקים לאותו משתמש ולאפשר לו להיכנס לחשבון באמצעות כל אחד מהם.

    Swift

        Auth().currentUser.link(withCredential: credential) { authResult, error in
          if error != nil {
            // Handle error.
          }
          // Microsoft credential is linked to the current user.
          // IdP data available in authResult.additionalUserInfo.profile.
          // OAuth access token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.accessToken
          // OAuth ID token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.idToken
        }
        

    Objective-C

        [[FIRAuth auth].currentUser
            linkWithCredential:credential
                    completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
          if (error) {
            // Handle error.
          }
          // Microsoft credential is linked to the current user.
          // IdP data available in authResult.additionalUserInfo.profile.
          // OAuth access token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).accessToken
          // OAuth ID token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).idToken
        }];
        
  8. אפשר להשתמש באותה תבנית עם reauthenticateWithCredential, שבעזרתה אפשר לאחזר פרטי כניסה עדכניים לפעולות רגישות שדורשות כניסה עדכנית.

    Swift

        Auth().currentUser.reauthenticateWithCredential(withCredential: credential) { authResult, error in
          if error != nil {
            // Handle error.
          }
          // User is re-authenticated with fresh tokens minted and
          // should be able to perform sensitive operations like account
          // deletion and email or password update.
          // IdP data available in result.additionalUserInfo.profile.
          // Additional OAuth access token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.accessToken
          // OAuth ID token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.idToken
        }
        

    Objective-C

        [[FIRAuth auth].currentUser
            reauthenticateWithCredential:credential
                              completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
          if (error) {
            // Handle error.
          }
          // User is re-authenticated with fresh tokens minted and
          // should be able to perform sensitive operations like account
          // deletion and email or password update.
          // IdP data available in result.additionalUserInfo.profile.
          // Additional OAuth access token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).accessToken
          // OAuth ID token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).idToken
        }];
        

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

  • באפליקציות, אפשר לקבל את פרטי הפרופיל הבסיסיים של המשתמש מאובייקט User . מידע נוסף זמין במאמר בנושא ניהול משתמשים.

  • בFirebase Realtime Database ובCloud Storage כללי האבטחה, אפשר לקבל את מזהה המשתמש הייחודי של המשתמש המחובר מהמשתנה auth, ולהשתמש בו כדי לקבוע לאילו נתונים המשתמש יכול לגשת.

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

כדי להוציא משתמש מהחשבון, מפעילים את signOut:.

Swift

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

Objective-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

כדאי גם להוסיף קוד לטיפול בשגיאות לכל טווח השגיאות של האימות. מידע נוסף זמין במאמר בנושא טיפול בשגיאות.