قم بتمكين المصادقة في تطبيق iOS Swift الخاص بك باستخدام Microsoft Azure Active Directory B2C

توضح لك هذه المقالة كيفية إضافة مصادقة Azure Active Directory B2C (Azure AD B2C) إلى تطبيق iOS Swift المحمول الخاص بك. تعرف على كيفية دمج تطبيق iOS Swift مع مصادقة مكتبة التعليمات البرمجية Microsoft (MSAL) لنظام iOS.

استخدم هذه المقالة مع تكوين المصادقة في نموذج لتطبيق iOS Swift، واستبدال نموذج تطبيق iOS Swift بتطبيق iOS Swift الخاص بك. بعد إكمال الإرشادات الواردة في هذه المقالة، سيقبل تطبيقك عمليات تسجيل الدخول عبر Microsoft Azure Active Directory B2C.

المتطلبات الأساسية

راجع المتطلبات الأساسية وإرشادات التكامل في تكوين المصادقة في نموذج لتطبيق iOS Swift باستخدام Microsoft Azure Active Directory B2C.

إنشاء مَشروع تطبيق iOS Swift

إذا لم يكن لديك بالفعل تطبيق iOS Swift، فقم بإعداد مشروع جديد عن طريق القيام بالخطوات التالية:

  1. افتح Xcode، ثم حدد ملف>مشروع>جديد.
  2. بالنسبة لتطبيقات iOS، حَدد تطبيق>iOS، ثم حدد التالي.
  3. لاختيار خيارات لمشروعك الجديد، قدّم ما يلي:
    1. اسم المنتج، مثل MSALiOS.
    2. معرف المؤسسة، مثل contoso.com.
    3. بالنِسبة للواجهة، حدد لوحة العمل.
    4. لدورة الحياة، حدد تفويض التطبيق UIKit.
    5. بالنسبة إلى اللغة، حدد سريع.
  4. حدد "Next".
  5. حدد مجلداً لإنشاء تطبيقك وحدد "إنشاء" .

الخطوة 1: تركيب مكتبة MSAL

  1. استخدم CocoaPods لتثبيت مَكتبة MSAL. في نفس المجلد مثل ملف .xcodeproj الخاص بمشروعك، إذا لم يكن ملف podfile موجودا، فقم بإنشاء ملف فارغ وسمه podfile. أضف التعليمات البرمجية التالية إلى ملف podfile:

    use_frameworks!
    
    target '<your-target-here>' do
       pod 'MSAL'
    end
    
  2. استبدل <your-target-here> باسم مشروعك (على سبيل المثال، MSALiOS). للحصول على مزيدٍ من المعلومات، راجع مرجع بنية Podfile.

  3. في نافذة طرفية، انتقل إلى المجلد الذي يحتوي على ملف podfile، ثم قم بتشغيل pod install لتثبيت مكتبة MSAL.

  4. بعد تشغيل الأمر pod install يتم إنشاء <ملف>.xcworkspace باسم مشروعك. لإعادة تحميل المشروع في Xcode، أغلِق Xcode ثم افتح <الملف >.xcworkspace.

الخطوة 2: تعيين نظام URL للتَطبيق

عندما يقوم المستخدمون بالمصادقة، يرسل Microsoft Azure Active Directory B2C رمز مصادقة إلى التطبيق باستخدام عنوان URI لإعادة التوجيه الذي تم تكوينه في تسجيل تطبيق Microsoft Azure Active Directory B2C.

تنسيق MSAL الافتراضي لإعادة التوجيه URI هو msauth.[Your_Bundle_Id]://auth. مثال على ذلك msauth.com.microsoft.identitysample.MSALiOS://auth، أين msauth.com.microsoft.identitysample.MSALiOS يوجد نظام URL.

في هذه الخطوة، قم بتسجيل مخطط URL الخاص بك باستخدام مصفوفة CFBundleURLSchemes. التطبيق الخاص بك ينصت لنظام URL لرد الاتصال من Microsoft Azure Active Directory B2C.

في Xcode، افتح الملف Info.plist كملف التعليمات البرمجية للمصدر. في قسم <dict>، أضف مقتطف XML التالي:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>msauth.com.microsoft.identitysample.MSALiOS</string>
        </array>
    </dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>msauthv2</string>
    <string>msauthv3</string>
