يناقش هذا المستند ما هو userVerification
في WebAuthn، وسلوكيات المتصفّح الناتجة عند تحديد userVerification
أثناء إنشاء مفتاح المرور أو المصادقة.
ما المقصود بـ "إثبات هوية المستخدم" في WebAuthn؟
تستند مفاتيح المرور إلى التشفير باستخدام المفتاح العام. من خلال إنشاء مفتاح مرور، يتم إنشاء مفتاحَي تشفير عام وخاص، ويخزِّن مقدّم مفتاح المرور المفتاح الخاص، ويتم إرجاع المفتاح العام إلى خادم الجهة الموثوق بها لتخزينه. يمكن للخادم مصادقة مستخدم من خلال التحقّق من توقيع موقَّع باستخدام مفتاح المرور نفسه باستخدام المفتاح العام المقترن. تثبت علامة "المستخدم حاضر" (UP) في بيانات اعتماد المفتاح العام أنّ أحد المستخدمين تفاعل مع الجهاز أثناء المصادقة.
يُعدّ التحقّق من المستخدم طبقة أمان اختيارية تهدف إلى تأكيد أنّ المستخدم الصحيح كان حاضرًا أثناء المصادقة، وليس أي مستخدم آخر، كما يؤكد ذلك حضور المستخدم. على الهواتف الذكية، يتم ذلك عادةً باستخدام آلية قفل الشاشة، سواء كانت المقاييس الحيوية أو رقم التعريف الشخصي أو كلمة المرور. يتم تسجيل ما إذا تم إجراء عملية إثبات هوية المستخدم في علامة "UV" التي يتم عرضها في بيانات معرّف الهوية أثناء تسجيل مفتاح المرور والمصادقة عليه.
كيفية التحقّق من UP وUV على الخادم
يتم إرسال علامتَي القيمة المنطقية "وجود المستخدم" (UP) و"تم التحقّق من المستخدم" (UV) إلى الخادم في حقل بيانات معتمِد الهوية. أثناء المصادقة، يمكن التحقّق من صحة محتوى حقل بيانات معتمِد الهوية من خلال التحقّق من التوقيع باستخدام المفتاح العام المخزَّن. طالما أنّ التوقيع صالح، يمكن للخادم اعتبار الإشارات حقيقية.
عند تسجيل مفتاح المرور والمصادقة، يجب أن يفحص الخادم ما إذا كان رمز UP هو true
وما إذا كان رمز UV هو true
أو false
، وذلك استنادًا إلى المتطلبات.
تحديد المَعلمة userVerification
وفقًا لمواصفات WebAuthn، يمكن لمسؤول المعالجة طلب إثبات هوية المستخدم باستخدام مَعلمة userVerification
في كلّ من إنشاء بيانات الاعتماد وتأكيدها. يمكن إدخال 'preferred'
أو 'required'
أو 'discouraged'
، ويعني ذلك على التوالي:
'preferred'
(الإعداد التلقائي): يُفضَّل استخدام طريقة إثبات هوية المستخدم على الجهاز، ولكن يمكن تخطّيها إذا لم تكن متاحة. تحتوي بيانات اعتماد الاستجابة على قيمة علامة UVtrue
في حال تم إثبات هوية المستخدم، و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'
.
في حالة 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 لمصادقة المستخدم باستخدام مفتاح المرور.