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

אם שדרגת ל-Firebase Authentication with Identity Platform, תוכל לאמת את המשתמשים שלך באמצעות Firebase באמצעות הספק תואם OpenID Connect (OIDC) לפי בחירתך. זה מאפשר להשתמש בספקי זהות שאינם נתמכים באופן מקורי על ידי Firebase.

לפני שאתה מתחיל

כדי להיכנס למשתמשים באמצעות ספק OIDC, תחילה עליך לאסוף מידע מהספק:

  • מזהה לקוח : מחרוזת ייחודית לספק המזהה את האפליקציה שלך. הספק שלך עשוי להקצות לך מזהה לקוח אחר עבור כל פלטפורמה שבה אתה תומך. זהו אחד הערכים של תביעת aud באסימוני זיהוי שהונפקו על ידי הספק שלך.

  • סוד לקוח : מחרוזת סודית שבה משתמש הספק כדי לאשר בעלות על מזהה לקוח. עבור כל מזהה לקוח, תזדקק לסוד לקוח תואם. (ערך זה נדרש רק אם אתה משתמש בזרימת קוד ההסמכה , שמומלץ בחום).

  • מנפיק : מחרוזת המזהה את הספק שלך. ערך זה חייב להיות כתובת URL שכאשר היא מצורפת ל- /.well-known/openid-configuration , היא המיקום של מסמך גילוי ה-OIDC של הספק. לדוגמה, אם המנפיק הוא https://auth.example.com , מסמך הגילוי חייב להיות זמין בכתובת https://auth.example.com/.well-known/openid-configuration .

לאחר שיש לך את המידע שלמעלה, הפעל את OpenID Connect כספק כניסה לפרויקט Firebase שלך:

  1. הוסף את Firebase לפרויקט iOS שלך .

  2. אם לא שדרגת ל-Firebase Authentication with Identity Platform, עשה זאת. אימות OpenID Connect זמין רק בפרויקטים משודרגים.

  3. בדף ספקי כניסה של מסוף Firebase, לחץ על הוסף ספק חדש ולאחר מכן לחץ על OpenID Connect .

  4. בחר אם תשתמש בזרימת קוד ההרשאה או בזרימת ההענקה המרומזת .

    עליך להשתמש תמיד בזרימת הקוד אם הספק שלך תומך בה . הזרימה המרומזת פחות בטוחה והשימוש בה מומלץ מאוד.

  5. תן שם לספק זה. שימו לב למזהה הספק שנוצר: משהו כמו oidc.example-provider . תזדקק למזהה זה כשתוסיף קוד כניסה לאפליקציה שלך.

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

  7. שמור את השינויים שלך.

טפל בזרימת הכניסה עם Firebase SDK

הדרך הקלה ביותר לאמת את המשתמשים שלך עם Firebase באמצעות ספק ה-OIDC שלך היא לטפל בכל זרימת הכניסה עם Firebase SDK.

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

  1. הוסף סכימות כתובת URL מותאמות אישית לפרויקט Xcode שלך:

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

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

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

    מָהִיר

    var provider = OAuthProvider(providerID: "oidc.example-provider")
    

    Objective-C

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

    מָהִיר

    provider.customParameters = [
      "login_hint": "user@example.com"
    ]
    

    Objective-C

    [provider setCustomParameters:@{@"login_hint": @"user@example.com"}];
    

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

  4. אופציונלי : ציין היקפי OAuth 2.0 נוספים מעבר לפרופיל הבסיסי שברצונך לבקש מספק האימות.

    מָהִיר

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

    Objective-C

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

    בדוק עם הספק שלך לגבי ההיקפים שבהם הוא תומך.

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

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

    מָהִיר

    // If you created a custom class that conforms to AuthUIDelegate,
    // pass it instead of nil:
    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

    // If you created a custom class that conforms to AuthUIDelegate,
    // pass it instead of nil:
    [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
        }];
      }
    }];
    
  7. בעוד שהדוגמאות לעיל מתמקדות בזרימות כניסה, יש לך גם את היכולת לקשר ספק OIDC למשתמש קיים באמצעות linkWithCredential . לדוגמה, אתה יכול לקשר מספר ספקים לאותו משתמש ולאפשר להם להיכנס עם אחד מהם.

    מָהִיר

    Auth().currentUser.link(withCredential: credential) { authResult, error in
      if error != nil {
        // Handle error.
      }
      // OIDC 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.
      }
      // OIDC 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 אשר ניתן להשתמש בו כדי לאחזר אישורים טריים עבור פעולות רגישות הדורשות כניסה אחרונה.

    מָהִיר

    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
    }];
    

טפל בזרימת הכניסה באופן ידני

אם כבר יישמת את זרימת הכניסה של OpenID Connect באפליקציה שלך, תוכל להשתמש באסימון המזהה ישירות כדי לאמת עם Firebase:

מָהִיר

let credential = OAuthProvider.credential(
    withProviderID: "oidc.example-provider",  // As registered in Firebase console.
    idToken: idToken,  // ID token from OpenID Connect flow.
    rawNonce: nil
)
Auth.auth().signIn(with: credential) { authResult, error in
    if error {
        // Handle error.
        return
    }
    // User is signed in.
    // IdP data available in authResult?.additionalUserInfo?.profile
}

Objective-C

FIROAuthCredential *credential =
    [FIROAuthProvider credentialWithProviderID:@"oidc.example-provider"  // As registered in Firebase console.
                                       IDToken:idToken  // ID token from OpenID Connect flow.
                                      rawNonce:nil];
[[FIRAuth auth] signInWithCredential:credential
                          completion:^(FIRAuthDataResult * _Nullable authResult,
                                      NSError * _Nullable error) {
    if (error != nil) {
        // Handle error.
        return;
    }
    // User is signed in.
    // IdP data available in authResult.additionalUserInfo.profile
}];

הצעדים הבאים

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

  • באפליקציות שלך, תוכל לקבל את פרטי הפרופיל הבסיסיים של המשתמש מאובייקט User . ראה ניהול משתמשים .

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

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

כדי לצאת ממשתמש, התקשר ל- signOut: .

מָהִיר

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

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