</array>

الخطوة 3: إضافة التعليمة البرمجية للمصادقة

يتكون نموذج التعليمات البرمجية من فئةUIViewController. الفِئة:

  • يحدد بنية واجهة المستخدم.
  • يحتوي الملف على معلومات حول موفر هوية Microsoft Azure Active Directory B2C الخاص بك. يستخدم التطبيق هذه المعلومات لإنشاء علاقة ثقة مع Microsoft Azure Active Directory B2C.
  • يحتوي على التعليمة البرمجية الخاصة بالمصادقة لمصادقة المستخدمين والحصول على الرموز المميزة والتحقق من صحتها.

اختر مكان UIViewController مصادقة المستخدمين. في UIViewController، دمج التعليمات البَرمجية مع التعليمات البرمجية التي تم توفيرها في GitHub.

الخطوة 4: تَكوين تطبيق iOS Swift

بعد أن تقوم بإضافة التعليمة البرمجية للمصادقة ، قم بتكوين تطبيق iOS Swift باستخدام إعدادات Microsoft Azure Active Directory B2C. تم تكوين إعدادات موفر هوية Microsoft Azure Active Directory B2C في فئة UIViewController التي تم اختيارها في القسم السابق.

لمعرفة كيفية تكوين تطبيق iOS Swift الخاص بك، راجع تكوين المصادقة في نموذج لتطبيق iOS Swift باستخدام Microsoft Azure Active Directory B2C.

الخَطوة 5: تشغيل واختبار تطبيق الأجهزة المحمولة

  1. قم بإنشاء وتشغيل المَشروع مع جهاز محاكاة لجهاز iOS متصل.
  2. حدد "تسجيل الدخول" ثم قم بالتسجيل أو تسجيل الدخول باستخدام حسابك المحلي أو الاجتماعي في Microsoft Azure Active Directory B2C.
  3. بعد المصادقة بنجاح، سترى الاسم المعروض الخاص بك في شريط التنقل.

الخطوة 6: تخصيص التعليمة البرمجية الإنشائية الخاصة بك

يصف هذا القسم التعليمة البرمجية الإنشائية التي تمكّن المصادقة لتطبيق Swift الخاص بنظام iOS. يسرد طرق UIViewController ويناقش كيفية تخصيص التعليمات البرمجية الخاصة بك.

الخطوة 6.1: إنشاء مثيل لتطبيق العميل العام

تطبيقات العميل العامة غير موثوق بها للحفاظ على أسرار التطبيق بأمان، وليس لديها أسرار العميل. في viewDidLoad، أنشئ مثيل MSAL باستخدام كائن تطبيق عميل عام.

توضح القصاصة البرمجية Swift التالية كيفية تهيئة MSAL باستخدام عصر تكوين MSALPublicClientApplicationConfig.

يوفر عنصر التكوين معلومات حول بيئة Microsoft Azure Active Directory B2C. على سبيل المثال، يوفر معرّف العميل وإعادة توجيه URI والمرجع لإنشاء طلبات المصادقة إلى Microsoft Azure Active Directory B2C. للحصول على معلومات حول عنصر التكوين، راجع تكوين نموذج تطبيق الجوال .

do {

    let signinPolicyAuthority = try self.getAuthority(forPolicy: self.kSignupOrSigninPolicy)
    let editProfileAuthority = try self.getAuthority(forPolicy: self.kEditProfilePolicy)
    
    let pcaConfig = MSALPublicClientApplicationConfig(clientId: kClientID, redirectUri: kRedirectUri, authority: signinPolicyAuthority)
    pcaConfig.knownAuthorities = [signinPolicyAuthority, editProfileAuthority]
    
    self.applicationContext = try MSALPublicClientApplication(configuration: pcaConfig)
    self.initWebViewParams()
    
    } catch {
        self.updateLoggingText(text: "Unable to create application \(error)")
    }

تعمل الطريقة initWebViewParams على تهيئة تجربة المصادقة التفاعلية.

