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

يمكنك السماح للمستخدمين بالمصادقة مع Firebase باستخدام موفري OAuth مثل Microsoft Azure Active Directory من خلال دمج تسجيل دخول OAuth العام المستند إلى الويب في تطبيقك باستخدام Firebase SDK لتنفيذ تدفق تسجيل الدخول الشامل.

قبل ان تبدأ

لتسجيل دخول المستخدمين باستخدام حسابات Microsoft (Azure Active Directory وحسابات Microsoft الشخصية)، يجب عليك أولاً تمكين Microsoft كموفر تسجيل دخول لمشروع Firebase الخاص بك:

  1. أضف Firebase إلى مشروع Apple الخاص بك .
  2. في وحدة تحكم Firebase ، افتح قسم المصادقة .
  3. في علامة التبويب طريقة تسجيل الدخول ، قم بتمكين موفر Microsoft .
  4. أضف معرف العميل وسر العميل من وحدة تحكم المطور الخاصة بهذا الموفر إلى تكوين الموفر:
    1. لتسجيل عميل Microsoft OAuth، اتبع الإرشادات الموجودة في Quickstart: قم بتسجيل تطبيق باستخدام نقطة نهاية Azure Active Directory v2.0 . لاحظ أن نقطة النهاية هذه تدعم تسجيل الدخول باستخدام حسابات Microsoft الشخصية بالإضافة إلى حسابات Azure Active Directory. تعرف على المزيد حول Azure Active Directory v2.0.
    2. عند تسجيل التطبيقات مع هؤلاء الموفرين، تأكد من تسجيل النطاق *.firebaseapp.com لمشروعك باعتباره مجال إعادة التوجيه لتطبيقك.
  5. انقر فوق حفظ .

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

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

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

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

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

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

    سويفت

        var provider = OAuthProvider(providerID: "microsoft.com")
        

    ج موضوعية

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

    سويفت

        provider.customParameters = [
          "prompt": "consent",
          "login_hint": "user@firstadd.onmicrosoft.com"
        ]
        

    ج موضوعية

        [provider setCustomParameters:@{@"prompt": @"consent", @"login_hint": @"user@firstadd.onmicrosoft.com"}];
        

    للتعرف على المعلمات التي تدعمها Microsoft، راجع وثائق Microsoft OAuth . لاحظ أنه لا يمكنك تمرير المعلمات المطلوبة لـ Firebase باستخدام setCustomParameters . هذه المعلمات هي Client_id و response_type و redirect_uri والحالة والنطاق و response_mode .

    للسماح فقط للمستخدمين من مستأجر Azure AD معين بتسجيل الدخول إلى التطبيق، يمكن استخدام إما اسم المجال المألوف لمستأجر Azure AD أو معرف GUID الخاص بالمستأجر. يمكن القيام بذلك عن طريق تحديد حقل "المستأجر" في كائن المعلمات المخصصة.

    سويفت

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

    ج موضوعية

        // 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"};
        
  4. اختياري : حدد نطاقات OAuth 2.0 الإضافية خارج ملف التعريف الأساسي الذي تريد طلبه من موفر المصادقة.

    سويفت

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

    ج موضوعية

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

    لمعرفة المزيد، راجع أذونات Microsoft ووثائق الموافقة .

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

  6. قم بالمصادقة مع Firebase باستخدام كائن موفر OAuth.

    سويفت

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

    ج موضوعية

        [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 Auth، لا توفر Microsoft عنوان URL للصورة وبدلاً من ذلك، يجب طلب البيانات الثنائية لصورة الملف الشخصي عبر Microsoft Graph API .

    بالإضافة إلى رمز وصول OAuth، يمكن أيضًا استرداد رمز OAuth ID المميز للمستخدم من كائن OAuthCredential . المطالبة sub في الرمز المميز للمعرف خاصة بالتطبيق ولن تتطابق مع معرف المستخدم الموحد الذي تستخدمه Firebase Auth ويمكن الوصول إليه عبر user.providerData[0].uid . يجب استخدام حقل مطالبة oid بدلاً من ذلك. عند استخدام مستأجر Azure AD لتسجيل الدخول، ستكون مطالبة oid متطابقة تمامًا. ومع ذلك، بالنسبة لحالة غير المستأجر، يكون حقل oid مبطنًا. بالنسبة للمعرف الموحد 4b2eabcdefghijkl ، سيكون oid الشكل 00000000-0000-0000-4b2e-abcdefghijkl .

  7. بينما تركز الأمثلة المذكورة أعلاه على تدفقات تسجيل الدخول، لديك أيضًا القدرة على ربط موفر Microsoft بمستخدم حالي باستخدام linkWithCredential . على سبيل المثال، يمكنك ربط عدة موفري خدمات بنفس المستخدم مما يسمح لهم بتسجيل الدخول باستخدام أي منهما.

    سويفت

        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
        }
        

    ج موضوعية

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

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

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