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

إذا قمت بالترقية إلى Firebase Authentication باستخدام 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 باستخدام Identity Platform ، فافعل ذلك. تتوفر مصادقة OpenID Connect فقط في المشاريع التي تمت ترقيتها.

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

  4. حدد ما إذا كنت ستستخدم تدفق كود التفويض أو تدفق المنح الضمني .

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

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

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

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

تعامل مع تدفق تسجيل الدخول باستخدام Firebase SDK

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

للتعامل مع تدفق تسجيل الدخول باستخدام Firebase Apple Platform SDK ، اتبع الخطوات التالية:

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

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

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

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

    سويفت

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

    ج موضوعية

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

    سويفت

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

    ج موضوعية

    [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"]
    

    ج موضوعية

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

    ج موضوعية

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

    ج موضوعية

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

    ج موضوعية

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

ج موضوعية

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 وقواعد أمان التخزين السحابي ، يمكنك الحصول على معرف المستخدم الفريد للمستخدم الذي قام بتسجيل الدخول من متغير 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;
}

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