الدليل الشامل للمطورين حول WebAuthn وتنفيذ مفاتيح المرور (passkeys). قم بتنزيل ورقة العمل كملف PDF أو استخدم هذا الموقع للحصول على جميع المعلومات.
Lukas R.
تاريخ الإنشاء: 6 مارس 2024
آخر تحديث: 3 يوليو 2026

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

تعتمد المصادقة باستخدام مفاتيح المرور على العمليتين أو الإجراءين، التسجيل (المعروف أيضًا باسم مرحلة الإثبات attestation) و تسجيل الدخول (المعروف أيضًا باسم مرحلة التأكيد assertion).
تتطلب كل مرحلة تحديًا عشوائيًا (challenge) ينشئه الخادم، والذي يوقعه الموثق ويتم إرساله مرة أخرى إلى خادم WebAuthn للتحقق من المستخدم.
اختبر تدفقات passkey في Passkeys Debugger.
تستخدم عملية التسجيل كائنين مركزيين: PublicKeyCredentialCreationOptions و attestation.
تستخدم عملية تسجيل الدخول كائنين مركزيين: PublicKeyCredentialRequestOptions و assertion.
اطلع على عدد الأشخاص الذين يستخدمون passkeys فعلياً.
للتسجيل وتسجيل الدخول باستخدام مفاتيح المرور، هناك أربعة كائنات رئيسية:
يشرح هذا القسم أيضًا كائن authenticatorSelection، والذي يُستخدم في PublicKeyCredentialCreationOptions.
Igor Gjorgjioski
Head of Digital Channels & Platform Enablement, VicRoads
We hit 80% mobile passkey activation across 5M+ users without replacing our IDP.
See how VicRoads scaled passkeys to 5M+ users — alongside their existing IDP.
Read the case studyيعد PublicKeyCredentialCreationOptions الكائن المركزي لمرحلة الإثبات (التسجيل). يتم إنشاؤه وإرجاعه من خادم WebAuthn.
{ "PublicKeyCredentialCreationOptions": { "rp": { "id": "passkeys.eu", "name": "Corbado Passkeys Demo" }, "user": { "displayName": "john.doe", "id": "dXNyLZ….DU10Tc", "name": "john@doe.com" }, "challenge": "888fix4Bus...pHHr3Y", "pubKeyCredParams": [ { "alg": -7, "type": "public-key" }, { "alg": -257, "type": "public-key" } ], "excludeCredentials": [], "authenticatorSelection": { "authenticatorAttachment": "platform", "residentKey": "required", "userVerification": "required" }, "attestation": "none", "extensions": {} } }
يحتوي الكائن على هذه السمات:
اشترك في Passkeys Substack للحصول على آخر الأخبار.
يعد PublicKeyCredentialRequestOptions الكائن المركزي لمرحلة التأكيد (تسجيل الدخول). يتم إنشاؤه وإرجاعه من خادم WebAuthn.
{ "publicKeyCredentialRequestOptions": { "challenge": "pT7HMA-…dFPHk", "timeout": 500, "rpId": "passkeys.eu", "userVerification": "preferred", "allowCredentials": [], "extensions": [] } }
يحتوي الكائن على هذه السمات:
أثناء عملية الإثبات / التسجيل، يُرجع الموثق استجابة التسجيل هذه. يمكنك تجربة ذلك بنفسك في Passkeys Debugger.
{ "authenticatorAttachment": "platform", "id": "JKZbixUfKN_aZtimefYT-OjH5dw", "rawId": "JKZbixUfKN_aZtimefYT-OjH5dw", "response": { "attestationObject": { "fmt": "none", "attStmt": {}, "authData": { "rpIdHash": "PpZrl-Wqt-OFfBpyy2SraN1m7LT0GZORwGA7-6ujYkM", "flags": { "userPresent": true, "userVerified": true, "backupEligible": true, "backupStatus": true, "attestedData": true, "extensionData": false }, "counter": 0, "aaguid": { "raw": "fbfc3007-154e-4ecc-8c0b-6e020557d7bd", "name": "iCloud Keychain" }, "credentialID": "JKZbixUfKN_aZtimefYT-OjH5dw", "credentialPublicKey": "pQECAyYgASFYIPWLalDzyxIDmAADvfK8iNM5To50kh7TyPH-teEz8RMdIlgg3D7bPIWQJ8z-WFn3zdYZzJw9c7mhPdmflQqD9vV7efA", "parsedCredentialPublicKey": { "keyType": "EC2 (2)", "algorithm": "ES256 (-7)", "curve": 1, "x": "9YtqUPPLEgOYAAO98ryI0zlOjnSSHtPI8f614TPxEx0", "y": "3D7bPIWQJ8z-WFn3zdYZzJw9c7mhPdmflQqD9vV7efA" } } }, "clientDataJSON": { "type": "webauthn.create", "challenge": "k2p6f-upzP_hc6NZvmMAxiI0VSTeQIeXXVRGW62LTj0", "origin": "https://www.passkeys-debugger.io", "crossOrigin": false }, "transports": ["hybrid", "internal"], "authenticatorData": "PpZrl-Wqt-OFfBpyy2SraN1m7LT0GZORwGA7-6ujYkNdAAAAAPv8MAcVTk7MjAtuAgVX170AFCSmW4sVHyjf2mbYpnn2E_jox-XcpQECAyYgASFYIPWLalDzyxIDmAADvfK8iNM5To50kh7TyPH-teEz8RMdIlgg3D7bPIWQJ8z-WFn3zdYZzJw9c7mhPdmflQqD9vV7efA", "publicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9YtqUPPLEgOYAAO98ryI0zlOjnSSHtPI8f614TPxEx3cPts8hZAnzP5YWffN1hnMnD1zuaE92Z-VCoP29Xt58A", "publicKeyAlgorithm": -7 }, "type": "public-key", "clientExtensionResults": {} }
يحتوي الإثبات على بعض المكونات المهمة مثل attestationObject و algorithm وعلامات transport.
مأخوذ من مواصفات Webauthn الصادرة عن W3C
يعد attestationObject كائنًا مشفرًا بـ CBOR، ويحتوي على معلومات حول بيانات الاعتماد التي تم إنشاؤها حديثًا، والمفتاح العام، والبيانات الأخرى ذات الصلة:
اقرأ المزيد حول الإضافات (extensions).
يتم إنشاء مفاتيح المرور باستخدام خوارزميات COSE، مع الإشارة إلى الخوارزمية المستخدمة في سمة algorithm الخاصة بـ parsedCredentialPublicKey في كائن الإثبات.
إليك نظرة عامة على خوارزميات COSE الأكثر صلة:
تشير خاصية transports إلى الآليات التي يمكن للموثق من خلالها التواصل مع العميل. بعض المجموعات الشائعة للقيم النموذجية هي:
أثناء عملية التأكيد / تسجيل الدخول، يُرجع الموثق استجابة تسجيل الدخول هذه. يمكنك تجربة ذلك بنفسك في Passkeys Debugger.
{ "id": "JKZbixUfKN_aZtimefYT-OjH5dw", "rawId": "JKZbixUfKN_aZtimefYT-OjH5dw", "type": "public-key", "authenticatorAttachment": "platform", "response": { "authenticatorData": { "rpIdHash": "PpZrl-Wqt-OFfBpyy2SraN1m7LT0GZORwGA7-6ujYkM", "flags": { "userPresent": true, "userVerified": true, "backupEligible": true, "backupStatus": true, "attestedData": false, "extensionData": false }, "counter": 0 }, "clientDataJSON": { "type": "webauthn.get", "challenge": "GCVkITWbe2l2dttsn_DgJYvH9QPHPDo0ygWgcgI6B7U", "origin": "https://www.passkeys-debugger.io", "crossOrigin": false, "other_keys_can_be_added_here": "do not compare clientDataJSON against a template. See https://goo.gl/yabPex" }, "signature": "MEQCIA-orC8N2KKWOxyY17BWP8lB-Be5to9btXRnJZf2SLhXAiBGxJe5Eu5LwOTbsyzAYmIXHOhlC3pN7s7Q1fRLvEW57g", "userHandle": "_FKz1uwqmR_3yGq6hJntzoIFwFC_d1u_53YRELh0KlE" } }
يحتوي التأكيد على بعض المكونات المهمة مثل العلامات (flags) والتوقيع (signature) ومعالج المستخدم (userHandle).
إليك نظرة عامة على العلامات الأكثر صلة ومجموعاتها:
يتم استخدام التوقيع للتحقق من أن المستخدم الذي يحاول تسجيل الدخول يمتلك بالفعل المفتاح الخاص. يتم إنشاء التوقيع عن طريق ربط authenticatorData و clientDataHash (أي إصدار SHA-256 من ClientDataJSON) وتوقيع النتيجة بالمفتاح الخاص (في الموثق). للتحقق باستخدام المفتاح العام، نقوم بربط authenticatorData و clientDataHash أيضًا. إذا أرجعت نتيجة التحقق true، فهذا يعني نجاح المصادقة.
userHandle هو user_id الفعلي. اقرأ المزيد عن user_id في القسم 4.1 مخطط قاعدة البيانات.
يسمح كائن authenticatorSelection للخادم بإملاء الإعدادات الخاصة بالموثق وإنشاء بيانات الاعتماد باستخدام القيم التالية:
المفاتيح المقيمة (تُعرف أيضًا ببيانات الاعتماد القابلة للاكتشاف): يتم تخزين المفاتيح المقيمة على الموثق واسترجاعها أثناء المصادقة. بهذه الطريقة يمكن للعميل اكتشاف قائمة بالمفاتيح المحتملة، ولهذا السبب تتطلب [واجهة المستخدم الشرطية Conditional UI](/blog/user-transition-passkeys-> conditional-ui) مفاتيح مقيمة. المفاتيح غير المقيمة (تُعرف أيضًا ببيانات الاعتماد غير القابلة للاكتشاف): في حالة المفاتيح غير المقيمة، يتم تخزين معرف بيانات الاعتماد على الخادم وتوفيره أثناء المصادقة. يُعد معرف بيانات الاعتماد معرفًا مبهمًا يختلف هيكله الداخلي باختلاف التنفيذ - قد تخزن الموثقات المفاتيح الخاصة مباشرة، أو تستخدم تغليف المفاتيح المشفرة، أو تشتق المفاتيح من أسرار داخلية. تختلف الآلية الدقيقة باختلاف تنفيذ الموثق.
تحذير: إذا تم التعيين إلى "Preferred"، يمكن للمستخدم أو جهازه تخطي التحقق من المستخدم في عملية المصادقة (اقرأ المزيد في هذا المقال).
تعرض واجهة المستخدم الشرطية (الملء التلقائي لمفاتيح المرور) مفاتيح المرور المتاحة في قائمة اختيار منسدلة للمستخدم، عندما يكون لدى المستخدم مفتاح مقيم مسجل لدى الطرف المعتمد. إنه يحسن قابلية استخدام مفاتيح المرور، ولكنه يتطلب جهود تطوير إضافية ولا يتوفر لجميع مجموعات أنظمة التشغيل / المتصفحات.
مثل تسجيل الدخول العادي، تستخدم واجهة المستخدم الشرطية أيضًا الكائنات PublicKeyCredentialRequestOptions و assertion.
واجهة المستخدم الشرطية غير متوفرة على جميع مجموعات أنظمة التشغيل والمتصفحات (حتى الآن). إليك نظرة عامة على تغطية المتصفح الحالية (مارس 2024):
للحصول على نظرة عامة محدثة، راجع هذا الموقع.
يبدو الكود البرمجي المصغر الكامل لطريقة واجهة المستخدم الشرطية كالتالي:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Conditional UI</title> </head> <body> <input type="text" id="username" autocomplete="username webauthn" /> <script> async function passkeyLogin() { try { // استرداد خيارات الطلب (بما في ذلك التحدي) من خادم WebAuthn let options = await WebAuthnClient.getPublicKeyRequestOptions(); const credential = await navigator.credentials.get({ publicKey: options.publicKeyCredentialRequestOptions, mediation: "conditional", }); const userData = await WebAuthnClient.sendSignedChallenge(credential); window.location.href = "/logged-in"; } catch (error) { console.log(error); } } passkeyLogin(); </script> </body> </html>
لا تعمل واجهة المستخدم الشرطية إلا مع المفاتيح المقيمة / بيانات الاعتماد القابلة للاكتشاف.
يُوصى بتوفير نقطة نهاية خادم مختلفة لبدء تسجيل الدخول عبر واجهة المستخدم الشرطية.
يجب أن يستوفي العميل متطلبات متعددة:
لتجنب الأخطاء، يجب أن يختبر الخادم أولاً توفر العميل بهذه الوظيفة:
في حركة المرور الحقيقية، غالبًا ما تظهر مشكلات الاكتشاف ودورة الحياة على شكل NotAllowedError أو AbortError. استخدم دليل أخطاء WebAuthn هذا للتصنيف المتوقع مقابل غير المتوقع، بما في ذلك أخطاء مفتاح مرور مدير بيانات الاعتماد الأصلي.
// المصدر: https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredential/isConditionalMediationAvailable#examples // توفر `window.PublicKeyCredential` يعني أن WebAuthn قابل للاستخدام. if (window.PublicKeyCredential && PublicKeyCredential.isConditionalMediationAvailable) { // التحقق مما إذا كانت الوساطة الشرطية متاحة. const isCMA = await PublicKeyCredential.isConditionalMediationAvailable(); if (isCMA) { // استدعاء نقطة نهاية بدء مصادقة WebAuthn let options = await WebAuthnClient.getPublicKeyRequestOptions(); const credential = await navigator.credentials.get({ publicKey: options.publicKeyCredentialRequestOptions, mediation: "conditional", }); /* ... */ } }
يجب أن يتلقى حقل الإدخال رمز الملء التلقائي بتنسيق HTML، والذي يشير للعميل إلى ملء مفاتيح المرور للطلب الجاري. إلى جانب مفاتيح المرور، يمكن إقران رموز الملء التلقائي برموز موجودة، مثل أسماء المستخدمين وكلمات المرور:
autocomplete="username webauthn": بالإضافة إلى عرض مفاتيح المرور، يقترح هذا أيضًا الإكمال التلقائي لاسم المستخدم.autocomplete="current-password webauthn": بالإضافة إلى عرض مفاتيح المرور، يطالب هذا أيضًا بالإكمال التلقائي لكلمة المرور.<label for="name">Username:</label> <input type="text" name="name" autocomplete="username webauthn" /> <label for="password">Password:</label> <input type="password" name="password" autocomplete="current-password webauthn" />
لا يوجد مخطط قاعدة بيانات إلزامي أو قياسي لخوادم WebAuthn. ومع ذلك، يمكن استخدام مخطط قاعدة البيانات النموذجي هذا لتخزين المعلومات المطلوبة وتوفير جميع وظائف خادم WebAuthn:
السمات الغامقة إلزامية لتنفيذ أساسي قابل للتطبيق، في حين أن السمات الأخرى مطلوبة فقط للميزات الاختيارية ولكن المفيدة.
الاسم المعروض للمستخدم (user.displayName): اسم مقروء وسهل الاستخدام، وهو عادةً الاسم الكامل للمستخدم. يظهر للمستخدم، لكنه لا يُستخدم أثناء المصادقة.
اسم المستخدم (user.name): اسم فريد ومقروء وعادة ما يكون عنوان بريد إلكتروني أو اسم مستخدم. يمكن إظهاره للمستخدم، ولكنه لا يُستخدم أثناء المصادقة.
يعد معرف الطرف المعتمد (rpID) نطاقًا مخزنًا داخل مفتاح المرور، مما يضمن أن مفتاح المرور يعمل فقط مع النطاق الصحيح (عنوان URL للمتصفح، راجع هذا المقال للحصول على التطبيقات الأصلية). أثناء المصادقة، يتم التحقق من rpID مقابل عنوان URL للمتصفح ولا يُسمح به إلا في هاتين الحالتين:
إليك أمثلة على المجموعات (غير) المسموح بها:
إليك قائمة بالأدوات والمواقع المفيدة لتنفيذ مفاتيح المرور.
chrome://device-log).للحصول على استراتيجيات حول تحسين تجربة مستخدم مفاتيح المرور بما يتجاوز التنفيذ الفني، راجع أدلتنا حول أفضل ممارسات إنشاء مفتاح المرور وأفضل ممارسات تسجيل الدخول بمفتاح المرور.
إذا كنت ترغب في تنفيذ مفاتيح المرور باستخدام بضعة أسطر فقط من التعليمات البرمجية في أي تطبيق، فيمكنك أيضًا استخدام Corbado Complete (للتطبيقات الجديدة) أو Corbado Connect (للتطبيقات الحالية).
Corbado هي Authentication Intelligence Platform لفِرَق CIAM التي تُدير المصادقة الاستهلاكية على نطاق واسع. نُمكّنك من رؤية ما لا تستطيع سجلات IDP وأدوات التحليل العامة إظهاره: أي الأجهزة وإصدارات أنظمة التشغيل والمتصفحات ومديري بيانات الاعتماد تدعم passkeys، ولماذا لا تتحوّل عمليات التسجيل إلى عمليات دخول، وأين يفشل تدفق WebAuthn، ومتى يُعطّل تحديث نظام التشغيل أو المتصفح تسجيل الدخول بصمت — كل ذلك دون استبدال Okta أو Auth0 أو Ping أو Cognito أو IDP الداخلي لديك. منتجان: Corbado Observe يُضيف observability للـ passkeys وأي طريقة دخول أخرى. Corbado Connect يُقدّم managed passkeys مع تحليلات مدمجة (إلى جانب IDP الخاص بك). تُشغّل VicRoads passkeys لأكثر من 5 ملايين مستخدم مع Corbado (تفعيل passkey بنسبة +80%). تحدث مع خبير Passkey →
تتطلب واجهة المستخدم الشرطية التحقق من دعم المتصفح عبر PublicKeyCredential.isConditionalMediationAvailable() قبل بدء المصادقة. يجب أن يتضمن حقل الإدخال رمز HTML autocomplete="username webauthn" ويجب أن يكون لدى المستخدم مفتاح مقيم (بيانات اعتماد قابلة للاكتشاف) مسجل. يوصى بوجود نقطة نهاية خادم منفصلة للتعامل مع تدفق تسجيل الدخول الخاص بواجهة المستخدم الشرطية.
كحد أدنى، قم بتخزين معرف بيانات الاعتماد (Credential ID)، الذي يتم إنشاؤه بواسطة الموثق أثناء التسجيل، ومعرف المستخدم (user_id)، والذي يتم إرجاعه كـ userHandle في كائن التأكيد. استخدم معرف بيانات الاعتماد للبحث عن حساب المستخدم المرتبط ومقارنة userHandle للتحقق من صحة المصادقة. تجنب استخدام user.name للمقارنة لأنه يمكن أن يتغير بمرور الوقت.
يتم تخزين المفاتيح المقيمة (بيانات الاعتماد القابلة للاكتشاف) على الموثق نفسه ويتم استردادها أثناء المصادقة، وهو أمر مطلوب لعمل واجهة المستخدم الشرطية. تخزن المفاتيح غير المقيمة معرف بيانات الاعتماد على الخادم وترسله إلى الموثق أثناء المصادقة. يتحكم حقل residentKey في authenticatorSelection في هذا السلوك بقيم "required" أو "preferred" أو "discouraged".
يتحكم حقل userVerification في ما إذا كان يجب على الموثق التحقق من المستخدم أثناء تسجيل الدخول، مع قبول القيم "required" أو "preferred" (الافتراضي) أو "discouraged". عند تعيينه على "preferred"، يمكن للمستخدم أو جهازه تخطي التحقق بالكامل أثناء عملية المصادقة، مما قد يضعف الأمان. يضمن تعيينه على "required" حدوث التحقق دائمًا قبل اكتمال المصادقة.
مقالات ذات صلة
جدول المحتويات