المصادقة باستخدام OpenID Connect على أنظمة Apple الأساسية

إذا سبق لك الترقية إلى Firebase Authentication with Identity Platform، يمكنك مصادقة المستخدمين باستخدام Firebase من خلال موفّر اتصال OpenID ‏ (OIDC) المتوافق الذي تختاره. يتيح لك ذلك استخدام موفّري الهوية غير المتوافقين أصلاً مع Firebase.

قبل البدء

لتسجيل دخول المستخدمين باستخدام موفّر OIDC، عليك أولاً جمع بعض المعلومات من الموفّر:

  • معرّف العميل: هو سلسلة فريدة للموفّر تحدّد تطبيقك. قد يمنحك الموفّر معرّف عميل مختلفًا لكل منصة تستعمها. وهو إحدى قيم طلب aud في رموز التعريف التي يصدرها الموفّر.

  • الرمز السري للعميل: هو سلسلة سرية يستخدمها الموفّر لتأكيد ملكية معرّف العميل. لكل معرّف عميل، ستحتاج إلى رمز سري مطابق للعميل. (هذه القيمة مطلوبة فقط إذا كنت تستخدم مسار رمز التفويض ، وهو مسار ننصح به بشدة).

  • جهة الإصدار: هي سلسلة تحدّد الموفّر. يجب أن تكون هذه القيمة عنوان URL ، وعند إلحاقها بـ /.well-known/openid-configuration، يصبح عنوان URL هو موقع مستند اكتشاف OIDC الخاص بالموفّر. على سبيل المثال، إذا كانت جهة الإصدار هي https://auth.example.com، يجب أن يكون مستند الاكتشاف متاحًا على https://auth.example.com/.well-known/openid-configuration.

بعد الحصول على المعلومات أعلاه، فعِّل اتصال OpenID كموفّر لتسجيل الدخول في مشروع Firebase الخاص بك:

  1. أضِف Firebase إلى مشروعك على iOS.

  2. إذا لم يسبق لك الترقية إلى Firebase Authentication with Identity Platform، عليك إجراء ذلك. لا تتوفّر مصادقة OpenID Connect إلا في المشاريع التي تمّت ترقيتها.

  3. في صفحة موفّرو تسجيل الدخول ضمن وحدة تحكّم Firebase، انقر على إضافة موفّر جديد، ثم انقر على اتصال OpenID.

  4. اختَر ما إذا كنت ستستخدم مسار رمز التفويض أو مسار المنحة الضمنية.

    عليك دائمًا استخدام مسار الرمز إذا كان الموفّر يتيحه. يكون التدفّق الضمني أقل أمانًا وننصح بشدة بعدم استخدامه.

  5. امنح اسمًا لهذا الموفّر. دوِّن رقم تعريف الموفّر الذي تم إنشاؤه، مثل oidc.example-provider. ستحتاج إلى هذا الرقم التعريفي عند إضافة رمز تسجيل الدخول إلى تطبيقك.

  6. حدِّد معرّف العميل والرمز السري للعميل وسلسلة جهة الإصدار الخاصة بالموفّر. يجب أن تتطابق هذه القيم تمامًا مع القيم التي منحها لك الموفّر.

  7. احفظ التغييرات.

التعامل مع مسار تسجيل الدخول باستخدام حزمة تطوير البرامج (SDK) من Firebase

أسهل طريقة لمصادقة المستخدمين باستخدام Firebase من خلال موفّر OIDC هي التعامل مع مسار تسجيل الدخول بالكامل باستخدام حزمة تطوير البرامج (SDK) من Firebase.

للتعامل مع مسار تسجيل الدخول باستخدام حزمة تطوير البرامج (SDK) من Firebase لمنصات Apple، اتّبِع الخطوات التالية:

  1. أضِف مخططات عناوين URL المخصّصة إلى مشروعك على Xcode:

    1. افتح إعدادات مشروعك: انقر مرّتين على اسم المشروع في الـ طريقة العرض الشجرية على يمين الصفحة. اختَر تطبيقك من قسم الأهداف ، ثم انقر على علامة التبويب معلومات ، ووسِّع قسم أنواع عناوين URL.
    2. انقر على الزر + ، وأضِف معرّف التطبيق المرمّز كمخطط عنوان URL. يمكنك العثور على معرّف التطبيق المرمّز في صفحة الإعدادات العامة ضمن وحدة تحكّم Firebase، في قسم تطبيقك على iOS. اترك الحقول الأخرى فارغة.

      عند الانتهاء، يجب أن تبدو الإعدادات مشابهة لما يلي (ولكن مع القيم الخاصة بتطبيقك):

      لقطة شاشة لواجهة إعداد مخطّط URL مخصّص في Xcode
  2. أنشئ مثيلاً من OAuthProvider باستخدام رقم تعريف الموفّر الذي حصلت عليه في وحدة تحكّم Firebase.

    Swift

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

    Objective-C

    FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"oidc.example-provider"];
    
  3. اختياري: حدِّد مَعلمات OAuth المخصّصة الإضافية التي تريد إرسالها مع طلب OAuth.

    Swift

    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 الإضافية التي تريد طلبها من موفّر المصادقة، بالإضافة إلى النطاق الأساسي للملف الشخصي.

    Swift

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

    Objective-C

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

    راجِع الموفّر لمعرفة النطاقات التي يتيحها.

  5. اختياري: إذا كنت تريد تخصيص طريقة عرض تطبيقك لـ SFSafariViewController أو UIWebView عند عرض reCAPTCHA للمستخدم، أنشئ فئة مخصّصة تتوافق مع بروتوكول AuthUIDelegate.

  6. صادِق باستخدام Firebase من خلال عنصر موفّر OAuth.

    Swift

    // 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. على سبيل المثال، يمكنك ربط عدّة موفّرين بالمستخدم نفسه ما يسمح له بتسجيل الدخول باستخدام أيّ منهما.

    Swift

    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 الذي يمكن استخدامه لاسترداد بيانات اعتماد جديدة للعمليات الحسّاسة التي تتطلّب تسجيل دخول حديث.

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

التعامل مع مسار تسجيل الدخول يدويًا

إذا سبق لك تنفيذ مسار تسجيل الدخول باستخدام OpenID Connect في تطبيقك، يمكنك استخدام رمز التعريف مباشرةً للمصادقة باستخدام Firebase:

Swift

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

قد تحتاج أيضًا إلى إضافة رمز للتعامل مع الأخطاء من أجل النطاق الكامل لأخطاء المصادقة. راجِع التعامل مع الأخطاء.