يمكنك السماح للمستخدمين بالمصادقة باستخدام Firebase من خلال موفّري OAuth، مثل Microsoft Azure Active Directory، عن طريق دمج تسجيل الدخول العام المستند إلى الويب باستخدام OAuth في تطبيقك باستخدام حزمة Firebase SDK لتنفيذ عملية تسجيل الدخول من البداية إلى النهاية.
قبل البدء
لتسجيل دخول المستخدمين باستخدام حسابات Microsoft (Azure Active Directory وحسابات Microsoft الشخصية)، عليك أولاً تفعيل Microsoft كموفّر لتسجيل الدخول في مشروع Firebase:
- أضِف Firebase إلى مشروعك على Apple.
- في وحدة تحكّم Firebase، انتقِل إلى الأمان > المصادقة.
- في علامة التبويب طريقة تسجيل الدخول ، فعِّل موفّر تسجيل الدخول Microsoft.
-
أضِف معرّف العميل وسر العميل من وحدة تحكّم المطوّرين التابعة لموفّر الخدمة إلى إعدادات الموفّر:
- لتسجيل عميل OAuth من Microsoft، اتّبِع التعليمات الواردة في مقالة التشغيل السريع: تسجيل تطبيق باستخدام نقطة نهاية Azure Active Directory v2.0. يُرجى العِلم أنّ نقطة النهاية هذه تتيح تسجيل الدخول باستخدام حسابات Microsoft الشخصية بالإضافة إلى حسابات Azure Active Directory. مزيد من المعلومات عن Azure Active Directory v2.0.
-
عند تسجيل التطبيقات لدى موفّري الخدمة هؤلاء، احرص على تسجيل النطاق
*.firebaseapp.comلمشروعك كنطاق إعادة التوجيه لتطبيقك.
- انقر على حفظ.
التعامل مع عملية تسجيل الدخول باستخدام حزمة Firebase SDK
للتعامل مع عملية تسجيل الدخول باستخدام حزمة Firebase SDK لمنصّات Apple، اتّبِع الخطوات التالية:
أضِف مخططات عناوين URL المخصّصة إلى مشروعك على Xcode:
- افتح إعدادات مشروعك: انقر مرّتين على اسم المشروع في الـ طريقة العرض الشجرية على يمين الشاشة. اختَر تطبيقك من قسم الأهداف ، ثم انقر على علامة التبويب معلومات ، ووسِّع قسم أنواع عناوين URL.
-
انقر على الزر + ، وأضِف معرّف التطبيق المرمّز كمخطّط URL.
اترك الحقول الأخرى فارغة.
يمكنك العثور على معرّف التطبيق المرمّز في وحدة تحكّم Firebase: انتقِل إلى
الإعدادات > علامة التبويب عام، ثم انتقِل للأسفل إلى قسم تطبيقاتك لعرض تفاصيل تطبيقك على iOS.عند اكتمال العملية، يجب أن تبدو الإعدادات مشابهة لما يلي (ولكن مع القيم الخاصة بتطبيقك):
أنشِئ مثيلاً من OAuthProvider باستخدام معرّف الموفّر microsoft.com.
Swift
var provider = OAuthProvider(providerID: "microsoft.com")
Objective-C
FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"microsoft.com"];
اختياري: حدِّد مَعلمات OAuth المخصّصة الإضافية التي تريد إرسالها مع طلب OAuth.
Swift
provider.customParameters = [ "prompt": "consent", "login_hint": "user@firstadd.onmicrosoft.com" ]
Objective-C
[provider setCustomParameters:@{@"prompt": @"consent", @"login_hint": @"user@firstadd.onmicrosoft.com"}];
للاطّلاع على المَعلمات التي تتيحها Microsoft، يُرجى الرجوع إلى مستندات Microsoft OAuth. يُرجى العِلم أنّه لا يمكنك تمرير المَعلمات المطلوبة من Firebase باستخدام
setCustomParameters. هذه المَعلمات هي client_id، response_type، redirect_uri، state، scope و response_mode.للسماح للمستخدمين من مستأجر Azure AD معيّن فقط بتسجيل الدخول إلى التطبيق، يمكن استخدام اسم النطاق المألوف لمستأجر Azure AD أو المعرِّف الفريد العالمي (GUID) للمستأجر. يمكن إجراء ذلك عن طريق تحديد الحقل "tenant" في عنصر المَعلمات المخصّصة.
Swift
provider.customParameters = [ // Optional "tenant" parameter in case you are using an Azure AD // tenant. eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or // 'contoso.onmicrosoft.com' or "common" for tenant-independent // tokens. The default value is "common". "tenant": "TENANT_ID" ]
Objective-C
// Optional "tenant" parameter in case you are using an Azure AD tenant. // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or // 'contoso.onmicrosoft.com' or "common" for tenant-independent tokens. // The default value is "common". provider.customParameters = @{@"tenant": @"TENANT_ID"};
اختياري: حدِّد نطاقات OAuth 2.0 الإضافية التي تريد طلبها من موفّر المصادقة، بالإضافة إلى الملف الشخصي الأساسي.
Swift
provider.scopes = ["mail.read", "calendars.read"]
Objective-C
[provider setScopes:@[@"mail.read", @"calendars.read"]];
لمزيد من المعلومات، يُرجى الرجوع إلى مستندات الأذونات والموافقة من Microsoft.
اختياري: إذا أردت تخصيص طريقة عرض تطبيقك لـ
SFSafariViewControllerأوUIWebViewعند عرض reCAPTCHA للمستخدم، أنشِئ فئة مخصّصة تتوافق مع بروتوكولAuthUIDelegate، ومرِّرها إلىcredentialWithUIDelegate.صادِق باستخدام Firebase من خلال عنصر موفّر OAuth.
Swift
// Replace nil with the custom class that conforms to AuthUIDelegate // you created in last step to use a customized web view. 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
[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 }]; } }];
باستخدام رمز الدخول إلى OAuth، يمكنك استدعاء Microsoft Graph API.
على سبيل المثال، للحصول على معلومات الملف الشخصي الأساسية، يمكنك استدعاء REST API، مع تمرير رمز الدخول في عنوان
Authorization:https://graph.microsoft.com/v1.0/me
على عكس موفّري الخدمة الآخرين الذين تتيحهم خدمة Firebase المصادقة، لا يقدّم Microsoft عنوان URL لصورة، وبدلاً من ذلك، يجب طلب البيانات الثنائية لصورة الملف الشخصي من خلالMicrosoft Graph API.
بالإضافة إلى رمز الدخول إلى OAuth، يمكن أيضًا استرداد رمز تعريف OAuth للمستخدم من عنصر
OAuthCredential. إنّ طلبsubفي رمز التعريف خاص بالتطبيق ولن يتطابق مع معرّف المستخدم الموحّد الذي تستخدمه خدمة Firebase Auth ويمكن الوصول إليه من خلالuser.providerData[0].uid. يجب استخدام حقل طلبoidبدلاً من ذلك. عند استخدام مستأجر Azure AD لتسجيل الدخول، سيكون طلبoidمطابقًا تمامًا. أمّا في حالة عدم استخدام المستأجر، يتم ملء حقلoid. بالنسبة إلى معرّف موحّد4b2eabcdefghijkl، سيتخذoidالنموذج00000000-0000-0000-4b2e-abcdefghijkl.في حين أنّ الأمثلة أعلاه تركّز على عمليات تسجيل الدخول، يمكنك أيضًا ربط موفّر Microsoft بمستخدم حالي باستخدام
linkWithCredential. على سبيل المثال، يمكنك ربط عدّة موفّرين بالمستخدم نفسه، ما يسمح له بتسجيل الدخول باستخدام أيّ منهما.Swift
Auth().currentUser.link(withCredential: credential) { authResult, error in if error != nil { // Handle error. } // Microsoft 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. } // Microsoft 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 }];
بعد أن يُسجِّل المستخدم الدخول للمرة الأولى، يتم إنشاء حساب مستخدم جديد وربطه ببيانات الاعتماد التي سجّل المستخدم الدخول بها، أي اسم المستخدم وكلمة المرور أو رقم الهاتف أو معلومات موفّر المصادقة. يتم تخزين هذا الحساب الجديد كجزء من مشروع 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; }
قد تحتاج أيضًا إلى إضافة رمز للتعامل مع الأخطاء من أجل النطاق الكامل لأخطاء المصادقة. يُرجى الاطّلاع على التعامل مع الأخطاء.