المقدمة
يصف هذا المستند مشاركة الموارد عبر الأصل بالكامل حتى يتم فهم العمليات الأساسية بشكل كامل أثناء أستكشاف الأخطاء وإصلاحها.
المتطلبات الأساسية
المتطلبات
توصي Cisco بأن تكون لديك معرفة بالمواضيع التالية:
- Cisco Unified Contact Center Enterprise (UCCE)، الإصدار 12.6.x
- Cisco Packaged Contact Center Enterprise (PCCE)، الإصدار 12.6.x
- Cisco Finesse، الإصدار 12.6.x
- مركز الذكاء الموحد من Cisco (CUIC)، الإصدار 12.6.x
المكونات المستخدمة
تستند المعلومات الواردة في هذا المستند إلى إصدارات البرامج والمكونات المادية التالية:
- UCCE الإصدار 12.6.2
- Finesse، الإصدار 12.6.2
- CUIC الإصدار 12.6.2
تم إنشاء المعلومات الواردة في هذا المستند من الأجهزة الموجودة في بيئة معملية خاصة. بدأت جميع الأجهزة المُستخدمة في هذا المستند بتكوين ممسوح (افتراضي). إذا كانت شبكتك قيد التشغيل، فتأكد من فهمك للتأثير المحتمل لأي أمر.
معلومات أساسية
ما هو CORS
مشاركة الموارد عبر الأصل (CORS) هي طريقة للخوادم للتحكم في مواقع الويب (المجالات والبروتوكولات والمنافذ) المسموح لها بالوصول إلى مواردها. بينما تقوم المستعرضات عادة بحظر الطلبات من أصول مختلفة (نهج الأصل نفسه)، فإن CORS تمنح الخوادم القدرة على تخفيف هذا التقييد بشكل انتقائي. في الأساس، تستخدم الخوادم رؤوس HTTP الخاصة لإخبار المستعرض بالأصول المسموح بها، وأنواع الطلبات المسموح بها (مثل GET، و POST، وما إلى ذلك)، وأي الرؤوس المخصصة يمكن تضمينها. وهذا يتيح للخوادم إمكانية تحديد من يمكنه الوصول إلى واجهات برمجة التطبيقات (API) الخاصة بها وكيفية الوصول إليها، والتي تتراوح من مفتوح تماما إلى وصول محدود للغاية. يعمل CORS عن طريق جعل المستعرض والخادم يتواصلان من خلال رؤوس HTTP هذه لإدارة الطلبات متعددة الأصول.
يستخدم CORS رؤوس HTTP لتمكين طلبات الأصل التبادلي التي يتم التحكم فيها. يتواصل المستعرض والخادم عبر هذه الرؤوس، حيث يقوم الخادم بتحديد الأصول والأساليب والرؤوس المسموح بها. إذا كانت رؤوس ردود الخادم مفقودة أو غير صالحة، يقوم المستعرض بحظر الاستجابة، مع فرض نهج نفس الأصل. لطلبات معينة، يرسل المتصفح طلب إختبار مبدئي إلى الخادم لضمان أنه يقبل طلب الأصل التبادلي الفعلي.
تستخدم المستعرضات طلبات الاختبار المبدئي للتحقق مما إذا كان الخادم يسمح بطلب أصل تبادلي قبل إرسال الطلب الحقيقي. تتضمن طلبات الاختبار المبدئي تلك تفاصيل مثل طريقة HTTP ورؤوس مخصصة. يمكن بعد ذلك لملقمات CORS التي تم تمكينها الاستجابة، إما السماح بالطلب الفعلي أو رفضه. إذا لم يتم تكوين خادم ل CORS، فإنه لا يستجيب بشكل صحيح للاختبار المبدئي، ويحظر المتصفح الطلب الفعلي، وبالتالي يحمي الخادم من الوصول غير المرغوب للأصل التبادلي.
مشاركة الموارد عبر الأصل (CORS) أمر بالغ الأهمية لأمان الويب ووظائفه. وهو يسمح بالوصول المتحكم به إلى الموارد من أصول مختلفة (مجالات، بروتوكولات، منافذ)، وهو أمر ضروري لأن المستعرضات تفرض سياسة نفس الأصل التي تمنع عادة هذا الوصول.
دورة حياة مركز CORS
يتكون طلب CORS من جانبين: العميل الذي يقوم بالطلب والخادم الذي يتلقى الطلب. على جانب العميل، يقوم المطور بكتابة رمز JavaScript لإرسال الطلب إلى الخادم. يستجيب الخادم للطلب من خلال تعيين رؤوس خاصة خاصة خاصة ب CORS للإشارة إلى السماح بطلب الأصل التبادلي. بدون مشاركة كل من العميل والخادم، يفشل طلب CORS.
المشغلات الأساسية في طلب CORS هي العميل والمستعرض والخادم. يريد العميل بعض البيانات من الخادم، مثل إستجابة واجهة برمجة تطبيقات JSON أو محتويات صفحة ويب. يعمل المستعرض كوسيط موثوق به للتحقق من إمكانية وصول العميل إلى البيانات من الخادم.
العميل:
العميل هو جزء من رمز JavaScript يتم تشغيله على موقع ويب، وهو مسؤول عن بدء طلب CORS
ملاحظة: Finesse هو تطبيق ويب. فهو مثبت على خادم، ويمكن للعملاء الوصول إليه ببساطة عن طريق إستخدام مستعرضات الويب الخاصة بهم، مما يقلل من الحاجة إلى عمليات التثبيت من جانب العميل أو صيانة الملحقات أو البرامج الأخرى. كما هو موضح في مثال CORS قيد العمل باستخدام مثال Cisco Finesse، تدعم هذه البنية مميزات مثل تقارير البيانات المباشرة. في هذا السياق، يعمل رمز JavaScript الخاص بجهاز بيانات Finesse المباشرة من Cisco كعميل، بينما يعمل CUIC من Cisco كخادم خلال دورة حياة CORS. وفي الأساس، يتفاعل عميل Finesse المستند إلى المستعرض مع خادم CUIC لاسترداد البيانات المباشرة.
العميل مقابل المستخدم:
في بعض الأحيان يتم إستخدام الكلمات زبون ومستعمل بالتبادل، لكنها تختلف في سياق CORS. المستخدم هو شخص يقوم بزيارة موقع ويب أو مستخدم Finesse (وكيل أو متفوق) للوصول إلى Finesse في هذا السياق، بينما العميل هو الرمز الفعلي الذي يقدمه هذا الموقع. يمكن للعديد من المستخدمين زيارة نفس موقع الويب والحصول على نفس رمز عميل JavaScript.
المستعرض:
يحتوي المستعرض، المعروف أيضا باسم وكيل المستخدم، على التعليمات البرمجية من جانب العميل. ويلعب دورا حاسما في CORS من خلال إضافة معلومات إضافية إلى الطلبات الصادرة، مما يمكن الخادم من تحديد العميل. علاوة على ذلك، يقوم المستعرض بتفسير إستجابة الخادم، ويحدد ما إذا كان سيتم تسليم البيانات إلى العميل أو إرجاع خطأ. تعد هذه الإجراءات على جانب المستعرض ضرورية للحفاظ على الأمان الذي توفره سياسة المصدر نفسه. ومن دون تطبيق المستعرض لقواعد CORS، يمكن للعملاء تقديم طلبات غير مصرح بها، مما يعرض آلية الأمان الحيوية هذه للخطر.
الخادم:
الخادم هو وجهة طلب CORS، وهو CUIC لنموذج الأداة الذكية Live Data مع Cisco Finesse. يقوم الخادم بتخزين البيانات التي يريدها العميل، كما يتوفر له القول النهائي فيما إذا كان طلب CORS مسموحا به أم لا.
الآن بعد أن عرفت من هو المشمول في طلب CORS، دعونا نلقي نظرة على كيف يعملون جميعا معا. وتوضح الصور التالية دورة حياة CORS عالية المستوى:
1. يقوم العميل ببدء الطلب.
2. يقوم المستعرض بإضافة معلومات إضافية إلى الطلب وإعادة توجيهه إلى الخادم.
3. يقرر الخادم كيفية الاستجابة للطلب، ويرسل الاستجابة إلى المستعرض.
4. يقرر المستعرض ما إذا كان يجب على العميل الوصول إلى الرد، وإما يقوم بتمرير الرد إلى العميل أو إرجاع خطأ.

