إضافة عناوين إضافية لطلب HTTP

تحتوي طلبات HTTP على عناوين، مثل وكيل المستخدم أو نوع المحتوى. بصرف النظر عن العناوين المرفقة بواسطة في المتصفحات، قد تضيف تطبيقات Android عناوين إضافية، مثل ملف تعريف الارتباط أو المُحيل من خلال EXTRA_HEADERS الرغبة في الشراء الإضافية. لأسباب تتعلق بالأمان، يعمل Chrome على فلترة بعض العناوين الإضافية اعتمادًا على كيفية ومكان إطلاق الهدف.

تتطلب الطلبات المشتركة المصدر طبقة إضافية من الأمان حيث إن العميل والخادم هما غير مملوكة لنفس الطرف. يناقش هذا الدليل طرح هذه الطلبات من خلال Chrome. علامات التبويب المخصَّصة، أي الأهداف التي تم إطلاقها من تطبيقات تفتح عنوان URL في علامة تبويب المتصفِّح. حتى Chrome 83، كان بإمكان المطوّرين إضافة أي عناوين عند إطلاق علامة تبويب مخصَّصة. واعتبارًا من الإصدار 83 فصاعدًا، أصبح متصفّح Chrome بدأوا بفلترة الكل باستثناء العناوين المقبولة من مصادر متعدّدة، لأنّ العناوين غير المدرَجة في القائمة الموافقة خطرًا أمنيًا. بدءًا من الإصدار 86 من Chrome، من الممكن إرفاق الرؤوس غير المدرَجة في القائمة الطلبات من مصادر متعددة، عندما يكون الخادم والعميل مرتبطَين باستخدام رابط إلى مواد عرض رقمية. يتم تلخيص هذا السلوك في الجدول التالي:

إصدار Chrome عناوين CORS المسموح بها
قبل الإصدار 83 من Chrome مُدرَج بالموافقة، غير مُدرَج في قائمة الموافقة
الإصدارات من 83 إلى Chrome 85 مُدرَج في قائمة الموافقة
بدءًا من الإصدار Chrome 86 والإصدارات الأحدث مُدرَجة بالموافقة أو غير موافَق عليها عند إعداد رابط إلى مواد العرض الرقمية

الجدول 1: فلترة عناوين سياسة مشاركة الموارد المتعددة المصادر (CORS) غير التي تمت الموافقة عليها.

توضِّح هذه المقالة كيفية إعداد اتصال تم التحقق منه بين الخادم والعميل واستخدام لإرسال عناوين http مدرجة إلى قائمة الموافقة وكذلك غير مُدرجة للموافقة. يمكنك التخطّي إلى إضافة رؤوس إضافية إلى أهداف علامة التبويب المخصّصة للتعليمة البرمجية.

الخلفية

عناوين طلبات سياسة مشاركة الموارد المتعددة المصادر (CORS) التي تمت الموافقة عليها مقابل تلك التي لم تتم الموافقة عليها

تسمح سياسة مشاركة الموارد المتعدّدة المصادر (CORS) لتطبيق ويب من مصدر واحد بتقديم طلب. الموارد من مصدر مختلف. يتم الاحتفاظ بقائمة العناوين التي تمت الموافقة عليها في قائمة سياسة مشاركة الموارد المتعددة المصادر (CORS) في HTML Standard: يظهر في الجدول التالي أمثلة للعناوين المُدرَجة في قائمة الموافقة:

Header الوصف
accept-language تعلن عن لغات طبيعية يفهمها العميل
لغة المحتوى يصف اللغة المخصّصة للجمهور الحالي
نوع المحتوى تشير إلى نوع الوسائط الخاص بالمورد

الجدول 2: مثال على عناوين سياسة مشاركة الموارد المتعددة المصادر (CORS) المدرَجة في قائمة الموافقة

تُعتبر العناوين المدرَجة في القائمة الموافق عليها آمنة لأنها لا تحتوي على بيانات حساسة. معلومات المستخدم ومن غير المحتمل أن تؤدي إلى إجراء الخادم لعمليات ضارّة.

يتم عرض أمثلة للعناوين غير المعتمدة في الجدول التالي:

Header الوصف
bearer-token يصادق على العميل في الخادم
الأصل يشير إلى أصل الطلب
كعكة محلاة يحتوي على ملفات تعريف الارتباط التي ضبطها الخادم.

الجدول 3: أمثلة على عناوين CORS غير المعتمدة.

لا يوصي معيار HTML والخوادم بإرفاق العناوين غير المعتمدة بطلبات سياسة مشاركة الموارد المتعددة المصادر (CORS). افتراض أنّ الطلبات الواردة من مصادر متعددة لا تتضمّن سوى عناوين مدرَجة في قائمة الموافقة. إرسال عناوين غير مُدرَجة في قائمة الموافقة من النطاقات ذات المصادر المشتركة، سيسمح للتطبيقات الضارّة التابعة لجهات خارجية بإنشاء عناوين تسيء استخدام معلومات المستخدمين. ملفات تعريف الارتباط التي يخزِّنها Chrome (أو متصفّح آخر) ويرفقها بالطلبات. يمكن للكعكات المصادقة على معاملات الخوادم الضارة التي لم يكن ممكنًا بخلاف ذلك.

إرفاق العناوين المدرَجة في قائمة الموافقة على سياسة مشاركة الموارد المتعددة المصادر (CORS) بطلبات علامات التبويب المخصّصة

