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

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

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

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

لقطة شاشة لمربّع حوار إثبات هوية المستخدم في "سلسلة مفاتيح iCloud" على نظام التشغيل macOS يطلب مربّع الحوار من المستخدم تسجيل الدخول باستخدام ميزة "رقم تعريف اللمس"، ويعرض المصدر الذي يطلب المصادقة، بالإضافة إلى اسم المستخدم. في أعلى يسار مربّع الحوار، يظهر زرّ بعنوان "إلغاء".
مربّع حوار إثبات هوية المستخدم في 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.

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

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

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

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

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

الخاتمة

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