قبل إرسال طلب أصلي، يقوم المستعرض تلقائيا بإضافة رأس أصل إلى طلب HTTP. يعد هذا الرأس، الذي لا يمكن للعميل تعديله، جزءا هاما من CORS ويعمل على تحديد أصل العميل (أي المجال والبروتوكول والمنفذ الذي تم تحميل مورد العميل منه). يمنع هذا الإجراء الأمني العملاء من انتحال أصول أخرى. رأس الأصل أساسي ل CORS، حيث أنه هو كيف يخبر العميل الخادم من أين يأتي.
في تفاعل مشاركة الموارد عبر الأصل (CORS)، يتم تحديد أصل العميل بواسطة رأس الأصل في الطلب الأولي. ثم يستخدم الخادم رأس أصل Access-Control-Allow في إستجابته للإشارة إلى ما إذا كان يسمح للعميل بالوصول إلى المورد المطلوب. رأس الاستجابة هذا حاسم؛ في حالة عدم وجود طلب CORS، يفشل الطلب. يمكن أن يحتوي رأس أصل السماح بالتحكم في الوصول على حرف بدل (*)، يسمح بالوصول من أي أصل، أو أصل محدد، ويمنح الوصول فقط إلى ذلك العميل المعين. بينما تظهر الصورة أصل السماح بالتحكم بالوصول: *، يعني أن CUIC يسمح بكل الأصول، CUIC يرسل عادة هذا الرأس مع أصل معين في سيناريوهات العالم الحقيقي.