تقوم القصاصة البرمجية Swift التالية بتهيئة عضو الفصل الدراسي webViewParameters باستخدام عرض ويب النظام. للحصول على مزيدٍ من المعلومات، راجع مقالة تخصيص المستعرضات وعروض WebView لنظامي التشغيل iOS/macOS.

func initWebViewParams() {
    self.webViewParameters = MSALWebviewParameters(authPresentationViewController: self)
    self.webViewParameters?.webviewType = .default
}

الخطوة 6.2: بدئ طلب تخويل تفاعلي

طلب التخويل التَفاعلي هو تدفق يُطلب من المستخدمين فيه التسجيل أو تسجيل الدخول. عندما يحدد المستخدمون زر تسجيل الدخول،authorizationButton يتم استِدعاء الأسلوب.

تقوم الطريقة authorizationButtonبإعداد عنصرMSALInteractiveTokenParameters بالبيانات ذات الصلة حول طلب التفويض. تستخدم الطريقة acquireTokenMSALInteractiveTokenParameters لمصادقة المستخدمين عبر عرض ويب للنظام.

توضح القصاصة البرمجية التالية كيفية بدء طلب التفويض التفاعلي:

let parameters = MSALInteractiveTokenParameters(scopes: kScopes, webviewParameters: self.webViewParameters!)
parameters.promptType = .selectAccount
parameters.authority = authority

applicationContext.acquireToken(with: parameters) { (result, error) in

// On error code    
guard let result = result else {
    self.updateLoggingText(text: "Could not acquire token: \(error ?? "No error information" as! Error)")
    return
}

// On success code
self.accessToken = result.accessToken
self.updateLoggingText(text: "Access token is \(self.accessToken ?? "Empty")")
}

بعد أن ينتهي المستخدمون من تدفق التفويض، سواء بنجاح أو بدون نجاح، يتم إرجاع النتيجة إلى إغلاق الأسلوب acquireToken.

تقوم الطريقة acquireToken بإرجاع عنصرين result و error. استخدم هذا الإغلاق من أجل:

  • قم بتحديث واجهة مستخدم تطبيق الأجهزة المحمولة بالمعلومات بعد اكتمال المصادقة.
  • استدعي خدمة واجهة برمجة تطبيقات الويب باستخدام الرمز المميز للوصول.
  • عالج أخطاء المصادقة (على سبيل المثال، عندما يلغي المستخدم تدفق تسجيل الدخول).

الخطوة 6.3: استدعاء واجهة برمجة تطبيقات الويب

لاستدعاء واجهة بَرمجة تطبيقات ويب للتخويل المستندة إلى الرمز المميز، يحتاج التطبيق إلى رمز وصول صالح. يقوم التَطبيق بما يلي:

  1. يكتسب رمز وصول مع الأذونات (النطاقات) المطلوبة لنقطة نهاية واجهة برمجة تطبيقات الويب.
  2. تمرير رمز الوصول كرمز حامل في عنوان التفويض لطلب HTTP باستخدام هذا التنسيق:
Authorization: Bearer <access-token>

عندما يقوم المستخدمون بالمصادقة التفاعلية، يحصل التطبيق على رمز وصول في acquireToken الإغلاق. للاستدعاءات اللاحقة لواجهة برمجة تطبيقات الويب، استخدم طريقة اكتساب الرمز المميز الصامت (acquireTokenSilent)، كما هو موضح في هذا القسم.

acquireTokenSilent يقوم الأسلوب بالإجراءات التالية:

  1. يحاول جلب رمز وصول مع النطاقات المطلوبة من ذاكرة التخزين المؤقت للرمز المميز. في حالة وجود الرمز المميز ولم تنته صلاحيته، يتم إرجاع الرمز المميز.
  2. إذا لم يكن الرمز المميز موجودًا في ذاكرة التخزين المؤقت للرمز المميز أو انتهت صلاحيته، تحاول مكتبة MSAL استخدام رمز التحديث للحصول على رمز وصول جديد.
  3. إذا كان رمز التحديث غير موجود أو انتهت صلاحيته، يتم إرجاع استثناء. نوصي بمُطالبة المستخدم بتسجيل الدخول بشكل تفاعلي.

توضح القصاصة البرمجية التالية كيفية الحصول على الرمز المميز للوصول:

