نظرة معمّقة على عملية "إثبات هوية المستخدم"

يناقش هذا المستند ما هو userVerification في WebAuthn، وسلوكيات المتصفّح الناتجة عند تحديد userVerification أثناء إنشاء مفتاح المرور أو المصادقة.

ما معنى "التحقّق من المستخدم" في WebAuthn؟

تستند مفاتيح المرور إلى التشفير باستخدام المفتاح العام. عند إنشاء مفتاح مرور، يتم إنشاء مفتاحَي تشفير أحدهما عام والآخر خاص، ويخزّن موفّر مفاتيح المرور المفتاح الخاص، ثم يتم إرجاع المفتاح العام إلى خادم الجهة المعتمدة (RP) لتخزينه. يمكن للخادم مصادقة مستخدم من خلال التحقق من توقيع موقَّع باستخدام مفتاح المرور نفسه باستخدام المفتاح العام المقترن. تثبت علامة "المستخدم حاضر" (UP) في بيانات اعتماد المفتاح العام أنّ أحد المستخدمين تفاعل مع الجهاز أثناء المصادقة.

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

لقطة شاشة لمربّع حوار إثبات هوية المستخدم في "سلسلة مفاتيح iCloud" على نظام التشغيل macOS يطلب مربع الحوار من المستخدم تسجيل الدخول باستخدام ميزة Touch ID، ويعرض المصدر الذي يطلب المصادقة، بالإضافة إلى اسم المستخدم. في أعلى يسار مربّع الحوار، يظهر زرّ بعنوان "إلغاء".
مربّع حوار إثبات هوية المستخدم في iCloud Keychain على نظام التشغيل macOS
لقطة شاشة لمربّع حوار إثبات ملكية حساب المستخدم على Chrome لأجهزة Android يطلب مربع الحوار من المستخدم إثبات هويته باستخدام ميزة التعرُّف على الوجوه أو رصد بصمة الإصبع، ويعرض المصدر الذي يطلب المصادقة. يتوفّر في أسفل يمين الصفحة خيار إثبات الملكية باستخدام رقم التعريف الشخصي.
مربّع حوار إثبات هوية المستخدم على متصفّح Chrome لأجهزة Android

كيفية التحقّق من UP وUV على الخادم

يتم إرسال علامتَي القيمة المنطقية "وجود المستخدم" (UP) و"تم التحقّق من المستخدم" (UV) إلى الخادم في حقل بيانات معتمِد الهوية. أثناء المصادقة، يمكن التحقق من محتوى حقل بيانات برنامج المصادقة عن طريق التحقق من التوقيع باستخدام المفتاح العام المخزن. طالما أنّ التوقيع صالح، يمكن للخادم اعتبار الإشارات حقيقية.

صورة توضيحية لهيكل بيانات المصادقة من اليمين إلى اليسار، يعرض كل قسم من بنية البيانات "RP ID HASH" (32 بايت)، و"FLAGS" (بايت واحد)، و"COUNTER" (4 بايت، uint32 بترتيب كبار السن)، و"ATTESTE CRED. DATA (طول متغيّر في حال توفّره) و"EXTENSIONS" (طول متغيّر في حال توفّره (CBOR)). يتم توسيع قسم FLAGS لعرض قائمة بالعلامات المحتملة، والتي يتم تصنيفها من اليسار إلى اليمين: 'ED' و'AT' و'0' و'BS' و'BE' و'UV' و'0' و'UP'.
حقول بيانات Authenticator في بيانات اعتماد مفتاح عام.

عند تسجيل مفتاح المرور والمصادقة، يجب أن يفحص الخادم ما إذا كان رمز UP هو true وما إذا كان رمز UV هو true أو false، استنادًا إلى المتطلبات.

تحديد المَعلمة userVerification

وفقًا لمواصفات WebAuthn، يمكن للجهة المحظورة أن تطلب إثبات هوية المستخدم باستخدام مَعلمة userVerification في كل من إنشاء بيانات الاعتماد وتأكيدها. يمكن إدخال 'preferred' أو 'required' أو 'discouraged'، ويعني ذلك على التوالي:

  • 'preferred' (تلقائي): يُفضَّل استخدام طريقة للتحقق من المستخدم على الجهاز، ولكن يمكن تخطّيها في حال عدم توفّرها. تحتوي بيانات اعتماد الاستجابة على قيمة علامة UV‏ true في حال تم إثبات هوية المستخدم، وfalse في حال عدم إثبات هويته.
  • 'required': يجب استخدام طريقة إثبات هوية المستخدم المتاحة على الجهاز. وإذا لم تتوفّر أي بيانات، سيتعذّر تنفيذ الطلب على الجهاز. وهذا يعني أنّ بيانات اعتماد الاستجابة يتم عرضها دائمًا مع ضبط علامة UV على true.
  • 'discouraged': لا يُنصح باستخدام طريقة إثبات ملكية المستخدم. ومع ذلك، قد يتم إثبات هوية المستخدم على أي حال، وذلك استنادًا إلى الجهاز، ويمكن أن يحتوي علامة UV على true أو false.

