استراتيجيات لنقل موقعك الإلكتروني من الاعتماد على سلسلة وكيل المستخدم إلى تعديلات برنامج وكيل المستخدم الجديدة
سلسلة وكيل المستخدم هي مساحة مهمة لجمع بصمة إصبع سلبي في المتصفّحات، بالإضافة إلى الصعوبة في معالجتها. ومع ذلك، هناك كل أنواع الأسباب ال válida لجمع بيانات وكيل المستخدم ومعالجتها، لذا ما عليك سوى البحث عن مسار يؤدي إلى حل أفضل. توفّر "ملاحظات العميل عن وكيل المستخدم" طريقة صريحة للإعلان عن حاجتك إلى بيانات وكيل المستخدم وأساليب لعرض البيانات بتنسيق سهل الاستخدام.
سترشدك هذه المقالة إلى عملية تدقيق إمكانية وصولك إلى بيانات وكيل المستخدم و نقل استخدام سلسلة وكيل المستخدم إلى "تعديلات برنامج وكيل المستخدم".
تدقيق جمع بيانات وكيل المستخدم واستخدامها
كما هو الحال مع أي شكل من أشكال جمع البيانات، يجب دائمًا فهم سبب جمعها. تتمثل الخطوة الأولى، بغض النظر عما إذا كنت ستتخذ أي إجراء أم لا، في فهم مكان وسبب استخدامك لبيانات وكيل المستخدم.
إذا لم تكن تعرف ما إذا كان يتم استخدام بيانات وكيل المستخدم أو مكان استخدامها، ننصحك بالبحث في رمز الواجهة الأمامية عن استخدام navigator.userAgent
وفي رمز الواجهة الخلفية عن استخدام عنوان HTTP User-Agent
. عليك أيضًا التحقّق من رمز الواجهة الأمامية
للاستفادة من ميزات تم إيقافها نهائيًا، مثل navigator.platform
وnavigator.appVersion
.
من وجهة نظر وظيفية، ننصحك بالتفكير في أيّ مكان في الرمز البرمجي يتم فيه تسجيل البيانات أو معالجتها:
- اسم المتصفّح أو إصداره
- اسم نظام التشغيل أو إصداره
- العلامة التجارية للجهاز أو طراز الجهاز
- نوع وحدة المعالجة المركزية أو بنيتها أو عدد بتاتها (مثل 64 بت)
من المحتمل أيضًا أن تكون تستخدِم مكتبة أو خدمة تابعة لجهة خارجية لمعالجة وكيل المستخدم. في هذه الحالة، تحقّق ممّا إذا كان يتم تعديلها لتعمل مع ميزة User-Agent Client Hints.
هل تستخدِم بيانات وكيل المستخدم الأساسية فقط؟
تتضمّن المجموعة التلقائية من "تعديلات برنامج وكيل المستخدم" ما يلي:
-
Sec-CH-UA
: اسم المتصفّح والإصدار الرئيسي/الهام Sec-CH-UA-Mobile
: قيمة منطقية تشير إلى جهاز جوّالSec-CH-UA-Platform
: اسم نظام التشغيل- يُرجى العِلم أنّه تم تعديل هذا الإجراء في المواصفات، وسيتم تطبيقه في Chrome والمتصفّحات الأخرى المستندة إلى Chromium قريبًا.
سيحتفظ الإصدار المُقترَح والمُعدَّل من سلسلة وكيل المستخدم أيضًا
بهذه المعلومات الأساسية بطريقة متوافقة مع الإصدارات القديمة. على سبيل المثال، بدلاً من
Chrome/90.0.4430.85
، ستتضمّن السلسلة Chrome/90.0.0.0
.
إذا كنت تتحقّق فقط من سلسلة وكيل المستخدم لمعرفة اسم المتصفّح أو الإصدار الرئيسي أو نظام التشغيل، سيستمر رمزك في العمل على الرغم من أنّه من المحتمل أن تظهر لك تحذيرات بشأن الإيقاف النهائي.
على الرغم من أنّه يمكنك نقل البيانات إلى تعديلات برنامج وكيل المستخدم ويجب عليك ذلك، قد يكون لديك قيود تتعلّق بالرمز البرمجي القديم أو الموارد تمنع ذلك. إنّ تقليل المعلومات في سلاسل وكيل المستخدم بهذه الطريقة المتوافقة مع الإصدارات القديمة يهدف إلى التأكّد من أنّ الرمز البرمجي الحالي سيتلقّى معلومات أقل تفصيلاً، مع الحفاظ على وظائفه الأساسية.
الاستراتيجية: واجهة برمجة تطبيقات JavaScript للعملاء عند الطلب
إذا كنت تستخدِم حاليًا navigator.userAgent
، عليك الانتقال إلى
استخدام navigator.userAgentData
بشكل مفضّل قبل الرجوع إلى تحليل navigator.userAgentData
سلسلة وكيل المستخدم.
if (navigator.userAgentData) {
// use new hints
} else {
// fall back to user-agent string parsing
}
إذا كنت تتحقّق من الأجهزة الجوّالة أو أجهزة الكمبيوتر المكتبي، استخدِم القيمة المنطقية mobile
:
const isMobile = navigator.userAgentData.mobile;
userAgentData.brands
هو صفيف من العناصر التي تحتوي على سمتَي brand
وversion
، ويتيح للمتصفح إدراج توافقه مع تلك
العلامات التجارية. يمكنك الوصول إليه مباشرةً كصفيف أو يمكنك استخدام طلب
some()
للتحقّق مما إذا كان هناك إدخال محدّد:
function isCompatible(item) {
// In real life you most likely have more complex rules here
return ['Chromium', 'Google Chrome', 'NewBrowser'].includes(item.brand);
}
if (navigator.userAgentData.brands.some(isCompatible)) {
// browser reports as compatible
}
إذا كنت بحاجة إلى إحدى قيم وكيل المستخدم الأكثر تفصيلاً وعالية القصور، ستحتاج إلى تحديدها والتحقق من النتيجة في Promise
المعروضة:
navigator.userAgentData.getHighEntropyValues(['model'])
.then(ua => {
// requested hints available as attributes
const model = ua.model
});
يمكنك أيضًا استخدام هذه الاستراتيجية إذا أردت الانتقال من المعالجة من جهة الخادم إلى المعالجة من جهة العميل. لا تتطلّب واجهة برمجة التطبيقات JavaScript الوصول إلى رؤوس طلبات HTTP، لذا يمكن طلب قيم وكيل المستخدم في أي وقت.
الاستراتيجية: عنوان ثابت من جهة الخادم
إذا كنت تستخدِم عنوان الطلب User-Agent
على الخادم وكانت احتياجاتك
لهذه البيانات متسقة نسبيًا على مستوى موقعك الإلكتروني بالكامل، يمكنك
تحديد إشارات العميل المطلوبة كمجموعة ثابتة في ردودك. هذه طريقة
بسيطة نسبيًا لأنّك تحتاج بشكل عام إلى ضبطها في مكان واحد فقط. على سبيل المثال، قد يكون في إعدادات خادم الويب إذا كنت قد أضفت عناوين إليه بالفعل، أو إعدادات الاستضافة، أو إعدادات المستوى الأعلى لإطار العمل أو النظام الأساسي الذي تستخدمه لموقعك.
ننصحك باستخدام هذه الاستراتيجية إذا كنت بصدد تحويل أو تخصيص الردود المعروضة استنادًا إلى بيانات وكيل المستخدم.
قد يختار المتصفّحات أو العملاء الآخرون تقديم إشارات تلقائية مختلفة، لذا من الجيد تحديد كل ما تحتاجه، حتى إذا كان يتم تقديمه بشكل عام تلقائيًا.
على سبيل المثال، سيتم تمثيل الإعدادات التلقائية الحالية في Chrome على النحو التالي:
⬇️ عناوين الاستجابة
Accept-CH: Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-CH-UA
إذا أردت أيضًا تلقّي طراز الجهاز في الردود، عليك إرسال ما يلي:
⬇️ عناوين الاستجابة
Accept-CH: Sec-CH-UA-Mobile, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA
عند معالجة هذه العملية من جهة الخادم، عليك التأكّد أولاً مما إذا تم إرسال عنوان Sec-CH-UA
المطلوب، ثم الرجوع إلى تحليل عنوان User-Agent
إذا لم يكن متاحًا.
الاستراتيجية: تفويض التلميح إلى طلبات المصادر الخارجية
إذا كنت تطلب موارد فرعية من مصادر متعددة أو مواقع إلكترونية متعددة تتطلّب إرسال تعديلات برنامج وكيل المستخدم في طلباتك، عليك تحديد تعديلات العميل المطلوبة صراحةً باستخدام سياسة أذونات.
على سبيل المثال، لنفترض أنّ https://blog.site
يستضيف موارد على
https://cdn.site
يمكنها عرض موارد محسّنة لجهاز معيّن.
يمكن لـ https://blog.site
طلب تلميح Sec-CH-UA-Model
، ولكن يجب أن يفوّضه بوضوح إلى https://cdn.site
باستخدام العنوان Permissions-Policy
. تتوفر قائمة بالتلميحات التي تتحكم فيها السياسة في مسودة
البنية الأساسية لتلميحات العملاء.
⬇️ ردّ من "blog.site
" يفوّض التلميح
Accept-CH: Sec-CH-UA-Model
Permissions-Policy: ch-ua-model=(self "https://cdn.site")
⬆️ يجب أن يتضمّن طلب الموارد الفرعية على cdn.site
التلميح المفوَّض.
Sec-CH-UA-Model: "Pixel 5"
يمكنك تحديد إشارات متعددة لمصادر متعددة، وليس فقط من نطاق ch-ua
:
⬇️ ردّ من "blog.site
" بشأن تفويض عدة تلميحات إلى مصادر متعدّدة
Accept-CH: Sec-CH-UA-Model, DPR
Permissions-Policy: ch-ua-model=(self "https://cdn.site"),
ch-dpr=(self "https://cdn.site" "https://img.site")
الاستراتيجية: تفويض التلميح إلى إطارات iframe
تعمل إطارات iframe من مصادر متعددة بالطريقة نفسها التي تعمل بها الموارد من مصادر متعددة، ولكن عليك تحديد التلميحات التي تريد تفويضها في سمة allow
.
⬇️ رد من "blog.site
"
Accept-CH: Sec-CH-UA-Model
↪️ تنسيق HTML لـ blog.site
<iframe src="https://widget.site" allow="ch-ua-model"></iframe>
⬆️ إرسال طلب إلى widget.site
Sec-CH-UA-Model: "Pixel 5"
ستلغي سمة allow
في إطار iframe أي عنوان Accept-CH
قد ترسلهwidget.site
بنفسها، لذا تأكّد من تحديد كل ما يحتاجه الموقع الإلكتروني الذي يضمّwidget.site
إطار iframe.
الاستراتيجية: تعديلات ديناميكية من جهة الخادم
إذا كانت لديك أجزاء معيّنة من رحلة المستخدِم تحتاج فيها إلى مجموعة أكبر من التلميحات مقارنةً ببقية أجزاء الموقع الإلكتروني، يمكنك اختيار طلب هذه التلميحات عند الطلب بدلاً من عرضها بشكل ثابت في جميع أنحاء الموقع الإلكتروني. إن إدارة هذا أكثر تعقيدًا، ولكن إذا قمت بالفعل بتعيين رؤوس مختلفة على أساس كل مسار، فقد يكون ذلك ممكنًا.
من المهم تذكُّر أنّ كلّ نسخة من Accept-CH
العنوان ستؤدّي إلى إلغاء المجموعة الحالية. لذلك، إذا كنت تضبط العنوان بشكل ديناميكي، حينئذٍ يجب أن تطلب كل صفحة المجموعة الكاملة من التلميحات المطلوبة.
على سبيل المثال، قد يكون لديك قسم واحد على موقعك الإلكتروني تريد فيه توفير
رموز عناصر تحكّم تتطابق مع نظام التشغيل لدى المستخدم. لهذا الغرض، قد تحتاج إلى
جلب Sec-CH-UA-Platform-Version
أيضًا لعرض موارد فرعية
مناسبة.
⬇️ عناوين الاستجابة لـ /blog
Accept-CH: Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-CH-UA
⬇️ عناوين الاستجابة لـ /app
Accept-CH: Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version, Sec-CH-UA
الاستراتيجية: يجب تقديم إشارات من جهة الخادم عند أول طلب
قد تكون هناك حالات تحتاج فيها إلى أكثر من مجموعة التلميحات التلقائية في الطلب الأول، ولكن هذا أمر نادر الحدوث، لذا تأكَّد من مراجعة الأسباب.
ويشير الطلب الأول إلى أول طلب من المستوى الأعلى تم إرساله في جلسة التصفّح هذه لجهة المصدر هذه. تتضمّن المجموعة التلقائية من التلميحات اسم المتصفّح مع الإصدار الرئيسي والنظام الأساسي ومؤشر الأجهزة الجوّالة. لذا، السؤال الذي ينبغي طرحه هو: هل تحتاج إلى بيانات موسّعة عند تحميل الصفحة لأول مرة؟
للحصول على نصائح إضافية حول الطلب الأول، هناك خياران. أولاً، يمكنك
الاستفادة من العنوان Critical-CH
. ويكون ذلك بالتنسيق نفسه المُستخدَم في Accept-CH
، إلا أنّه يخبر المتصفّح بأنّه يجب على الفور إعادة محاولة الطلب إذا تم إرسال الطلب الأول بدون التلميح المهم.
⬆️ الطلب الأوّلي
[With default headers]
⬇️ عناوين الاستجابة
Accept-CH: Sec-CH-UA-Model
Critical-CH: Sec-CH-UA-Model
🔃 يعيد المتصفّح محاولة إرسال الطلب الأوّلي باستخدام العنوان الإضافي.
[With default headers + …]
Sec-CH-UA-Model: Pixel 5
سيؤدي ذلك إلى تحمّل النفقات العامة لإعادة المحاولة في الطلب الأول، ولكن تكلفة التنفيذ منخفضة نسبيًا. أرسل العنوان الإضافي وسينفذ المتصفح باقي الخطوات.
في الحالات التي تحتاج فيها إلى الحصول على إشارات إضافية عند تحميل الصفحة لأول مرة، يوضّح اقتراح "موثوقية إشارات العميل" مسارًا لتحديد الإشارات في الإعدادات على مستوى الاتصال. والهدف من ذلك هو الاستفادة من إضافة إعدادات بروتوكول طبقة التطبيق (ALPS) إلى بروتوكول أمان طبقة النقل (TLS) 1.3 لتفعيل هذه التلميحات الأولية حول اتصالات HTTP/2 وHTTP/3. لا يزال هذا الإجراء في مرحلة مبكرة جدًا، ولكن إذا كنت تدير بشكل نشط إعدادات بروتوكول أمان طبقة النقل (TLS) و إعدادات الاتصال، هذا هو الوقت المثالي للمساهمة.
الاستراتيجية: دعم الإصدارات القديمة
قد يكون لديك رمز قديم أو تابع لجهة خارجية على موقعك الإلكتروني يعتمد على
navigator.userAgent
، بما في ذلك أجزاء من سلسلة وكيل المستخدم التي سيتم
تقليلها. على المدى الطويل، عليك التخطيط للانتقال إلى المكالمات المكافئ
navigator.userAgentData
، ولكن هناك حلّ مؤقت.
الملء التلقائي UA-CH عبارة عن مكتبة صغيرة تتيح لك استبدال navigator.userAgent
بسلسلة جديدة تم إنشاؤها من قيم navigator.userAgentData
المطلوبة.
على سبيل المثال، ستُنشئ هذه التعليمة البرمجية سلسلة وكيل مستخدم تتضمن أيضًا تلميح "model":
import { overrideUserAgentUsingClientHints } from './uach-retrofill.js';
overrideUserAgentUsingClientHints(['model'])
.then(() => { console.log(navigator.userAgent); });
ستعرض السلسلة الناتجة نموذج Pixel 5
، ولكن سيظلّ 92.0.0.0
المُعدَّل معروضًا لأنّه لم يتم طلب التلميح uaFullVersion
:
Mozilla/5.0 (Linux; Android 10.0; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.0.0 Mobile Safari/537.36
مزيد من الدعم
إذا لم تغطّ هذه الاستراتيجيات حالة الاستخدام الخاصة بك، يُرجى بدء مناقشة في ملف GitHub الخاص بمجموعة تطوير دعم "الصندوق الرمزي للخصوصية" لنتمكّن من استكشاف مشكلتك معًا.
صورة من تصوير ريكاردو روخا على Unsplash