عندما يرفض المستعرض طلب CORS، فهذا يعني أن العميل لا يتلقى أي معلومات حول إستجابة الخادم. لا يعلم العميل إلا بحدوث خطأ، ولكنه يفتقر إلى التفاصيل حول المشكلة المحددة. يمكن أن يؤدي ذلك إلى تحدي أخطاء تصحيح CORS، حيث أنه من الصعب تمييز فشل CORS عن أنواع الأخطاء الأخرى. وعلى الرغم من إرسال الطلب الأولي إلى الخادم، إلا أنه في حالة افتقار إستجابة الخادم إلى رأس أصل السماح بالتحكم بالوصول (Access-Control-Allow) صالح، يقوم المستعرض بحظر الاستجابة وتشغيل خطأ على جانب العميل، مما يمنع العميل من رؤية إستجابة الخادم التفصيلية على الإطلاق.

تشرح هذه الصورة عملية CORS بالكامل، مع تركيز خاص على مرحلة الاختبار المبدئي، والتي هي أساسية لمعالجة أنواع معينة من طلبات الأصل التبادلي.

CORS قيد التشغيل باستخدام Cisco Finesse
مثال توضيحي: تحليل سلوك CORS باستخدام الأداة الذكية Live Data
يصف هذا القسم الاستخدام النموذجي لمشاركة الموارد عبر الأصل (CORS) مع Cisco Finesse في مراكز الاتصال. يستخدم العملاء والمشرفون عادة Cisco Finesse للوصول إلى تقارير البيانات في الوقت الفعلي (كما هو موضح في صورة المثال).
عندما يقوم عامل أو مشرف بالنقر فوق أداة ذكية للتقرير، يقوم الإجراء الخاص به ببدء طلب إسترداد البيانات. يتم إرسال هذا الطلب من رمز JavaScript لتطبيق Finesse (الذي يعمل كعميل) إلى خادم بيانات CUIC/Live باستخدام طريقة GET. كما هو موضح في صورة أداة تتبع SAML، يرسل المتصفح طلب إختبار مبدئي لأول مرة إلى الخادم، دورة حياة CORS الموضحة سابقا.

يتم إرسال طلب خيارات HTTP (طلب الاختبار المبدئي) إلى خادم بيانات CUIC/Live. يحدد هذا الطلب الأصل كاسم مجال مؤهل بالكامل (FQDN) لخادم Finesse، بما في ذلك المنفذ 8445. هذا هو نفس العنوان والمنفذ الذي يستخدمه العملاء للوصول إلى تطبيق Cisco Finesse.

أمر واجهة سطر الأوامر (CLI) على عنصر التحكم CUIC/Live Data Server الذي يتم السماح للمنشأ بالوصول إلى موارد البيانات المباشرة الخاصة به. إذا تم تكوين أصل خادم Finesse (FQDN ومنفذه) في هذه الإعدادات، فعندئذ يمكن للعملاء عرض تفاصيل الأداة الذكية للبيانات المباشرة داخل Finesse.


أداة TAC لاختبار اتصال CORS
قد تتسبب التكوينات الخاطئة ل CORS على جانب الخادم في بعض الأحيان في حدوث مشاكل مع أدوات بيانات مباشرة أو تابعة لجهات خارجية في Cisco Finesse. توفر هذه المقالة رابطا إلى أداة بحث سريع من CORS، وهي أداة لاستكشاف الأخطاء وإصلاحها تم تصميمها للمساعدة في تشخيص مشاكل مشاركة الموارد عبر الأصل التي تؤثر على أدوات Finesse الذكية، بما في ذلك عروض البيانات المباشرة وعمليات التكامل الأخرى التابعة لجهة خارجية.
من الناحية الفنية، تعمل الأداة الذكية هذه عن طريق إرسال طلبات الاختبار المبدئي من عميل Cisco Finesse إلى مورد هدف محدد. تساعد وظيفة الفحص السريع هذه على تحديد المشكلات المتعلقة ب CORS وحلها بسرعة، مما يعمل على تسريع عملية أستكشاف الأخطاء وإصلاحها.
لنشر أداة التحكم في الوصول السريع من الإصدار 12.6 إلى الإصدار 1.0 من مركز الاتصال داخل سطح مكتب Finesse:
1. تنزيل ملفات الأداة الذكية من مجلد Contact Center Check السريع 12.6-V1.0.2.
2. انسخ محتويات مجلد Contact Center CORS Quick Check 12.6-V1.0 إلى دليل 3rdpartygadget ضمن تثبيت Finesse.
3. أضف الأداة الذكية إلى دور المستخدم المطلوب (الوكيل والمشرف وما إلى ذلك) في تخطيط سطح المكتب Finesse. يوضح المثال المتوفر XML التكوين الصحيح لإضافة هذه الأداة الذكية.
<gadget>/3rdpartygadget/files/TestCORSgadget.xml</gadget>
راجع الفصل الخاص بالأدوات الذكية للطرف الثالث في دليل Finesse Developer وفصل "إدارة الأدوات الذكية للطرف الثالث" في دليل إدارة Finesse للحصول على مزيد من المعلومات حول تحميل الأدوات الذكية للطرف الثالث وإضافتها إلى سطح المكتب.
بمجرد تحميل ملفات الأداة الذكية وإعادة تشغيل خدمة Cisco Finesse Tomcat، تتوفر الأداة الذكية وتعرض واجهة المستخدم الرسومية (GUI).

يمكنك تحديد CUIC من القائمة المنسدلة العليا في الأعلى. أدخل اسم المجال المؤهل بالكامل (FQDN) لخادم CUIC في الحقل المتوفر. الاختبار الناجح سيكون كما هو موضح هنا.

