إذا سبق لك الترقية إلى 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 الخاص بك:
إذا لم يسبق لك الترقية إلى Firebase Authentication with Identity Platform، عليك إجراء ذلك. لا تتوفّر مصادقة OpenID Connect إلا في المشاريع التي تمّت ترقيتها.
في صفحة موفّرو تسجيل الدخول ضمن وحدة تحكّم Firebase، انقر على إضافة موفّر جديد، ثم انقر على اتصال OpenID.
اختَر ما إذا كنت ستستخدم مسار رمز التفويض أو مسار المنحة الضمنية.
عليك دائمًا استخدام مسار الرمز إذا كان الموفّر يتيحه. يكون التدفّق الضمني أقل أمانًا وننصح بشدة بعدم استخدامه.
امنح اسمًا لهذا الموفّر. دوِّن رقم تعريف الموفّر الذي تم إنشاؤه، مثل
oidc.example-provider. ستحتاج إلى هذا الرقم التعريفي عند إضافة رمز تسجيل الدخول إلى تطبيقك.حدِّد معرّف العميل والرمز السري للعميل وسلسلة جهة الإصدار الخاصة بالموفّر. يجب أن تتطابق هذه القيم تمامًا مع القيم التي منحها لك الموفّر.
احفظ التغييرات.
التعامل مع مسار تسجيل الدخول باستخدام حزمة تطوير البرامج (SDK) من Firebase
أسهل طريقة لمصادقة المستخدمين باستخدام Firebase من خلال موفّر OIDC هي التعامل مع مسار تسجيل الدخول بالكامل باستخدام حزمة تطوير البرامج (SDK) من Firebase.
للتعامل مع مسار تسجيل الدخول باستخدام حزمة تطوير البرامج (SDK) من Firebase لمنصات Apple، اتّبِع الخطوات التالية:
أضِف مخططات عناوين URL المخصّصة إلى مشروعك على Xcode:
- افتح إعدادات مشروعك: انقر مرّتين على اسم المشروع في الـ طريقة العرض الشجرية على يمين الصفحة. اختَر تطبيقك من قسم الأهداف ، ثم انقر على علامة التبويب معلومات ، ووسِّع قسم أنواع عناوين URL.
- انقر على الزر + ، وأضِف معرّف التطبيق المرمّز كمخطط عنوان URL. يمكنك العثور على معرّف التطبيق المرمّز في صفحة
الإعدادات العامة ضمن وحدة تحكّم Firebase، في قسم تطبيقك على iOS. اترك الحقول الأخرى فارغة.
عند الانتهاء، يجب أن تبدو الإعدادات مشابهة لما يلي (ولكن مع القيم الخاصة بتطبيقك):
أنشئ مثيلاً من
OAuthProviderباستخدام رقم تعريف الموفّر الذي حصلت عليه في وحدة تحكّم Firebase.Swift
var provider = OAuthProvider(providerID: "oidc.example-provider")Objective-C
FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"oidc.example-provider"];اختياري: حدِّد مَعلمات 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.اختياري: حدِّد نطاقات OAuth 2.0 الإضافية التي تريد طلبها من موفّر المصادقة، بالإضافة إلى النطاق الأساسي للملف الشخصي.
Swift
provider.scopes = ["mail.read", "calendars.read"]Objective-C
[provider setScopes:@[@"mail.read", @"calendars.read"]];راجِع الموفّر لمعرفة النطاقات التي يتيحها.
اختياري: إذا كنت تريد تخصيص طريقة عرض تطبيقك لـ
SFSafariViewControllerأوUIWebViewعند عرض reCAPTCHA للمستخدم، أنشئ فئة مخصّصة تتوافق مع بروتوكولAuthUIDelegate.صادِق باستخدام 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 }]; } }];في حين أنّ الأمثلة أعلاه تركّز على مسارات تسجيل الدخول، يمكنك أيضًا ربط موفّر 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 }];يمكن استخدام النمط نفسه مع
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; }
قد تحتاج أيضًا إلى إضافة رمز للتعامل مع الأخطاء من أجل النطاق الكامل لأخطاء المصادقة. راجِع التعامل مع الأخطاء.