نموذج رمز لإنشاء مفتاح مرور:

const publicKeyCredentialCreationOptions = {
  // ...
  authenticatorSelection: {
    authenticatorAttachment: 'platform',
    residentKey: 'required',
    requireResidentKey: true,
    userVerification: 'preferred'
  }
};

const credential = await navigator.credentials.create({
  publicKey: publicKeyCredentialCreationOptions
});

نموذج رمز مصادقة مفتاح المرور:

const publicKeyCredentialRequestOptions = {
  challenge: /* Omitted challenge data... */,
  rpId: 'example.com',
  userVerification: 'preferred'
};

const credential = await navigator.credentials.get({
  publicKey: publicKeyCredentialRequestOptions
});

ما هو الخيار الذي يجب اختياره لـ userVerification؟

تعتمد قيمة userVerification التي عليك استخدامها على متطلبات التطبيق، بالإضافة إلى متطلبات تجربة المستخدم.

حالات استخدام userVerification='preferred'

استخدِم userVerification='preferred' إذا كنت تعطي الأولوية لتجربة المستخدم على الحماية.

هناك بيئات يكون فيها إثبات هوية المستخدمين أكثر إزعاجًا من الحماية. على سبيل المثال، في نظام التشغيل macOS حيث لا تتوفّر ميزة Touch ID (لأنّ الجهاز لا يتيح استخدامها أو لأنّها غير مفعّلة أو لأنّ الجهاز في وضع "الاستلقاء")، يُطلب من المستخدم إدخال كلمة مرور النظام بدلاً من ذلك. ويؤدي ذلك إلى حدوث مشاكل، وقد يتخلّى المستخدم عن المصادقة تمامًا. وإذا كان التخلّص من المعوقات أكثر أهمية بالنسبة إليك، يمكنك استخدام userVerification='preferred'.

لقطة شاشة لمربّع حوار مفتاح المرور على نظام التشغيل macOS الذي يظهر عندما لا يكون Touch ID متاحًا يحتوي مربّع الحوار على معلومات مثل المصدر الذي يطلب المصادقة، بالإضافة إلى اسم المستخدم. في أعلى يسار مربّع الحوار، يظهر زرّ بعنوان "إلغاء".
مربّع حوار مفتاح المرور الذي يظهر على نظام التشغيل macOS عندما لا تكون ميزة Touch ID متاحة

في حالة userVerification='preferred'، يكون رمز UV هو true إذا تم إثبات هوية المستخدم بنجاح، وfalse إذا تم تخطّي عملية إثبات هوية المستخدم. على سبيل المثال، في نظام التشغيل macOS حيث لا تتوفّر ميزة Touch ID، يُطلب من المستخدم النقر على زر لتخطّي عملية إثبات هوية المستخدم، وتشمل بيانات اعتماد المفتاح العام علامة false UV.

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

حالات استخدام "userVerification='required'"

استخدِم userVerification='required' إذا كنت تعتقد أنّ كلاً من UP وUV ضروريان تمامًا.

ومن الجوانب السلبية لهذا الخيار أن المستخدم قد يواجه المزيد من الصعوبات عند تسجيل الدخول. على سبيل المثال، في نظام التشغيل macOS حيث لا تتوفّر تقنية Touch ID، يُطلب من المستخدم إدخال كلمة مرور النظام.

باستخدام userVerification='required'، يمكنك التأكّد من أنّه يتم إثبات هوية المستخدم على الجهاز. تأكَّد من أنّ الخادم يتحقّق من أنّ علامة UV هي true.

الخاتمة

من خلال الاستفادة من ميزة إثبات هوية المستخدم، يمكن للجهات التي تعتمد على مفاتيح المرور تقييم احتمالية تسجيل دخول مالك الجهاز. ويعود للتطبيق اختيار ما إذا كان سيطلب من المستخدم إثبات هويته أو سيجعل ذلك اختياريًا، وذلك استنادًا إلى مدى أهمية آلية تسجيل الدخول الاحتياطية في مسار المستخدِم. تأكَّد من أنّ الخادم يتحقّق من علامة UP وعلامة UV لمصادقة المستخدم باستخدام مفتاح المرور.