do {

// Get the authority using the sign-in or sign-up user flow
let authority = try self.getAuthority(forPolicy: self.kSignupOrSigninPolicy)

// Get the current account from the application context
guard let thisAccount = try self.getAccountByPolicy(withAccounts: applicationContext.allAccounts(), policy: kSignupOrSigninPolicy) else {
    self.updateLoggingText(text: "There is no account available!")
    return
}

// Configure the acquire token silent parameters
let parameters = MSALSilentTokenParameters(scopes: kScopes, account:thisAccount)
parameters.authority = authority
parameters.loginHint = "username"

// Acquire token silent
self.applicationContext.acquireTokenSilent(with: parameters) { (result, error) in
    if let error = error {
        
        let nsError = error as NSError
        
        // interactionRequired means we need to ask the user to sign in. This usually happens
        // when the user's Refresh Token is expired or if the user has changed their password
        // among other possible reasons.
        
        if (nsError.domain == MSALErrorDomain) {
            
            if (nsError.code == MSALError.interactionRequired.rawValue) {
                
                // Start an interactive authorization code
                // Notice we supply the account here. This ensures we acquire token for the same account
                // as we originally authenticated.
                
                ...
            }
        }
        
        self.updateLoggingText(text: "Could not acquire token: \(error)")
        return
    }
    
    guard let result = result else {
        
        self.updateLoggingText(text: "Could not acquire token: No result returned")
        return
    }
    
    // On success, set the access token to the accessToken class member. 
    // The callGraphAPI method uses the access token to call a web API  
    self.accessToken = result.accessToken
    ...
}
} catch {
self.updateLoggingText(text: "Unable to construct parameters before calling acquire token \(error)")
}

يسترد الأسلوب callGraphAPI رمز الوصول ويستدعي واجهة برمجة تطبيقات الويب، كما هو موضح هنا:

@objc func callGraphAPI(_ sender: UIButton) {
    guard let accessToken = self.accessToken else {
        self.updateLoggingText(text: "Operation failed because could not find an access token!")
        return
    }
    
    let sessionConfig = URLSessionConfiguration.default
    sessionConfig.timeoutIntervalForRequest = 30
    let url = URL(string: self.kGraphURI)
    var request = URLRequest(url: url!)
    request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
    let urlSession = URLSession(configuration: sessionConfig, delegate: self, delegateQueue: OperationQueue.main)
    
    self.updateLoggingText(text: "Calling the API....")
    
    urlSession.dataTask(with: request) { data, response, error in
        guard let validData = data else {
            self.updateLoggingText(text: "Could not call API: \(error ?? "No error information" as! Error)")
            return
        }
        
        let result = try? JSONSerialization.jsonObject(with: validData, options: [])
        
        guard let validResult = result as? [String: Any] else {
            self.updateLoggingText(text: "Nothing returned from API")
            return
        }
        
        self.updateLoggingText(text: "API response: \(validResult.debugDescription)")
        }.resume()
}

الخطوة 6.4: تسجيل الخروج للمستخدمين

يؤدي تسجيل الخروج باستخدام MSAL إلى إزالة جميع المعلومات المعروفة عن المستخدمين من التطبيق. استخدم طريقة تسجيل الخروج لتسجيل خروج المستخدمين وتحديث واجهة المستخدم. على سبيل المثال، يُمكنك إخفاء عناصر واجهة المستخدم المحمية أو إخفاء زر تسجيل الخروج أو إظهار زر تسجيل الدخول.

توضح القصاصة البرمجية التالية كيفية تسجيل خروج المستخدمين:

@objc func signoutButton(_ sender: UIButton) {
do {
    
    
    let thisAccount = try self.getAccountByPolicy(withAccounts: applicationContext.allAccounts(), policy: kSignupOrSigninPolicy)
    
    if let accountToRemove = thisAccount {
        try applicationContext.remove(accountToRemove)
    } else {
        self.updateLoggingText(text: "There is no account to signing out!")
    }
    
    ...
    
} catch  {
    self.updateLoggingText(text: "Received error signing out: \(error)")
}
}

الخطوات التالية

ستتعرف على كيفية: