المصادقة باستخدام 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 باستخدام 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. افتح تكوين مشروعك: انقر نقرًا مزدوجًا فوق اسم المشروع في عرض الشجرة الأيسر. حدد تطبيقك من قسم TARGETS ، ثم حدد علامة تبويب المعلومات ، وقم بتوسيع قسم أنواع 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;
}

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