نظرة معمقة على الوساطة الفورية في WebAuthn. نستكشف كيف تنشئ زر تسجيل دخول موحد، وتتجنب رموز QR المربكة، وتبني تدفق تسجيل دخول أكثر ذكاءً.
Vincent
Created: August 8, 2025
Updated: August 13, 2025
See the original blog version in English here.
60-page Enterprise Passkey Whitepaper:
Learn how leaders get +80% passkey adoption. Trusted by Rakuten, Klarna & Oracle
يخلق الانتقال إلى مفاتيح المرور ما يسمى بـ "مفارقة مفاتيح المرور": بعض المستخدمين لديهم مفاتيح مرور، بينما لا يزال الكثيرون يستخدمون كلمات المرور التقليدية. يؤدي هذا إلى شاشات تسجيل دخول مزدحمة بأزرار متعددة: "تسجيل الدخول بكلمة المرور"، "تسجيل الدخول بحساب Google"، و"تسجيل الدخول بمفتاح المرور". يسبب هذا التجزؤ احتكاكًا في تجربة المستخدم. قد ينقر المستخدم على "تسجيل الدخول بمفتاح المرور" على جهاز جديد ليواجه مطالبة مربكة بـ رمز QR لأن مفتاح المرور الخاص به غير متوفر محليًا. المشكلة الأساسية هي عدم قدرة الموقع على معرفة سياق المستخدم قبل بدء تدفق المصادقة.
أحد الحلول هو البدء بالمعرّف أولاً وتحديد أفضل طريقة تسجيل دخول للمستخدم. حل آخر محتمل هو زر "تسجيل الدخول" واحد وذكي ينسق التدفق الأكثر سلاسة لكل مستخدم. يجب أن يطالب مباشرة بمفتاح مرور إذا كان متاحًا على الجهاز، أو يعود بسلاسة إلى طرق أخرى إذا لم يكن كذلك.
تم الإعلان عن ميزة جديدة في WebAuthn يمكن أن تجعل هذا ممكنًا: الوساطة الفورية
(mediation: 'immediate'
). من خلال تعيين هذه الخاصية في استدعاء واجهة برمجة تطبيقات
WebAuthn، يمكن للمطورين بناء تجربة تسجيل دخول ذكية وموحدة تحل مفارقة مفاتيح المرور. يقدم
هذا المقال تحليلاً موجهاً للمطورين حول mediation: 'immediate'
، مستكشفًا ماهيتها، وكيف
تعمل، وكيفية تطبيقها.
Recent Articles
لفهم الوساطة الفورية، من المفيد أولاً معرفة الخيارات الأخرى. وساطة المستخدم في WebAuthn هي الطريقة التي يدير بها المتصفح التفاعل بين موقعك (الطرف المعتمد) وأداة المصادقة الخاصة بالمستخدم (مثل Face ID أو YubiKey).
هذا هو تدفق WebAuthn الكلاسيكي والصريح. عندما يستدعي
الطرف المعتمد navigator.credentials.get()
دون تحديد تفضيل
mediation
، يعرض المتصفح دائمًا مربع حوار نموذجي. يغطي مربع الحوار هذا محتوى الصفحة،
ويتطلب انتباه المستخدم الفوري ويوقف كل التفاعلات الأخرى مع الموقع.
mediation: 'conditional'
#تم تقديم هذا الوضع للمساعدة في
انتقال المستخدمين إلى مفاتيح المرور،
وهو أكثر دقة. مع mediation: 'conditional'
، يتم إرفاق طلب WebAuthn بحقل إدخال (مثل اسم
المستخدم) مع السمة autocomplete="webauthn"
. عندما ينقر المستخدم على الحقل، تقترح واجهة
المستخدم للإكمال التلقائي في المتصفح أي مفاتيح مرور متاحة.
mediation: 'immediate'
هي الحل لمشكلة "زر تسجيل الدخول الموحد". إنها توفر طريقة موثوقة
للموقع للتحقق من توفر مفتاح المرور قبل عرض أي واجهة مستخدم.
بدلاً من إخبار المستخدم بالمصادقة باستخدام مفتاح مرور عبر نافذة نموذجية، تسأل الوساطة
immediate
المتصفح: "هل هناك مفتاح مرور متاح بسهولة لهذا المستخدم على هذا الجهاز الآن؟"
بشكل حاسم، يتحقق هذا الاستعلام فقط من بيانات الاعتماد المتاحة محليًا (مثل أدوات المصادقة المدمجة في الجهاز مثل Windows Hello أو مفاتيح المرور المتزامنة عبر مدير كلمات المرور). تم تصميمه لـ تجنب تشغيل تدفق رمز QR عبر الأجهزة، والذي يعد نقطة احتكاك شائعة.
تكمن قوة هذه الميزة في نتيجتها الثنائية الواضحة. الوعد الذي يعيده
navigator.credentials.get()
إما سينجح أو يفشل، مما يمنح المطور إشارة واضحة.
PublicKeyCredential
.navigator.credentials.get()
فورًا مع DOMException
باسم NotAllowedError
.الخطأ NotAllowedError
ليس خللاً برمجيًا، بل هو أشبه بميزة. إنه إشارة موثوقة وفورية بأنه
يجب على الموقع المتابعة بطريقة مصادقة بديلة. يسمح هذا للمطورين باستخدام كتلة try...catch
بسيطة: تحاول كتلة try
تدفق مفتاح المرور السلس، وتستمع كتلة catch
إلى NotAllowedError
لعرض نموذج تسجيل دخول تقليدي. إنها تحل بأناقة مشكلة زر تسجيل الدخول الموحد عن طريق إنشاء
نقطة دخول واحدة تتكيف بذكاء مع سياق المستخدم.
يعد اختيار وضع الوساطة الصحيح قرارًا حاسمًا في تجربة المستخدم. يقدم هذا الجدول مقارنة جنبًا إلى جنب.
الميزة / السلوك | الوساطة النموذجية (الافتراضي) | واجهة المستخدم الشرطية (conditional ) | الوساطة الفورية (immediate ) |
---|---|---|---|
استدعاء API | navigator.credentials.get() | navigator.credentials.get({ mediation: 'conditional' }) | navigator.credentials.get({ mediation: 'immediate' }) |
المُشغِّل | إجراء صريح من المستخدم (مثل النقر على زر) | تحميل الصفحة؛ واجهة المستخدم عند التركيز على حقل الإدخال | إجراء صريح من المستخدم (مثل النقر على زر) |
عرض واجهة المستخدم | دائمًا تعرض مربع حوار نموذجي على الفور. | تعرض واجهة مستخدم غير نموذجية بأسلوب الإكمال التلقائي. | فقط إذا تم العثور على بيانات اعتماد محلية، ثم تعرض مربع حوار نموذجي. |
السلوك في حالة عدم وجود بيانات اعتماد محلية | تعرض واجهة مستخدم للتدفقات عبر الأجهزة (مثل رمز QR). | يبقى الوعد معلقًا، ولا يتم حله أبدًا، ولا يتم طرح أي خطأ. | يتم رفض الوعد فورًا مع NotAllowedError . |
معرفة الموقع | لا يتعلم شيئًا حتى يكمل المستخدم التدفق. | لا يتعلم شيئًا إذا لم يتفاعل المستخدم. أعلى مستوى من الخصوصية. | يتعلم معلومة واحدة: ما إذا كانت هناك بيانات اعتماد محلية. |
حالة الاستخدام الأساسية | زر "تسجيل الدخول بمفتاح المرور" المخصص. مصادقة ثنائية صريحة. | نماذج تسجيل الدخول/الاشتراك الموحدة. تحسين نماذج كلمات المرور تدريجيًا. | زر "تسجيل الدخول" أساسي وموحد لقاعدة مستخدمين مختلطة. |
إجراء المطور | التعامل مع النجاح أو إلغاء المستخدم. | التعامل مع النجاح. لا توجد إشارة فشل للتصرف بناءً عليها. | التعامل مع النجاح أو NotAllowedError لتشغيل واجهة مستخدم بديلة. |
إليك دليل عملي خطوة بخطوة لتطبيق mediation: 'immediate'
.
نظرًا لأن mediation: 'immediate'
ميزة جديدة، فإن اكتشاف الميزة القوي أمر بالغ الأهمية.
// اكتشاف الميزة ضروري للتحسين التدريجي. let immediateMediationAvailable = false; if (window.PublicKeyCredential && PublicKeyCredential.getClientCapabilities) { try { const capabilities = await PublicKeyCredential.getClientCapabilities(); // تشير قدرة 'immediateGet' إلى دعم المتصفح. immediateMediationAvailable = capabilities.immediateGet === true; } catch (e) { console.error("Error getting client capabilities:", e); } }
navigator.credentials.get()
#يجب تشغيل هذا الاستدعاء بواسطة إيماءة مستخدم، مثل النقر على زر.
// يجب أن تكون هذه الدالة هي معالج الحدث لزر "تسجيل الدخول" الأساسي. async function handleSignInClick() { if (!immediateMediationAvailable) { // العودة إلى عرض نموذج تسجيل الدخول التقليدي إذا كانت الميزة غير مدعومة. showLegacyLoginForm(); return; } try { // جلب تحدٍ جديد وعشوائي من خادمك لكل محاولة. const challenge = await fetchChallengeFromServer(); const publicKeyCredentialRequestOptions = { challenge: challenge, // التحدي المقدم من الخادم بصيغة Uint8Array rpId: "example.com", // يجب أن تكون قائمة allowCredentials فارغة للوساطة الفورية // لحماية خصوصية المستخدم. allowCredentials: [], }; const credential = await navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions, // هذا هو المفتاح الذي يمكّن تدفق الوساطة الفورية. mediation: "immediate", }); // إذا تم حل الوعد، أرسل بيانات الاعتماد إلى خادمك للتحقق منها. await verifyCredentialOnServer(credential); } catch (error) { // كتلة catch هي جزء حاسم من تدفق التحكم. handleAuthError(error); } }
NotAllowedError
للرجوع السلس#كتلة catch
هي المكان الذي يتحقق فيه "ذكاء" زر تسجيل الدخول الموحد.
// التعامل مع NotAllowedError هو مفتاح آلية الرجوع. function handleAuthError(error) { // تحقق من خاصية 'name' في DOMException. if (error.name === "NotAllowedError") { // هذه هي الإشارة المتوقعة لإظهار نموذج تسجيل الدخول التقليدي. console.log("No local passkey found. Showing legacy login form."); showLegacyLoginForm(); } else { // هذا يعالج الأخطاء المحتملة الأخرى، مثل رفض المستخدم للمطالبة. console.error("Authentication error:", error); } }
للحصول على تجربة أكثر سلاسة، يمكنك أن تطلب من المتصفح البحث عن كل من مفاتيح المرور وكلمات
المرور المحفوظة في نفس الطلب عن طريق إضافة password: true
.
// دمج مفاتيح المرور وكلمات المرور لتجربة تسجيل دخول موحدة حقًا. const credential = await navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions, password: true, // اطلب من المتصفح تضمين كلمات المرور المحفوظة. mediation: "immediate", }); // سيكون كائن 'credential' المُرجع إما PublicKeyCredential // أو PasswordCredential. يجب أن يتعامل منطق الخادم لديك مع كليهما.
conditional
معلق (غالبًا ما يبدأ عند تحميل
الصفحة) أن يمنع طلب immediate
جديد. فكر في استخدام AbortController
لإلغاء أي طلبات
معلقة قبل بدء طلب جديد.allowCredentials
: يجب أن تكون مصفوفة allowCredentials
فارغة. سيؤدي
توفير معرفات بيانات الاعتماد إلى فشل الاستدعاء. هذا إجراء وقائي حاسم للخصوصية لمنع
المواقع من التحقق من وجود مستخدمين محددين ومعروفين.تم تصميم mediation: 'immediate'
مع فهم واضح لمقايضات الأمان والخصوصية الخاصة بها.
المقايضة الأساسية هي "تسريب بت واحد". من خلال توقيت حل الوعد، يمكن لـ الطرف المعتمد استنتاج معلومة واحدة: ما إذا كان الوعد قد تم رفضه على الفور (لا توجد بيانات اعتماد محلية) أو تم تأخيره (تم عرض مطالبة واجهة المستخدم لأنه تم العثور على بيانات اعتماد محلية). الغرض من هذا التسريب هو تمكين تجربة مستخدم أفضل.
توقع المصممون إمكانية إساءة الاستخدام (مثل تتبع المستخدم) وقاموا ببناء العديد من الضمانات غير القابلة للتفاوض:
allowCredentials
محظورة: يجب أن تكون مصفوفة allowCredentials
فارغة. هذا
يمنع الموقع من استخدام هذه الميزة للتحقق مما إذا كان مستخدم معين معروف يزور الموقع.iframe
من
أصل آخر) لمنع التتبع عبر المواقع.تضمن هذه الإجراءات التخفيفية أن ضمانات الأمان الأساسية لـ WebAuthn تظل كما هي. تظل عملية المصادقة نفسها دون تغيير ومقاومة لـ التصيد الاحتيالي.
mediation: 'immediate'
هي ميزة متقدمة من
مواصفات WebAuthn المستوى 3، وإطلاقها مستمر. اعتبارًا من
منتصف عام 2025، تعد استراتيجية التحسين التدريجي ضرورية.
المتصفح | الحالة | ملاحظات والمصدر |
---|---|---|
Chrome | تجربة للمطورين | متاح عبر علامة experimental-web-platform-features . تتبع المشكلة. |
Edge | قيد التطوير (متوقع) | كمتصفح قائم على Chromium، يجب أن يتبع الدعم متصفح Chrome. |
Safari (WebKit) | قيد الدراسة | مواقف معايير WebKit. لا يوجد التزام علني. |
Firefox (Gecko) | قيد الدراسة | مواقف معايير Mozilla. لا يوجد التزام علني. |
بينما توفر mediation: 'immediate'
أداة رائعة ومنخفضة المستوى لزر تسجيل دخول أكثر ذكاءً،
من المهم تمييزها عن حل أوسع لـ
"Passkey Intelligence"،
مثل الذي تقدمه Corbado. كلاهما يهدف إلى حل مفارقة مفاتيح المرور وزيادة التبني، لكنهما
يفعلان ذلك بطرق مختلفة.
الميزة | mediation: 'immediate' | Passkey Intelligence (مثل Corbado) |
---|---|---|
كيف تعمل | استدعاء API أصلي للمتصفح يتحقق من مفاتيح المرور المتاحة محليًا على الجهاز الحالي. | خدمة خلفية تجمع وتحلل البيانات حول أجهزة المستخدمين وأدوات المصادقة وسجل تسجيل الدخول عبر الجلسات. |
الإشارة المقدمة | إشارة ثنائية بسيطة: إما يوجد مفتاح مرور محلي (مطالبة واجهة المستخدم ) أو لا يوجد (NotAllowedError ). | رؤى سياقية غنية، على سبيل المثال، "لقد سجل هذا المستخدم الدخول للتو بكلمة مرور على جهاز قادر على استخدام مفاتيح المرور يستخدمه كثيرًا." |
الميزة الرئيسية | فحص أصلي وسريع جدًا مع الحد الأدنى من الحمل على الشبكة. | توفر عالمي، مستقل عن دعم المتصفح/نظام التشغيل لميزات WebAuthn الجديدة. رؤى أعمق لتجربة مستخدم أكثر تخصيصًا. |
الاعتماد الرئيسي | يتطلب دعمًا محدثًا للمتصفح ونظام التشغيل، وهو ليس عالميًا بعد. | التكامل مع خدمة خلفية. |
Passkey Intelligence يذهب خطوة أبعد من خلال جمع وتقييم البيانات بمرور الوقت. يسمح هذا بتدخلات أكثر تطورًا وفي الوقت المناسب للمستخدم. على سبيل المثال، يمكن لـ Passkey Intelligence الخلفي اكتشاف:
هذا النهج القائم على البيانات مستقل عن دعم المتصفح لـ mediation: 'immediate'
، مما يعني
أنه يمكن أن يوفر تدفق تسجيل دخول أكثر ذكاءً لجميع المستخدمين، الآن.
أفضل ما في العالمين
في النهاية، هذان النهجان ليسا متعارضين؛ بل هما متكاملان. الحل المثالي يجمعهما:
mediation: 'immediate'
كإحدى إشاراتها على المتصفحات
المدعومة لإجراء فحص أولي سريع.من خلال الجمع بين السرعة الأصلية لـ mediation: 'immediate'
والرؤى العميقة لـ
Passkey Intelligence
الخلفي، يمكنك توفير تجربة تسجيل الدخول الأكثر سلاسة وتكيفًا وفعالية ممكنة، وتوجيه كل
مستخدم بلطف نحو مستقبل بدون كلمات مرور.
تعد الوساطة الفورية ترقية رائعة لتجربة تسجيل الدخول. إنها توفر الذكاء اللازم لإزالة نقاط الاحتكاك والارتباك الشائعة للمستخدمين أثناء الانتقال إلى مفاتيح المرور.
immediate
العبء المعرفي عن المستخدم. لم يعد عليهم تذكر طريقة المصادقة التي أعدوها أو
الاختيار من قائمة خيارات مزدحمة. تصبح عملية تسجيل الدخول أبسط وأكثر سهولة.mediation: 'immediate'
تبحث
فقط عن بيانات الاعتماد المحلية، فإنها تتجنب هذه الحالة المربكة تمامًا. بدلاً من أن يتخلى
المستخدم عن التدفق، يتلقى التطبيق إشارة واضحة (NotAllowedError
) للرجوع بسلاسة إلى
طريقة أخرى، مما يؤدي إلى رحلة أكثر سلاسة.الوساطة الفورية هي ميزة جديدة في WebAuthn تحل مشكلة تجربة تسجيل الدخول المجزأة خلال فترة الانتقال إلى مفاتيح المرور. إنها تمكن من إنشاء زر "تسجيل الدخول" واحد وذكي يتكيف مع سياق المستخدم، مما يزيل الارتباك والاحتكاك. في حين أنها تقدم مقايضة خصوصية محسوبة، إلا أنها تتضمن ضمانات قوية للتخفيف من المخاطر دون المساس بالأمان الأساسي لـ WebAuthn.
بالنسبة للمطورين، فإن المسار إلى الأمام هو التحسين التدريجي. قم ببناء تجربة أساسية قوية،
وأضف وساطة immediate
فوقها للمتصفحات المدعومة. يعد تبني هذه الميزة خطوة استراتيجية
لتسريع تبني مفاتيح المرور، وتعزيز الأمان، وخفض
التكاليف التشغيلية، وتحسين التحويل.
يمكن أن يكون تنفيذ تدفقات المصادقة المتقدمة هذه معقدًا. منصة Corbado لمفاتيح المرور
للمؤسسات تتكفل بهذا التعقيد. تتعامل
بنيتنا التحتية مع تنسيق التدفق الأمثل - بما في
ذلك الوساطة الشرطية وimmediate
مما يسمح لفريقك بنشر تجربة مصادقة حديثة وسلسة بثقة.
Enjoyed this read?
🤝 Join our Passkeys Community
Share passkeys implementation tips and get support to free the world from passwords.
🚀 Subscribe to Substack
Get the latest news, strategies, and insights about passkeys sent straight to your inbox.
Related Articles
Table of Contents