يعني الاختبار الناجح تكوين خادم CUIC بشكل صحيح لمشاركة الموارد عبر الأصل (CORS) مع خادم Finesse. تظهر سجلات تتبع SAML الخاصة بالمستعرض أن طلب خيارات HTTP (الاختبار المبدئي CORS) تم إرساله إلى خادم CUIC. تضمن هذا الطلب عنوان خادم Finesse في رأس الأصل. استجاب خادم CUIC برسالة HTTP 200 OK، والأهم من ذلك، أن رأس أصل السماح بالتحكم في الوصول في الاستجابة يحتوي أيضا على عنوان خادم Finesse. هذا يؤكد أن خادم CUIC تم تكوينه للسماح بالطلبات من أصل خادم Finesse، للتحقق من إعداد CORS بشكل صحيح.
OPTIONS https://cuicpub.uccelab.tac/cuic/ HTTP/1.1
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome..
sec-ch-ua: "Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"
sec-ch-ua-mobile: ?0
Accept: */*
Origin: https://finessep.uccelab.tac:8445
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://finessep.uccelab.tac:8445/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: en-US,en;q=0.9
HTTP/1.1 200
server: nginx
date: Sat, 08 Feb 2025 01:27:47 GMT
content-length: 0
strict-transport-security: max-age=31536000; includeSubDomains
set-cookie: JSESSIONID=bE73993C4A7C1Fc1b33A7AaF897B8428; Path=/cuic; Secure; HttpOnly; SameSite=Strict
pragma: No-cache
cache-control: no-cache
expires: Thu, 01 Jan 1970 00:00:00 GMT
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
content-security-policy: default-src 'self' ; script-src 'self' data: 'unsafe-inline' 'unsafe-eval' ; style-src 'self' data: 'unsafe-inline' blob: ; img-src 'self' data: 'unsafe-inline' ; connect-src 'self' https://cuicpub.uccelab.tac:443 wss://cuicpub.uccelab.tac:443 https://cuicsub.uccelab.tac:443 wss://cuicsub.uccelab.tac:443 ;
vary: origin,access-control-request-method,Access-Control-Request-Headers
access-control-allow-origin: https://finessep.uccelab.tac:8445
access-control-allow-credentials: true
access-control-expose-headers: access-control-allow-origin,access-control-allow-credentials,access-control-max-age,access-control-allow-headers,access-control-allow-methods,access-control-allow-private-network
access-control-max-age: 600
access-control-allow-methods: DELETE,POST,GET,OPTIONS,PUT
access-control-allow-headers: referer,peripheralid,origin,access-control-request-method,locale,accept,authorization,domain,x-requested-with,access-control-request-headers,content-type,access-control-request-private-network,user-agent
allow: GET,POST,OPTIONS,PUT,DELETE
في هذا السيناريو، توضح الأداة تكوين غير صالح للعمل. بخلاف المثال السابق، لم يتم تكوين خادم Finesse كمشترك على خادم CUIC. بدلا من ذلك، يتم تكوينه فقط على ناشر CUIC. ونتيجة لذلك، يفشل طلب الاختبار المبدئي CORS، ويستجيب خادم CUIC بخطأ HTTP 403 (ممنوع).

OPTIONS https://cuicsub.uccelab.tac/cuic/ HTTP/1.1
Accept: */*
Access-Control-Request-Method: OPTIONS
Origin: https://finessep.uccelab.tac:8445
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome..
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
Sec-Fetch-Dest: empty
Referer: https://finessep.uccelab.tac:8445/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: en-US,en;q=0.9
HTTP/1.1 403
server: nginx
date: Sat, 08 Feb 2025 01:54:52 GMT
content-type: text/html;charset=utf-8
content-length: 2143
strict-transport-security: max-age=31536000; includeSubDomains
set-cookie: JSESSIONID=1C7606841B83d7847486c3d18D31cEfD; Path=/cuic; Secure; HttpOnly; SameSite=Strict
pragma: No-cache
cache-control: no-cache
expires: Thu, 01 Jan 1970 00:00:00 GMT
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
كما ترى من إخراج واجهة سطر أوامر المشترك المميز (CLI)، لا يتم سرد Cisco Finesse. يشير ذلك إلى أن Finesse لم يتم تكوينها حاليا كمشترك على خادم CUIC هذا.
admin:utils cuic cors allowed_origin list
cors_allowedorigins
===========================
1. https://finessep.uccelab.tac
2. https://finesses.uccelab.tac
3. https://finesses.uccelab.tac:8445