علامات التبويب المخصّصة هي طريقة خاصة لإطلاق صفحات الويب في علامة تبويب متصفّح مخصّصة. علامة تبويب مخصصة يمكن إنشاء الأهداف باستخدام CustomTabsIntent.Builder(). يمكنك أيضًا إرفاق رؤوس بهذه الأهداف باستخدام Bundle مع علامة Browser.EXTRA_HEADERS:

CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();

Bundle headers = new Bundle();
headers.putString("bearer-token", "Some token");
headers.putString("redirect-url", "Some redirect url");   
intent.intent.putExtra(Browser.EXTRA_HEADERS, headers);

intent.launchUrl(Activity.this, Uri.parse("http://www.google.com"));

ويمكننا دائمًا إرفاق العناوين المدرَجة في القائمة الموافق عليها بطلبات سياسة مشاركة الموارد المتعددة المصادر (CORS) في علامات التبويب المخصّصة. ومع ذلك، فإنّ فلاتر Chrome العناوين غير الموافق عليها افتراضيًا. وعلى الرغم من أن المتصفحات الأخرى قد يكون لها سلوك مختلف، على المطوّرين توقُّع حظر العناوين التي لم تتم الموافقة عليها بشكل عام.

تتمثل الطريقة المتوافقة لتضمين الرؤوس غير المعتمدة في علامات التبويب المخصصة في التحقق أولاً من اتصال متعدد المصادر باستخدام رابط وصول رقمي. يوضح القسم التالي كيفية تعيين وإطلاق ميزة "النية المخصّصة لعلامات التبويب المخصّصة" (Custom Tabs) باستخدام العناوين المطلوبة

إضافة عناوين إضافية إلى أهداف علامة التبويب المخصّصة

للسماح بتمرير العناوين غير المدرَجة في القائمة عبر عناصر علامة التبويب المخصصة، من الضروري ضبط رابط أصل رقمي بين Android وتطبيق الويب الذي يتأكد من أن المؤلف يمتلك كلا التطبيقين.

اتّبِع الدليل الرسمي لإعداد رابط إلى مواد العرض الرقمية. لاستخدام علاقة الرابط "delegate_permission/common.use_as_origin"" الذي يشير إلى أن كلا التطبيقين ينتميان إلى المصدر بعد التحقق من الرابط.

إنشاء هدف علامة تبويب مخصّصة باستخدام عناوين إضافية

هناك العديد من الطرق لإنشاء النية المخصّصة لعلامات التبويب المخصّصة. يمكنك استخدام أداة الإنشاء المتاحة في androidX عن طريق إضافة المكتبة إلى تبعيات الإصدار:

MULTI_LINE_CODE_PLACEHOLDER_1

بناء النية وإضافة عناوين إضافية:

MULTI_LINE_CODE_PLACEHOLDER_2

يتم استخدام اتصال "علامات التبويب المخصّصة" لإعداد CustomTabsSession بين التطبيق علامة تبويب Chrome. نحتاج إلى هذه الجلسة للتحقّق من أنّ التطبيق وتطبيق الويب ينتميان إلى المصدر نفسه. لا يتم إثبات الهوية إلّا إذا تم إعداد روابط مواد العرض الرقمية بشكلٍ صحيح.

يُنصح بالاتصال بـ CustomTabsClient.warmup(). يسمح لتطبيق المتصفح الإعداد المسبق في الخلفية وتسريع عملية فتح عنوان URL.

MULTI_LINE_CODE_PLACEHOLDER_3

إعداد طلب معاودة الاتصال لتشغيل Intent بعد التحقّق من الصحة

تم إرسال CustomTabsCallback إلى الجلسة. نقوم بإعداد onRelationshipValidationResult() لتشغيل CustomTabsIntent الذي تم إنشاؤه سابقًا بعد نجاح عملية التحقق من المصدر.

MULTI_LINE_CODE_PLACEHOLDER_4

ربط اتصال خدمة علامات التبويب المخصّصة

يؤدي ربط الخدمة إلى تشغيل الخدمة وonCustomTabsServiceConnected() للاتصال. فسيتم طلبه في النهاية. يُرجى تذكُّر إلغاء ربط الخدمة بشكل مناسب. الربط وإلغاء الربط تتم عادةً ضمن طريقتَي النشاط onStart() وonStop().

// Bind the custom tabs service connection.
// Call this in onStart()
CustomTabsClient.bindCustomTabsService(this,
    CustomTabsClient.getPackageName(MainActivity.this, null), connection);

// …
// Unbind the custom tabs service.
// Call this in onStop().
unbindService(connection);

رمز التطبيق التجريبي

يمكنك العثور على مزيد من التفاصيل حول "خدمة علامات التبويب المخصّصة" هنا. يمكنك الاطّلاع على android-browser-helper في مستودع GitHub للحصول على نموذج تطبيق عملي.

ملخّص

أوضح هذا الدليل كيفية إضافة عناوين عشوائية إلى طلبات سياسة مشاركة الموارد المتعددة المصادر (CORS) في علامات التبويب المخصّصة. يمكن إرفاق العناوين المدرَجة في قائمة الموافقة بكل طلبات CORS لعلامات التبويب المخصّصة. العناوين غير التي تمت الموافقة عليها هي تُعتبر هذه المواقع غير آمنة في طلبات سياسة مشاركة الموارد المتعددة المصادر (CORS) ويفلترها Chrome تلقائيًا. إرفاقها لا يُسمح به إلا للعملاء والخوادم من المصدر نفسه، ويتم إثبات صحتها من خلال رابط إلى مواد العرض الرقمية.