Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

אמת באמצעות GitHub ב- iOS

באפשרותך לאפשר למשתמשים שלך לבצע אימות עם Firebase באמצעות ספקי OAuth כגון GitHub על ידי שילוב כניסה OAuth כללית באפליקציה שלך באמצעות Firebase SDK כדי לבצע את זרימת הכניסה בסוף.

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

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

  1. הוסף את Firebase לפרויקט ה- iOS שלך .
    pod 'Firebase/Auth'
    
  2. במסוף Firebase , פתח את החלק Auth .
  3. בכרטיסיה שיטת כניסה , הפעל את ספק GitHub .
  4. הוסף את מזהה הלקוח וסוד הלקוח ממסוף המפתחים של ספק זה לתצורת הספק:
    1. רשום את האפליקציה שלך כיישום מפתח ב- GitHub וקבל את מזהה הלקוח של OAuth 2.0 ואת סוד הלקוח של האפליקציה שלך.
    2. ודא שה- URI my-app-12345.firebaseapp.com/__/auth/handler OAuth של Firebase שלך ​​(למשל my-app-12345.firebaseapp.com/__/auth/handler ) מוגדר ככתובת האתר שלך להתקשרות חוזרת בדף ההגדרות של האפליקציה שלך בתצורה של אפליקציית GitHub שלך.
  5. לחץ על שמור .

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

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

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

    1. פתח את תצורת הפרויקט שלך: לחץ פעמיים על שם הפרויקט בתצוגת העץ השמאלית. בחר באפליקציה שלך מקטע TARGETS , ואז בחר בכרטיסייה מידע והרחיב את הקטע סוגי כתובות אתרים .
    2. לחץ על כפתור + והוסף ערכת כתובות אתרים עבור מזהה הלקוח ההפוך שלך. כדי למצוא ערך זה, פתח את קובץ התצורה של GoogleService-Info.plist וחפש את מפתח REVERSED_CLIENT_ID . העתק את הערך של אותו מפתח והדבק אותו בתיבה 'ערכי כתובות אתרים' בדף התצורה. השאר את שדות האחרים ריקים.

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

  2. צור מופע של OAuthProvider באמצעות מזהה הספק github.com .

    מָהִיר

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

    מטרה-ג

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

    מָהִיר

        provider.customParameters = [
          "allow_signup": "false"
        ]
        

    מטרה-ג

        [provider setCustomParameters:@{@"allow_signup": @"false"}];
        

    לפרמטרים ש- GitHub תומך, עיין בתיעוד של GitHub OAuth . שים לב שאתה לא יכול להעביר פרמטרים נדרשים של Firebase באמצעות setCustomParameters . פרמטרים אלה הם client_id , redirect_uri , response_type , scope and state .

  4. אופציונלי : ציין טווחי OAuth 2.0 נוספים מעבר לפרופיל הבסיסי שברצונך לבקש מספק האימות. אם היישום שלך דורש גישה לנתוני משתמשים פרטיים מממשקי API של GitHub, יהיה עליך לבקש הרשאות לגישה לממשקי API של GitHub תחת הרשאות API במסוף המפתחים של GitHub. טווחי OAuth המבוקשים חייבים להיות תואמים מדויקים לאלה שהוגדרו מראש בהרשאות ה- API של האפליקציה.

    מָהִיר

        // Request read access to a user's email addresses.
        // This must be preconfigured in the app's API permissions.
        provider.scopes = ["user:email"]
        

    מטרה-ג

        // Request read access to a user's email addresses.
        // This must be preconfigured in the app's API permissions.
        [provider setScopes:@[@"user:email"]];
        

    למידע נוסף, עיין בתיעוד ה- Scitters של GitHub .

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

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

    מָהִיר

        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.
    
              guard let oauthCredential = authResult.credential as? OAuthCredential else { return }
              // GitHub OAuth access token can also be retrieved by:
              // oauthCredential.accessToken
              // GitHub OAuth ID token can be retrieved by calling:
              // oauthCredential.idToken
            }
          }
        }
        

    מטרה-ג

        [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.
    
              FIROAuthCredential *oauthCredential = (FIROAuthCredential *)authResult.credential;
              // GitHub OAuth access token can also be retrieved by:
              // oauthCredential.accessToken
              // GitHub OAuth ID token can be retrieved by calling:
              // oauthCredential.idToken
            }];
          }
        }];
        

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

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

    https://api.github.com/user
    
  7. בעוד שהדוגמאות שלעיל מתמקדות בזרימות כניסה, יש לך גם את היכולת לקשר ספק GitHub למשתמש קיים. לדוגמה, אתה יכול לקשר מספר ספקים לאותו משתמש המאפשר להם להיכנס עם אחד מהם.

    מָהִיר

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

    מטרה-ג

        [[FIRAuth auth].currentUser
            linkWithCredential:credential
                    completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
          if (error) {
            // Handle error.
          }
          // GitHub credential is linked to the current user.
          // IdP data available in authResult.additionalUserInfo.profile.
          // GitHub OAuth access token is can also be retrieved by:
          // authResult.credential.accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // 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 is can also be retrieved by:
          // authResult.credential.accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // authResult.credential.idToken
        }
        

    מטרה-ג

        [[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 is can also be retrieved by:
          // authResult.credential.accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // authResult.credential.idToken
        }];
        

הצעדים הבאים

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

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

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

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

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

מָהִיר

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

מטרה-ג

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

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