تمت ترجمة هذه الصفحة تلقائياً. اقرأ النسخة الأصلية باللغة الإنجليزية هنا.
تعد أخطاء WebAuthn في الإنتاج محيرة لأن المتصفحات تعرض مجموعة صغيرة من أسماء DOMException (مثل NotAllowedError) التي يمكن أن تمثل أسباباً أساسية متعددة. علاوة على ذلك، فإن الغالبية العظمى من "الأخطاء" - غالباً ما تتجاوز 95% في عمليات النشر واسعة النطاق المحسنة - هي في الواقع سلوك متوقع (قام المستخدم بإلغاء مطالبة مفتاح المرور لنظام التشغيل).
اختبر تدفقات passkey في Passkeys Debugger.
هام: لأسباب تتعلق بالخصوصية، لا تميز المتصفحات بين ما إذا كان المستخدم قد ألغى بنشاط أو ما إذا كان لا يوجد مفتاح مرور. ومع ذلك، في بعض المواقف وبوجود سياق كافٍ، سواء على الويب أو على الأنظمة الأساسية الأصلية، يمكن التمييز بين بعض هذه الحالات باستخدام إشارات مثل التوقيت.
إذا كنت تريد التعريفات الأساسية لهذه الأسماء، فابدأ بـ MDN DOMException. بالنسبة لشروط WebAuthn المحددة التي تؤدي إلى هذه الاستثناءات (وما الذي يتطلب من المتصفحات فرضه)، راجع مواصفات مصادقة الويب من W3C.
إذا كنت تتعامل مع جميع الأخطاء على أنها "أخطاء برمجية"، فستفعل الأشياء الخاطئة:
NotAllowedError.في هذا المقال نجيب على:
NotAllowedError في مجموعات قابلة للتنفيذ (إلغاء مقابل مهلة مقابل التوفر)؟NotAllowedError هو إشارة سطحية، وليس سبباً جذرياً. يمكن أن يعني الإلغاء، أو المهلة، أو "لا توجد بيانات اعتماد محلية"، أو عدم وجود تنشيط للمستخدم اعتماداً على السياق.NotAllowedError يعني أشياء مختلفة أثناء تسجيل الدخول بواجهة مستخدم مشروطة، وتسجيل الدخول النمطي، والإنشاء اليدوي لمفتاح المرور، والإنشاء المشروط، والإضافات التي يتم تشغيلها تلقائياً.<1s)، وإلغاء المستخدم (1-15 ثانية)، والمهلة (30 ثانية فما فوق) هي فئات مختلفة جذرياً.AbortError هو عادةً مشكلة دورة حياة / تزامن (التنقل، وإعادة العرض، والطلبات المتعددة قيد التشغيل).SecurityError هو دائماً تقريباً سياسة / سياق ونادر في عمليات النشر الإنتاجية الناضجة.error.name حتى تتمكن من تصنيف الأخطاء في مجموعات يمكنك إصلاحها فعلياً.إذا كنت تحتاج فقط إلى تعيين سريع لإلغاء حظر تصحيح الأخطاء، فابدأ بهذا الجدول. إنه متحيز نحو ما تراه الفرق فعلياً في لوحات المعلومات وتذاكر الدعم.
error.name | ما يعنيه عادة في الإنتاج | ما يجب التحقق منه للتأكيد | الإجراء الأول (تجربة المستخدم + الهندسة) |
|---|---|---|---|
NotAllowedError | رفض المستخدم الورقة، أو انتهت المهلة، أو عدم تطابق التوفر المدمج في مجموعة واحدة. هذه هي أكبر مجموعة أخطاء في الإنتاج. | وقت الخطأ، وما إذا كانت واجهة الاستجابة السريعة / الهجينة قد ظهرت، وما إذا كان الحفل قد بدأ من إجراء مستخدم حقيقي | تعامل معه على أنه متوقع: استعادة واجهة المستخدم + إظهار خطة احتياطية |
AbortError | أجهض تطبيقك (أو المتصفح) الحفل | التنقل / إعادة العرض أثناء الحفل؛ مكالمات WebAuthn المتزامنة؛ AbortController.abort() | فرض طلب واحد قيد التشغيل؛ منع تغييرات المسار؛ التعامل مع الإجهاض كتدفق تحكم عادي |
SecurityError | السياق / السياسة غير مسموح بها | أصل + استراتيجية معرف RP؛ إطار / تضمين؛ HTTPS؛ سياسة الميزة | إصلاح معرف RP / تكوين الأصل؛ التحقق من سياسات التضمين؛ ضمان سياق آمن |
InvalidStateError | عدم تطابق الحالة (غالباً ما يكون تسجيل مكرر) | التسجيل مقابل تسجيل الدخول؛ excludeCredentials؛ بيانات اعتماد موجودة على المصادق | تعامل على أنه "مسجل بالفعل"؛ ضبط مسار تجربة المستخدم؛ إصلاح إنشاء الخيارات |
ConstraintError | لا يمكن تلبية المتطلبات | authenticatorAttachment، userVerification، متطلبات المفتاح المقيم | تخفيف القيود أو توفير مسار / بديل بديل. مثال: قفل الشاشة مفقود على Android |
DataError | المدخلات مشوهة / غير متسقة | ترميز base64url؛ تنسيقات المعرف / التحدي / مقبض المستخدم | إصلاح الترميز / التسلسل؛ إضافة التحقق من الصحة في إنشاء الخيارات |
NotSupportedError | النظام الأساسي / المتصفح لا يدعم ما طلبته | إصدار نظام التشغيل / المتصفح؛ افتراضات اكتشاف الميزات | التراجع فوراً؛ تسجيل القطاع؛ تجنب إظهار عبارات تحث المستخدم على اتخاذ إجراء بشأن مفتاح المرور للبيئات غير المدعومة |
UnknownError | فشل النظام الأساسي / المصادق بطريقة عامة | طفرات بعد تحديثات نظام التشغيل؛ بناء الجهاز؛ مشاكل مزود مدير بيانات الاعتماد | تجربة مستخدم صديقة لإعادة المحاولة؛ التقاط أرقام البناء؛ التحقيق في طفرات القطاع |
هناك شيء واحد يسهل تفويته: يمكن أن يعني نفس error.name أشياء مختلفة تماماً اعتماداً على نوع العملية. ضع في اعتبارك سياق العملية عند قراءة الأقسام أدناه. في الممارسة العملية، تتفوق أخطاء إنشاء مفتاح المرور (التسجيل) عادةً على أخطاء تسجيل الدخول بهامش كبير - ينطبق الجدول أعلاه على كليهما، لكن الإنشاء هو المكان الذي يعيش فيه معظم الحجم.
بعد ذلك، سنتعمق أكثر في NotAllowedError لأنها الأكثر ظهوراً والتي تسيء الفرق تفسيرها في أغلب الأحيان.
غالباً ما تبدو NotAllowedError كـ "فشل مفاتيح المرور"، ولكنها عادةً ما تكون النظام الأساسي الذي يخبرك بأن المستخدم لم يكمل واجهة مستخدم نظام التشغيل. المفتاح هو تقسيمها إلى مجموعات يمكنك التصرف بناءً عليها.
ما ستراه في وحدة تحكم المتصفح:
| المصدر | رسالة الخطأ |
|---|---|
| Chrome, Edge | NotAllowedError: The operation either timed out or was not allowed. See: https://www.w3.org/TR/webauthn-2/#sctn-privacy-considerations-client. |
| Safari, WebKit | NotAllowedError: The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission. |
| Safari, WebKit | NotAllowedError: This request has been cancelled by the user. |
| Chrome, Edge | NotAllowedError: The operation is not allowed at this time because the page does not have focus. |
| Safari, WebKit | NotAllowedError: The document is not focused. |
| Firefox | NotAllowedError: Operation failed. |
تظهر جميعها كـ error.name === "NotAllowedError". تختلف error.message باختلاف محرك المتصفح والسبب الأساسي، لكن النتيجة واحدة: لم يكتمل الحفل.
ينطبق هذا على كل من تسجيل الدخول وإنشاء مفتاح المرور. أثناء تسجيل الدخول (واجهة المستخدم المشروطة، النموذجية مع أو بدون allowList)، يعني NotAllowedError عادةً أن المستخدم لم يكمل الحفل. أثناء إنشاء مفتاح المرور، يظهر نفس الخطأ لأسباب مختلفة: قام المستخدم بإلغاء مربع حوار الإنشاء (لم يعمل الإنشاء المشروط، أو فقدت الصفحة التركيز أثناء الإضافة التلقائية المشغلة). يغير نوع العملية ما يعنيه الخطأ وما يجب عليك فعله حياله.
التوقيت غالباً ما يكون إشارة مقللاً من شأنها. عادةً ما يكون الخطأ بعد أقل من ثانية من النقر رفضاً فورياً (لا يمكن للبيئة القيام بذلك، المستند غير مركّز، القدرة مفقودة). الخطأ بعد بضع ثوانٍ هو إلغاء المستخدم (لقد رأوا مربع الحوار وقرروا عدم المتابعة). الخطأ بعد أكثر من 30 ثانية هو مهلة. على الأنظمة الأساسية الأصلية، يعد التوقيت مهماً بشكل خاص: رحلات الذهاب والإياب للمصادق، والمطالبات البيومترية وعمليات تسليم مدير بيانات الاعتماد جميعها لها فترات مميزة تساعدك على فصل "لم يعمل" عن "ابتعد المستخدم". لا يزال من غير الممكن التمييز بسهولة إذا كان مفتاح المرور موجوداً.
لست بحاجة إلى إشارة مثالية. تحتاج إلى سياق كافٍ لتجنب التعامل مع كل NotAllowedError بنفس الطريقة. يحصل iOS / Safari على اهتمام خاص أدناه لأن لديه قيوداً فريدة (متطلبات تنشيط المستخدم في الإصدارات السابقة)، ولكن في حجم الأخطاء الخام، غالباً ما تولد متصفحات Windows و Chromium NotAllowedError أكثر من أي نظام أساسي آخر. غالباً ما تصل بك هذه الإشارات إلى 80٪ من الطريق:
| الإشارة | المعنى المحتمل | ماذا تفعل بعد ذلك |
|---|---|---|
فشل فوري (<1s) | رفض البيئة: لا قدرة، المستند غير مركز، سطح الإنشاء المشروط غير متوفر | التحقق من اكتشاف الميزات؛ تأكد من أن المستند يحتوي على تركيز؛ تحقق من أن العملية مدعومة على هذا النظام الأساسي |
| إلغاء سريع (1-3 ثوانٍ) | مطالبة مفاجئة / بدون سياق | تغيير توقيت المطالبة؛ إضافة تهدئة بعد الإلغاء |
| إلغاء بطول المستخدم (3-15 ثانية) | رأى المستخدم مربع الحوار واختار عدم المتابعة | تجربة مستخدم متوقعة؛ استعادة واجهة المستخدم + عرض احتياطي |
| المهلة (30 ثانية فما فوق) | انتهت مهلة الحفل دون تدخل المستخدم | الدلو باسم "لم يكتمل"؛ ضع في اعتبارك ما إذا كانت المطالبة قد تمت ملاحظتها |
| تظهر واجهة مستخدم QR / الهجينة قبل الفشل | لا توجد بيانات اعتماد محلية متاحة على هذا الجهاز. ملاحظة: يتطلب الكشف الموثوق به عن قرارات رمز الاستجابة السريعة قبل حدوثها طبقة ذكاء مفتاح مرور تعرف ما إذا كانت بيانات اعتماد قابلة للاستخدام موجودة على الجهاز الحالي. | بوابة عروض مفتاح المرور؛ اجعل "استخدام الهاتف" صريحاً؛ تقليل مفاجأة QR |
| تتركز على iOS / Safari وتعمل بدون نقرة / النقر | تنشيط المستخدم مفقود | ابدأ الحفل بإيماءة مستخدم حقيقية |
| أثناء الإنشاء المشروط أو الإضافة المشغلة تلقائياً | التدوين الآلي غير متوفر، أو بيانات الاعتماد موجودة بالفعل، أو فقدت الصفحة التركيز. يمكن أن تظهر أخطاء الإنشاء المشروط بشكل مفاجئ وبأحجام كبيرة عند إطلاق الميزة، مما يجعل هذا أحد أكبر مصادر الأخطاء بين عشية وضحاها. | راجع الإنشاء المشروط؛ تحقق من حالة رؤية المستند؛ استخدم getClientCapabilities() للتحقق من دعم conditionalCreate قبل محاولة المكالمة |
هذا هو السبب أيضاً في أنه نادراً ما يكون NotAllowedError مرئياً للمستخدم. إنها ليست رسالة يمكن للمستخدم التصرف بناءً عليها.
تصنيف السياق هو أيضاً المكان الذي تنقسم فيه معدلات النجاح بشكل حاد. يقيس تحليل معدل نجاح مصادقة مفتاح المرور لعام 2026 إكمال الربع الأول من عام 2026 بنسبة 55-95٪ للتدفقات التي تبدأ بمعرف الجهاز غير المعروف مقابل 95-99٪ لعوائد الجهاز المعروفة عبر عمليات النشر من الشركات إلى المستهلكين واسعة النطاق. يهبط المعرف الأول للويب على iOS بنسبة إكمال 85-95٪ (% CDA 0-5٪)، الويب على Android بنسبة 70-85٪ (% CDA 5-10٪) و macOS للويب بنسبة 70-85٪ (% CDA 10-15٪)، بينما يقع الويب على Windows بنسبة 45-60٪ من الإكمال الأول للمعرف مع % CDA بنسبة 55-65٪ على Windows 11 و 40-55٪ على Windows 10. إن قراءة حجم NotAllowedError دون فصل سياقات الجهاز المعروفة مقابل غير المعروفة يجمع بين نظامي نجاح مختلفين تماماً.
فارق بسيط واحد يهم في الإنتاج: قد تعرض بعض وكلاء المستخدمين المهلات كـ TimeoutError، لكن العديد من الفرق لا تزال ترى مهلة تنهار إلى NotAllowedError في لوحات المعلومات. في كلتا الحالتين، تعامل مع المهلات كـ "لم يكتمل الحفل" وقم بتجميعها باستخدام التوقيت بالإضافة إلى السياق.
عند رفض ورقة نظام التشغيل أو انتهاء مهلتها، يجب أن تتعافى واجهة المستخدم الخاصة بك فوراً وتتفاعل بكياسة. مجموعة عملية من القواعد:
ما وراء الأساسيات:
إذا كانت "إلغاءاتك" عالية حقاً، فإن الخطوة التالية هي إصلاح الأسباب الجذرية وراءها: توقيت المطالبة، ومفاجآت QR وانخفاض التوفر.
ابدأ بالتغييرات التي تحرك المقاييس بسرعة:
NotAllowedError الخاصة بك. ابدأ بـ isUVPAA() باعتبارها البوابة الأساسية، ثم استخدم getClientCapabilities() لإجراء عمليات فحص أدق (الإنشاء المشروط، والحصول المشروط، والنقل الهجين، والمصادق على النظام الأساسي). كن على علم بأن واجهات برمجة تطبيقات الكشف يمكن أن تتعطل مع تحديثات نظام التشغيل: شحنت iOS 26.2 خطأ WebKit حيث تعود isUVPAA() كـ false على جميع المتصفحات القائمة على WKWebView على الرغم من أن مفاتيح المرور تعمل بشكل جيد، مما تسبب في طفرات NotAllowedError مفاجئة لـ 10-25% من مستخدمي iOS (انظر إصلاح اكتشاف مفتاح المرور باستخدام getClientCapabilities()).أسماء الأخطاء هدف متحرك. هناك مقترحات مستمرة لإضافة المزيد من أخطاء WebAuthn الدقيقة (على سبيل المثال، لفصل "لا توجد بيانات اعتماد متاحة" عن "ألغى المستخدم"). اعتباراً من فبراير 2026، لم يتم تنفيذ هذا في أي متصفحات، لذا لا يزال من الجدير بناء دلاء السبب الخاصة بك بناءً على السياق والتوقيت. إذا كنت ترغب في تتبع هذا العمل، فراجع مشكلة WebAuthn #2062 والموضح "رموز خطأ جديدة".
أسماء الأخطاء المتبقية أقل تواتراً ولكنها لا تزال تستحق الفهم عند ظهورها.
AbortError غير شائع في الحجم مقارنة بـ NotAllowedError، ولكن عندما يظهر يكون تشخيصياً للغاية: فهو يعني عادةً أن الحفل لم ينتهِ لأن تطبيقك أبطل الطلب - حدث التنقل، أو تغيرت الحالة، أو بدأ طلب ثانٍ.
ما ستراه في وحدة تحكم المتصفح:
| المصدر | رسالة الخطأ |
|---|---|
| Chrome, Edge | AbortError: The operation was aborted. |
| Chrome, Edge | AbortError: Aborted by AbortSignal. |
| Firefox | AbortError: signal is aborted without reason |
| Firefox | AbortError: Operation timed out. |
| Safari, WebKit | AbortError: The user aborted a request. |
| Chrome | AbortError: CredentialContainer request is not allowed. |
تشمل أسباب الإنتاج الشائعة ما يلي:
AbortController.abort() أثناء إعادة المحاولة أو تنظيف الحالةلإصلاح ذلك، ركز على جعل الحفل "قسماً حرجاً":
إذا رأيت AbortError تتركز في الأسطح المضمنة أو تطبيقات متعددة المجالات، فإن المجموعة التالية التي يجب التحقق منها هي SecurityError.
يخبرك SecurityError المتصفح بأن: "هذا السياق لا يُسمح له بالقيام بما طلبته." في الممارسة العملية، يكون دائماً تكويناً تقريباً، وليس سلوك المستخدم. في عمليات النشر الإنتاجية الناضجة، نادرًا ما يكون SecurityError لأن هذه المشكلات عادةً ما يتم التقاطها أثناء اختبار التكامل. إذا ظهر في الإنتاج، فعادةً ما يعني ذلك أنه تم إضافة مجال جديد أو سياق تضمين أو هدف نشر بدون تكوين WebAuthn مناسب.
تشمل الأسباب الشائعة ما يلي:
.well-known/webauthn أو .well-known/assetlinks.json تم تكوينه بشكل غير صحيح أو مفقود أو غير متوفر مؤقتاً. ستتسبب مشكلات الشبكة خلال النافذة الحرجة عندما يجلب المتصفح هذه الملفات في حدوث أعطال. النقطة العمياء الشائعة: إذا كانت صفحتك الرئيسية معطلة للصيانة، فإن الملفات المعروفة تكون غير متصلة بالإنترنت، مما يكسر احتفالات مفتاح المرور عبر جميع الأطراف المعتمدة التي تعتمد عليها.ما ستراه في وحدة تحكم المتصفح:
| المصدر | رسالة الخطأ |
|---|---|
| Chrome, Edge | SecurityError: WebAuthn is not supported on sites with TLS certificate errors. |
| Any browser | SecurityError: The relying party ID is not a registrable domain suffix of, nor equal to the current origin's effective domain. |
| Chrome (iframe) | SecurityError: The 'publickey-credentials-create' feature is not enabled in this document. |
في الإنتاج، يعتبر SecurityError نادراً - يتم التقاط هذه الأشياء دائماً تقريباً أثناء اختبار التكامل. عند ظهورها، يكون خطأ شهادة TLS هو الناجي الأكثر شيوعاً.
حلقة التصحيح الأسرع هي:
publickey-credentials-create / publickey-credentials-get): MDN Permissions-Policyبمجرد التعامل مع SecurityError، فإن المجموعة التالية التي يجب التعامل معها بجدية هي مجموعة الأخطاء التي تشير غالباً إلى أخطاء في التنفيذ: InvalidStateError و ConstraintError و DataError.

ملخص Passkeys. إرشادات عملية وأنماط إطلاق ومؤشرات KPI لبرامج passkeys.
يجب أن تكون هذه الأخطاء نادرة في التنفيذ الناضج لمفتاح المرور. عندما تظهر، فإنها تشير عادةً إلى أن إنشاء الخيار خاطئ لقطاع ما أو أن التدفق في الحالة الخاطئة.
ما ستراه في وحدة تحكم المتصفح:
| المصدر | رسالة الخطأ |
|---|---|
| Safari, WebKit | InvalidStateError: The user attempted to register an authenticator that contains one of the credentials already registered with the relying party. |
| Chrome, Edge | InvalidStateError: At least one credential matches an entry of the excludeCredentials list in the platform attached authenticator. |
| Chrome, Edge | InvalidStateError: A request is already pending. |
| Firefox | InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable |
المعاني النموذجية:
التعامل العملي:
excludeCredentials يسرد جميع معرفات بيانات الاعتماد الموجودة للمستخدم حتى يتمكن المصادق من اكتشاف التكرارات (راجع excludeCredentials)InvalidStateError ويجب تجاهله بصمت: هذا يعني أن مفتاح المرور موجود بالفعل في المزود. ينطبق الشيء نفسه على NotAllowedError و AbortError أثناء الإنشاء المشروط (راجع الإنشاء المشروط على Chrome)المعنى النموذجي: لا يستطيع المصادق تلبية القيود المطلوبة.
المشغلات الشائعة:
authenticatorAttachment أو المفتاح المقيم صارمة جداًuserVerification الصارمة في القطاعات حيث لا تتوفرالإصلاح: قم بتخفيف القيود (حيث يكون ذلك مقبولاً) أو توفير مسار بديل. بالنسبة لقفل الشاشة المفقود، فكر في اكتشاف هذا الشرط وتوجيه المستخدمين بدلاً من الفشل بصمت (Android).
المعنى النموذجي: المدخلات مشوهة أو غير متسقة.
المشغلات الشائعة:
الإصلاح: التحقق من صحة المدخلات وتطبيعها في الحدود التي تولد فيها خيارات WebAuthn. في الممارسة العملية، يكون DataError غائباً بشكل فعال في أنظمة الإنتاج الناضجة - إذا تم اختبار إنشاء الخيارات الخاص بك، فلن ترى هذا في لوحات المعلومات.
إذا كانت هذه الأخطاء تحت السيطرة، فإن السؤال التالي هو التغطية: هل يفشل المستخدمون لأن البيئة لا تستطيع القيام بـ WebAuthn بالطريقة التي تتوقعها؟
يُعد NotSupportedError إشارة تغطية، وليس إشارة موثوقية. ويعني هذا عادةً أن القطاع لا يستطيع القيام بما طلبته (نظام التشغيل / المتصفح قديم جداً، والقدرة مفقودة، والميزة غير ممكّنة).
ما ستراه في وحدة تحكم المتصفح:
| المصدر | رسالة الخطأ |
|---|---|
| Chrome, Edge | NotSupportedError: The user agent does not support public key credentials. |
| Firefox | NotSupportedError: Resident credentials or empty 'allowCredentials' lists are not supported. |
| Chrome, Edge, Firefox | TypeError: PublicKeyCredential.parseCreationOptionsFromJSON is not a function |
| Chrome, Edge, Firefox | TypeError: PublicKeyCredential.parseRequestOptionsFromJSON is not a function |
| Chrome, Edge, Firefox | TypeError: credential.toJSON is not a function |
| Safari | TypeError: Can only call PublicKeyCredential.toJSON on instances of PublicKeyCredential |
الخطآن الأولان هما بالفعل DOMExceptions من نوع NotSupportedError. في حين أن إدخالات TypeError هي تقنياً نوع استثناء مختلف ولكنها تمثل نفس فئة المشكلة: المتصفح أو البيئة لا تدعم ما طلبته. تُعد عائلة تسلسل JSON TypeError أكثر شيوعاً في الممارسة العملية من DOMException الخاص بـ NotSupportedError (انظر أدناه).
تشمل الأسباب الشائعة ما يلي:
عائلة تسلسل JSON هي أكبر مصدر لفشل فئة NotSupportedError في الإنتاج. من الناحية الفنية، تظهر هذه الأخطاء كـ TypeError (طريقة مفقودة)، وليس كـ DOMException، ولكن هذا هو المكان الذي ستواجهها فيه. هناك سببان جذريان متميزان:
navigator.credentials ولكن ليس PublicKeyCredential.parseCreationOptionsFromJSON / parseRequestOptionsFromJSON. يمثل هذا ما يقرب من 90٪ من عائلة الخطأ هذه، ويتركز في إصدارات Safari و Chrome الأقدم. إذا كانت مكتبة العميل الخاصة بك تعتمد على هذه الطرق بدون احتياطي، فإن ذلك يؤدي إلى حجم خطأ كبير..toJSON(). يمكن للإضافات مثل Bitwarden أو LastPass أو 1Password اعتراض الحفل وإرجاع كائن يشبه بيانات الاعتماد ولكنه ليس نسخة فعلية من PublicKeyCredential. يؤدي استدعاء .toJSON() عليه إما إلى حدوث خطأ، أو إرجاع قيمة غير محددة، أو أن يكون الكائن فارغاً تماماً. هذا يمثل حوالي 10٪ من العائلة ولكنه محير بشكل خاص في تصحيح الأخطاء لأن رسائل الخطأ تختلف باختلاف المتصفح (Safari: "لا يمكن الاستدعاء إلا على مثيلات PublicKeyCredential"؛ Firefox: "لا ينفذ واجهة PublicKeyCredential").يجب أن يكون التعامل صريحاً وسريعاً:
إذا كانت التغطية تبدو جيدة ولكن الفشل لا يزال يحدث في قطاعات معينة، فقد تكون تتعامل مع مشكلات طبقة النظام الأساسي التي تظهر على شكل UnknownError.
يُعد UnknownError خطأً جامعاً لفشل المصادق / نظام التشغيل الذي لا يتم تعيينه بشكل نظيف للفئات الأخرى. غالباً ما يكون عابراً، ولكن يمكن أن يرتفع أيضاً بعد تحديثات نظام التشغيل.
ما ستراه في وحدة تحكم المتصفح:
| المصدر | رسالة الخطأ |
|---|---|
| Chrome (Android) | UnknownError: An unknown error occurred while talking to the credential manager. |
| Any browser | UnknownError: The operation failed for an unknown transient reason. |
| Any browser | UnknownError: Either the device has received unexpected request data, or the device has been reconfigured since the request was made. |
| Any browser | UnknownError: Something went wrong. |
| Chrome (LastPass) | TypeError: Cannot use 'in' operator to search for 'type' in null |
| Safari (LastPass) | TypeError: null is not an Object. (evaluating 'key in input') |
| Chrome (Bitwarden) | FallbackRequested |
التعامل العملي:
مصدر خطأ متخصص واحد لا يتناسب بشكل أنيق مع أي فئة DOMException: يمكن لـ ملحقات متصفح مدير كلمات المرور (مثل Bitwarden، LastPass، 1Password، وغيرها) اعتراض مكالمات WebAuthn API وإرجاع استجابات غير قياسية. على الرغم من صغر حجمها مقارنة بإلغاءات المستخدم، فإن هذه الأمور تستحق التتبع لأنها تؤثر على شرائح محددة من المستخدمين بشكل مستمر وتكون الأعراض محيرة: طرق مفقودة في كائن بيانات الاعتماد التي تم إرجاعها، أو أنواع أخطاء غير متوقعة، أو استجابات مشوهة لا تتطابق مع أي خطأ WebAuthn موثق. غالباً ما تظهر هذه كـ UnknownError أو كاستثناءات غير مصنفة. إذا رأيت طفرات خطأ تتركز في متصفحات معينة مع عدم وجود تفسير على مستوى نظام التشغيل، فتحقق مما إذا كان امتداد مدير الاعتماد متورطاً.
لقد غطينا حتى الآن أسماء أخطاء متصفح الويب. ولكن إذا قمت أيضاً بشحن تطبيقات أصلية، فإن مشهد الأخطاء يكون مختلفاً - ومن نواحٍ عديدة، أفضل بكثير.
يغطي كل ما سبق متصفحات الويب. تشارك التطبيقات الأصلية - iOS مع إطار عمل ASAuthorization و Android مع واجهة برمجة تطبيقات Credential Manager - نفس الفئات الأساسية للأخطاء ولكنها تختلف بطرق مهمة:
"لا توجد بيانات اعتماد" هي إشارة مميزة. على الويب، تجمع المتصفحات "لا توجد بيانات اعتماد متوفرة" و "ألغى المستخدم" في نفس NotAllowedError للخصوصية. على المستوى الأصلي، يؤدي استخدام preferImmediatelyAvailableCredentials على نظام iOS (ASAuthorizationController) أو setPreferImmediatelyAvailableCredentials(true) على نظام Android (GetCredentialRequest) إلى إخبار نظام التشغيل بتقديم بيانات الاعتماد الموجودة بالفعل على الجهاز فقط والفشل فوراً في حالة عدم وجود أي منها. يمنحك هذا إرجاعاً نظيفاً لـ "عدم وجود بيانات اعتماد" لا يمكن أن يوفره الويب.
تظهر حالة مزود بيانات الاعتماد. يمكن للأنظمة الأساسية الأصلية في بعض الظروف أن تخبرك في حالة عدم تثبيت مزود بيانات اعتماد (مثل Google Password Manager، iCloud Keychain، 1Password، إلخ) أو تكوينه أو تعيينه كإعداد افتراضي والتفاعل مع ذلك. على الويب، يتم إخفاء هذه المعلومات خلف رسائل NotAllowedError غير الشفافة.
رسائل الخطأ أكثر تحديداً. نظراً لأن المستخدم قام بتثبيت التطبيق - وبالتالي إنشاء علاقة ثقة مع الطرف المعتمد - يعرض نظام التشغيل تفاصيل تشخيصية أكثر. لا تنطبق اعتبارات الخصوصية التي تجبر متصفحات الويب على أن تكون غامضة بنفس الطريقة عندما يكون التطبيق موجوداً بالفعل على الجهاز. يعرض نظام التشغيل iOS رسائل مترجمة بلغة جهاز المستخدم. يُرجع Android أنواع أخطاء منظمة تحتوي على سلاسل الأسباب. وهذا يجعل تصحيح الأخطاء أسهل ولكن هذا يعني أن معالجة الأخطاء يجب أن تأخذ في الاعتبار الأقلمة وتنسيقات الأخطاء الخاصة بالمنصة.
يعرض نظام iOS أخطاء مفتاح المرور من خلال إطار عمل ASAuthorization. تصل جميع الأخطاء في رد الاتصال المفوض authorizationController(controller:didCompleteWithError:) ككائنات NSError.
التصنيف حسب المجال + الرمز، وليس حسب سلسلة الرسائل. مجال الخطأ الأساسي هو com.apple.AuthenticationServices.AuthorizationError (ASAuthorizationError.errorDomain). قم بإلقاء الخطأ باستخدام let nsError = error as NSError وقم بمطابقته على .domain و .code. لا تتطابق أبداً على .localizedDescription في الإنتاج - يتم ترجمة رسائل Apple إلى أكثر من 30 لغة ويمكن أن تتغير عبر إصدارات نظام التشغيل. تُعد سلاسل الرسائل المدرجة أدناه مفيدة للتعرف على الأخطاء في السجلات، ولكنها ليست معايير تصنيف.
رموز ASAuthorizationError العامة:
| الرمز | الاسم | منذ | ماذا يعني |
|---|---|---|---|
| 1000 | Unknown | iOS 13 | لا ينبغي أن يظهر في الإنتاج. خطأ جامع. |
| 1001 | Canceled | iOS 13 | رفض المستخدم ورقة مفتاح المرور. الخطأ الأكثر شيوعاً بشكل عام - المكافئ لـ NotAllowedError. إشارة واضحة بـ userInfo فارغ ولا يوجد خطأ أساسي. |
| 1002 | InvalidResponse | iOS 13 | تلف على مستوى الإطار. نادر في الممارسة العملية. |
| 1003 | NotHandled | iOS 13 | لم يعالج أي مزود الطلب. تحقق من الاستحقاقات وتكوين مزود بيانات الاعتماد. |
| 1004 | Failed | iOS 13 | فشل عام. يحتوي localizedDescription على السبب الفعلي (مثل "التطبيق ذو المعرف X غير مرتبط بالمجال Y"). قد يحتوي userInfo على سلسلة FailureReason، ولكن لا يتم دائماً ملء NSUnderlyingErrorKey - تُرجع إخفاقات اقتران المجال القيمة الخالية للخطأ الأساسي. |
| 1005 | NotInteractive | iOS 15 | لا تتوفر بيانات اعتماد عند استخدام preferImmediatelyAvailableCredentials. هذه هي إشارة "لم يتم العثور على" النظيفة - يعادل iOS "لا يوجد مفتاح مرور على هذا الجهاز". لم تظهر واجهة مستخدم. |
| 1006 | MatchedExcludedCredential | iOS 18 | يوجد مفتاح مرور بالفعل لهذا الطرف المعتمد على هذا الجهاز. إشارة نظيفة لاكتشاف التكرارات - userInfo فارغ، لا يوجد NSUnderlyingErrorKey. التصنيف يعمل بدون مطابقة السلسلة. |
| 1007 | CredentialImport | iOS 18.2 | فشل استيراد بيانات الاعتماد. |
| 1008 | CredentialExport | iOS 18.2 | فشل تصدير بيانات الاعتماد. |
| 1009 | PreferSignInWithApple | iOS 26 | يفضل المستخدم تسجيل الدخول باستخدام Apple بدلاً من مفتاح المرور. جديد في نظام iOS 26. |
| 1010 | DeviceNotConfiguredForPasskeyCreation | iOS 26 | الجهاز يفتقر إلى تكوين رمز المرور أو iCloud Keychain. خلل معروف في محاكي iOS 26: يُرجع 1010 حتى عندما يكون التكوين صحيحاً (لا يُعاد إنتاجه على الأجهزة المادية). |
التمييز الأكثر أهمية للإنتاج: منذ نظام التشغيل iOS 18، تعرض بيانات الاعتماد المكررة رمز الخطأ الخاص بها 1006 (MatchedExcludedCredential). على نظام التشغيل iOS 17 والإصدارات الأقدم، كانت بيانات الاعتماد المكررة مخفية داخل الرمز 1004 (Failed). في نظام التشغيل iOS 18 والإصدارات الأحدث، يكون التمييز هيكلياً (رمز خطأ مختلف)، وليس نصياً.
أخطاء وقت التشغيل الشائعة (مرجع على مستوى السجل):
تظهر هذه الرسائل في localizedDescription أو في userInfo لسيناريوهات فشل محددة. استخدمها لعمليات البحث عن السجلات وتصحيح الأخطاء، وليس للتصنيف البرمجي.
| الرسالة (باللغة الإنجليزية) | الرمز الأساسي | ملاحظات |
|---|---|---|
Application with identifier <TeamID.BundleID> is not associated with domain X | 1004 (Failed) | استحقاق المجالات المرتبطة للتطبيق لا يتطابق مع الطرف المعتمد. أصلح ملف apple-app-site-association على الخادم الخاص بك. |
Couldn't communicate with a helper application. | 1004 (Failed) | فشل ملحق مزود الاعتماد في الاستجابة. عابر - إعادة المحاولة مناسبة. |
Request already in progress for specified application identifier. | 1004 (Failed) | تم إطلاق طلب ASAuthorization مكرر بينما كان أحدهما معلقاً. حالة السباق في التطبيق. |
Stolen Device Protection is enabled and biometry is required. | 1004 (Failed) | تمنع حماية الأجهزة المسروقة في نظام التشغيل iOS 17+ المصادقة البيومترية في مواقع غير مألوفة. غير قابل للتنفيذ من قبل المطورين، ولكنه يستحق الظهور للمستخدم. |
(AuthenticationServicesCore.ASCABLEClient.ClientError error 2.) | مجال منفصل | فشلت مصافحة البلوتوث عبر الأجهزة (المهجنة / CABLE). |
(AuthenticationServicesCore.ASCABLEClient.ClientError error 3.) | مجال منفصل | فشل اتصال بلوتوث عبر الأجهزة. |
رسائل "لا توجد بيانات اعتماد" المترجمة (الرمز 1005):
عند تعيين preferImmediatelyAvailableCredentials ولم يكن هناك مفتاح مرور، يُرجع iOS الرمز 1005 (NotInteractive) مع رسالة مترجمة بلغة جهاز المستخدم. هذا فريد للتطبيقات الأصلية - لا تعرض متصفحات الويب هذه الإشارة أبداً. تبدأ الرسالة دائماً بـ The operation couldn't be completed. متبوعة بالنص المترجم:
| اللغة | الرسالة |
|---|---|
| الصينية المبسطة | 没有可用于登录的凭证。 |
| الفيتنامية | Không có sẵn thông tin để đăng nhập. |
| العربية | لا تتوفر بيانات اعتماد لتسجيل الدخول. |
| الإسبانية | No hay ninguna credencial disponible para iniciar sesión. |
| الصينية (التقليدية) | 沒有可用於登入的憑證。 |
| الكورية | 로그인을 위한 자격 증명이 없습니다. |
| الفرنسية (كندا) | Aucun identifiant disponible pour la connexion. |
| البرتغالية (البرازيل) | Nenhuma credencial disponível para login. |
| الفرنسية (فرنسا) | Aucune information d'identification n'est disponible pour procéder à la connexion. |
| التايلاندية | ไม่มีข้อมูลประจำตัวสำหรับเข้าสู่ระบบ |
| الإيطالية | Non ci sono credenziali disponibili per l'accesso. |
| الهولندية | Geen inloggegevens beschikbaar. |
| اليابانية | ログイン用の資格情報がありません。 |
| التركية | Oturum açmak için kullanılabilecek kimlik bilgisi yok. |
عادةً ما تعمل أجهزة الإعدادات المحلية باللغة الإنجليزية على حل "عدم وجود بيانات اعتماد" على مستوى واجهة برمجة التطبيقات قبل أن يعرض إطار عمل ASAuthorization خطأ محلياً، ولهذا السبب لا يظهر أي متغير باللغة الإنجليزية أعلاه. برمجياً، قم دائماً بالمطابقة على الرمز 1005 بدلاً من تحليل هذه السلاسل.
يعرض Android أخطاء مفتاح المرور من خلال واجهة برمجة تطبيقات Credential Manager (androidx.credentials). تتضمن رسائل الخطأ رسالة أساسية وغالباً cause تحتوي على تفاصيل إضافية. بالمقارنة مع iOS، يوفر Android أنواع أخطاء أكثر تنظيماً وأسباباً أكثر وضوحاً لمشكلات التكوين.
إلغاء المستخدم واكتشاف بيانات الاعتماد:
| الخطأ | ملاحظات |
|---|---|
User cancelled the operation | رفض المستخدم مطالبة مفتاح المرور. المكافئ لـ NotAllowedError. ملاحظة: يُرجع مدير الاعتماد أيضاً User canceled the request (تهجئة الولايات المتحدة) من مسار رمز مختلف - كلاهما متطابقان. |
Excluded credential matches existing credential | يوجد مفتاح مرور بالفعل لمعرف بيانات الاعتماد هذا. المكافئ لـ InvalidStateError. على عكس iOS، تختلف الرسالة عن إلغاء المستخدم. |
No create options available. | لا يوجد مزود بيانات اعتماد مؤهل يمكنه معالجة طلب الإنشاء. عادةً ما يعني هذا أن خدمات Google Play قديمة أو لا يوجد مزود بيانات اعتماد يدعم إنشاء مفتاح المرور. |
أخطاء التكوين والأمان:
| الخطأ | ملاحظات |
|---|---|
Passkeys not supported for this app | روابط الأصول الرقمية (assetlinks.json) مفقودة أو لا تحتوي على بصمة شهادة توقيع التطبيق. المكافئ لـ SecurityError. |
Https failed: respCode=301, url=https://<domain>/.well-known/assetlinks.json | يُرجع ملف assetlinks.json إعادة توجيه بدلاً من HTTP 200. يتطلب Android الملف الموجود في عنوان URL الدقيق دون عمليات إعادة توجيه. |
The incoming request cannot be validated | لا يمكن لمدير الاعتمادات التحقق من الطلب ضد روابط الأصول الرقمية. |
RP ID cannot be validated. | معرّف الطرف المعتمد في خيارات WebAuthn لا يتطابق مع assetlinks.json. |
Screen lock is missing. | لم يتم تكوين رمز PIN أو النمط أو المقاييس الحيوية على الجهاز. تتطلب مفاتيح المرور التحقق من المستخدم. يعادل ConstraintError. |
Cannot find an eligible account. | لا يوجد حساب Google على الجهاز مؤهل لإنشاء مفتاح المرور (نادر، عادةً ما تكون إعدادات مؤسسة مخصصة). |
أخطاء المنصة والمصادق:
| الخطأ | ملاحظات |
|---|---|
Unsuccessful result from folsom activity. | فشل داخلي في خدمات Google Play. "Folsom" هو أحد مكونات GMS لعمليات مفتاح المرور. عابر - إعادة المحاولة مناسبة. |
Can't find the proper key to decrypt the private key from WebauthnCredentialSpecifics. | يوجد مفتاح مرور متزامن ولكن لا يمكن للجهاز فك تشفير مفتاحه الخاص. حالة مزامنة Google Password Manager غير متسقة - تمت مزامنة بيانات الاعتماد من جهاز آخر ولكن مفتاح فك التشفير غير متوفر. غير قابل للتنفيذ من قبل المطورين. |
Operation was interrupted (السبب: The UI was interrupted - please try again.) | تمت مقاطعة واجهة مستخدم Credential Manager بسبب نشاط آخر (مكالمة واردة، دوران الشاشة، تطبيق في الخلفية). المكافئ لـ AbortError. |
Unknown credential error | خطأ عام جامع عندما لا ينطبق أي نوع خطأ محدد. عادةً ما يكون عابراً. |
timeout (السبب: Canceled) | انتهت مهلة عملية Credential Manager قبل أن يكمل المستخدم التحقق البيومتري. |
يوضح الرسم البياني التالي كيف تتصل جميع الطبقات التي تمت مناقشتها أعلاه - البنية التحتية، والبيئة، ونوع العملية، والتصنيف، والكشف - من طرف إلى طرف. هذا هو النموذج العقلي الذي يجب أن تفكر فيه عند تصميم تتبع الأخطاء الخاص بك.
الفكرة الأساسية: لا يكون error.name الخام منطقياً إلا بمجرد معرفة أي طبقة من البيئة أنتجته، والعملية التي كانت قيد التشغيل، وما إذا كان الخطأ متوقعاً أو غير متوقع. تغطي الأقسام أدناه ما يجب تسجيله وكيفية التصرف بناءً عليه.
يمكن إجراء معظم تصنيف الأخطاء في هذه المقالة باستخدام إشارات من جانب العميل وحده. تلتقط حزمة تطوير البرامج (SDK) للمراقبة في الواجهة الأمامية فقط سياقاً كافياً لتصنيف الغالبية العظمى من أخطاء WebAuthn. هذه أيضاً هي الطريقة التي تم بها تصميم مجموعة أدوات التطوير للمراقبة (SDK) من Corbado: تعالج الطبقة الموجودة على جانب العميل إسناد الأخطاء، والتوقيت، وسياق العملية، واكتشاف النظام الأساسي. يضيف التسجيل من جانب الخادم طبقة ثانية للفشل الذي لا يمكن رؤيته إلا في النهاية الخلفية.
الشرط الأساسي: يجب أن تكون كل محاولة قابلة للدمج من البداية إلى النهاية. يربط معرف الارتباط المشترك (مثل auth_flow_id) السياق من جانب العميل بنتيجة تحقق الخادم.
| الإشارة | سبب أهميتها |
|---|---|
error.name + مجموعة السبب المطبع | خطأ المتصفح الخام + تصنيفك |
| نوع العملية | واجهة مستخدم مشروطة، تسجيل دخول نمطي، إنشاء يدوي، إنشاء مشروط، إضافة تلقائية. المصادقة عبر الأجهزة (CDA) هي وحش معقد بحد ذاته. |
| سياق البيئة الكامل | نظام التشغيل + الإصدار، المتصفح + الإصدار، العلامة التجارية/طراز الجهاز، إعدادات المصادق (على سبيل المثال، هل تم تمكين GPM؟) |
| سياق المصادق / مدير بيانات الاعتماد | كسر الامتداد والمزود |
| وقت الخطأ من بداية العملية | رفض فوري (<1s) مقابل إلغاء المستخدم (1-15s) مقابل المهلة (30s+) |
| حالة الشبكة / الاتصال | غالباً ما تظهر أخطاء الشبكة كأخطاء للعميل. تتبع ما إذا كان المستخدم غير متصل بالإنترنت وضع السجلات في قائمة الانتظار لإرسالها عند استعادة الاتصال. |
| ما إذا ظهرت واجهة الاستجابة السريعة (QR) / الهجينة | الفشل المحلي مقابل فشل عبر الأجهزة |
معرف الارتباط (auth_flow_id) | الانضمام إلى سجلات الخادم |
تحدث حالات فشل التحقق من الخادم بعد أن يعرض المتصفح بيانات الاعتماد وتحدياً موقعاً. يجب أن تكون هذه الأخطاء أخطاء منظمة برموز صريحة، وليست مختلطة في نفس دلو أسماء DOMException الخاصة بجانب العميل. انظر: تنفيذ خادم WebAuthn.
| الإشارة | سبب أهميتها |
|---|---|
| عدم تطابق التحدي / تحدي منتهي الصلاحية | مشاكل توقيت الجلسة أو إعادة التشغيل |
| عدم تطابق الأصل / معرف RP | أخطاء تكوين متعددة المجالات |
| توقيع غير صالح / لم يتم العثور على بيانات اعتماد | بيانات اعتماد محذوفة أو تالفة. الحالة الشائعة: تسجيل الدخول بواجهة مستخدم مشروطة باستخدام مفتاح مرور قام المستخدم بالفعل بحذفه من جانب الخادم. استخدم واجهة برمجة تطبيقات الإشارة للحفاظ على مزامنة قوائم بيانات اعتماد العميل والخادم. |
| عدم تطابق مقبض المستخدم | مشاكل تعيين الحساب |
معرف الارتباط (auth_flow_id) | الانضمام إلى سياق جانب العميل |
إذا كنت تريد نموذج قمع كامل (الانقطاعات حسب الخطوة والتحويل بين الخطوات)، راجع: بيانات القياس عن بُعد لمفتاح المرور لفهم الانقطاعات.
اشترك في Passkeys Substack للحصول على آخر الأخبار.
ومع وجود هذه البيانات في مكانها الصحيح، يصبح الاستنتاج بسيطاً: تصبح معظم "الأخطاء" إما إصلاحات لتجربة المستخدم، أو إصلاحات للتغطية، أو إصلاحات للتكوين. ولكن بناء هذا التصنيف والحفاظ عليه بنفسك هو عمل مستمر كبير.
تسجل قائمة التحقق من التسجيل أعلاه الإشارات الخام. في الإنتاج على نطاق واسع، لا يكفي error.name وحده. يعد بناء هذا التصنيف بنفسك عملاً مستمراً كبيراً: تتغير رسائل الأخطاء مع كل متصفح وإصدار نظام تشغيل، ويقدم مزودو مدير كلمات المرور تحديثات تغير سلوك الحفل، وتظهر توقيعات أخطاء جديدة مع كل ميزة يتم إطلاقها.
error.name وحده#يمكن أن يعني NotAllowedError نفسه ستة أشياء مختلفة اعتماداً على ثلاثة أبعاد لا تفصلها المتصفحات لك:
| البعد | ما تعطيك إياه المتصفحات | ما تحتاجه بالفعل | مثال |
|---|---|---|---|
| سياق العملية | NotAllowedError | هل كانت واجهة مستخدم مشروطة، أو تسجيل دخول نمطي، أو إنشاء يدوي، أو إنشاء مشروط، أو إضافة تلقائية؟ | يعرض Android نفس الخطأ "غير معروف" لرفض تسجيل الدخول (متوقع) وفشل الإنشاء (غير متوقع) |
| التوقيت | لا توجد بيانات مدة | رفض فوري (<1s) مقابل إلغاء المستخدم (1-15 ثانية) مقابل مهلة (30 ثانية فما فوق) | 200 مللي ثانية = رفض البيئة؛ 5 ثوانٍ = رأى المستخدم مربع الحوار وألغى؛ 35 ثانية = مهلة |
| النظام الأساسي + المصادق | error.name عام | نظام التشغيل، والمتصفح، والإصدار، ومدير بيانات الاعتماد لكل خطأ | يظهر كل من "رفض المستخدم لمربع الحوار" على Chrome و "الملء التلقائي غير متاح" على Safari كـ NotAllowedError |
هذه هي المشكلة التي تم تصميم حزمة أدوات المراقبة من Corbado لحلها. إنها تكامل واجهة أمامية خفيف الوزن يجلس أعلى تطبيق مفتاح المرور الحالي الخاص بك، ويعمل مع أي خادم WebAuthn وأي موفر هوية (IDP)، ويصنف كل خطأ WebAuthn عبر الأبعاد الثلاثة تلقائياً:
| القدرة | ما يفعله |
|---|---|
| إسناد الخطأ | يلتقط نظام التشغيل، وإصدار نظام التشغيل، والمتصفح، وإصدار المتصفح، والمصادق مع كل محاولة حفل |
| وضع العملية | يربط كل خطأ بالعملية المحددة (واجهة المستخدم المشروطة، تسجيل الدخول النمطي، الإنشاء اليدوي، الإنشاء المشروط، الإضافة التلقائية) بحيث يحل نفس NotAllowedError للأسباب الجذرية المختلفة |
| التوقيت من بداية الإجراء | يسجل المدة من بدء الحفل للتمييز بين الرفض الفوري، وإلغاءات المستخدم، والمهلات دون التخمين |
| التصنيف الذكي للأخطاء | يتطابق مع سياق الخطأ الكامل (وليس الاسم فقط)، ويقوم بالتطبيع عبر بيئات متنوعة (نظام التشغيل، والأجهزة، والإعدادات). يعطي الأولوية لمجموعات الأخطاء المميزة مثل CDA مقابل الأخطاء المحلية، ويميز الأخطاء المتوقعة (إلغاء المستخدم) عن الأخطاء غير المتوقعة (فشل النظام). |
| تجزئة مدير كلمات المرور | يكتشف متى تعترض إضافات مدير الاعتماد (Bitwarden, 1Password, LastPass) الاحتفالات وتعيد استجابات غير قياسية، ويفصل الإخفاقات التي تسببها الإضافات عن إخفاقات المنصة |
هذه هي طبقة المراقبة (Observe): الرؤية لما يحدث، دون تغيير تنفيذك.
تدعم وحدة تحكم الإدارة في Corbado مسارين للتحقيق:
من أعلى إلى أسفل (لوحة القيادة إلى السبب الجذري):
من أسفل إلى أعلى (أنماط الأخطاء إلى التأثير):
كلا المسارين يتقاربان: من أعلى إلى أسفل يخبرك بأن هناك خطأ ما، ومن أسفل إلى أعلى يخبرك بالسبب. يربط مساعد تحليلات الذكاء الاصطناعي (AI Analytics Assistant) بين الاثنين من خلال السماح لك بطرح أسئلة باللغة الطبيعية عبر كل من بيانات الخطأ ومقاييس التبني.
بالنسبة للفرق التي ترغب في التصرف بناءً على هذه الإشارات، يمكنها الانتقال إلى التبني (Adopt)، الذي يضيف ذكاء مفتاح المرور إلى الاحتفالات التلقائية، وتحسين مطالبات التسجيل، ومعالجة حالات مفتاح المرور المعطلة. بالنسبة للبيئات المنظمة أو عمليات النشر على نطاق واسع، يضيف المؤسسات (Enterprise) استضافة المستأجر الفردي، وتكامل SIEM، والتكوين المتوافق مع PSD2.
احصل على ورقة بيضاء مجانية حول passkeys للمؤسسات.
أسماء أخطاء WebAuthn ليست حكماً. إنها تلميحات - وتصبح قابلة للتنفيذ فقط عند ربطها بنوع العملية والتوقيت وسياق النظام الأساسي.
NotAllowedError)، ودورة حياة التطبيق / التزامن (AbortError)، وسياق الأمان / التكوين (SecurityError)، أو أخطاء الخيار / الحالة (InvalidStateError, ConstraintError, DataError). الغالبية العظمى من الحجم هو NotAllowedError، ومعظم هذا السلوك متوقع (رفض المستخدم للمطالبة).NotAllowedError؟ استخدم التوقيت (الرفض الفوري مقابل إلغاء المستخدم مقابل المهلة)، ومؤشر الاستجابة السريعة / الهجين (عدم تطابق التوفر)، وسياق تنشيط المستخدم (خاصة على iOS/Safari)، ونوع العملية (واجهة مستخدم مشروطة مقابل تسجيل الدخول النمطي مقابل إنشاء مفتاح مرور مقابل إنشاء مشروط). لا تعامل جميع NotAllowedError كوضع فشل واحد.error.name نفسه أثناء تسجيل الدخول بواجهة مستخدم مشروطة إشارة مختلفة تماماً عما هو عليه أثناء الإنشاء المشروط أو الإنشاء اليدوي لمفتاح المرور (رفض المستخدم لمربع الحوار). تسجيل نوع العملية بجانب الخطأ هو ما يحول NotAllowedError العام إلى دلو قابل للتنفيذ.error.name، ونوع العملية، ووقت الخطأ من بداية العملية، ونوع التدفق، وما إذا تم عرض واجهة مستخدم الاستجابة السريعة / الهجينة، ونظام التشغيل/المتصفح/الجهاز (بما في ذلك الإصدارات)، ومعرف الارتباط (auth_flow_id) ورفض تحقق الخادم كرموز صريحة.هناك قاعدتان عامتان تتقاطعان مع جميع أنواع الأخطاء: لا تعرض أبداً أخطاء المتصفح الخام للمستخدمين - قم دائماً بتوفير مسار احتياطي واضح - وافصل المحاولات المحلية عن المحاولات الهجينة/الاستجابة السريعة (QR) عبر الأجهزة، لأنها تفشل لأسباب مختلفة وتحتاج إلى إصلاحات مختلفة. على نطاق واسع، يعد الحفاظ على تصنيف الأخطاء عبر المتصفحات وإصدارات نظام التشغيل ومديري كلمات المرور عملاً مستمراً. فكر في استخدام حزمة أدوات تطوير للمراقبة (SDK) مع مكتبة أنماط مُدارة بدلاً من بناء ذلك من الصفر.
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 →
على الويب، تدمج المتصفحات كلتا الحالتين في NotAllowedError لأسباب تتعلق بالخصوصية، لذا لا يمكنك التمييز بينهما مباشرة. استخدم التوقيت كبديل: الخطأ تحت ثانية واحدة يعني عادةً رفض البيئة أو عدم توفر الإمكانية، بينما 1-15 ثانية تشير إلى أن المستخدم رأى مربع الحوار وتجاهله. في تطبيقات iOS و Android الأصلية، يوفر تعيين preferImmediatelyAvailableCredentials قبل الطلب إشارة "لا توجد بيانات اعتماد" واضحة (رمز iOS 1005، و GetCredentialRequest في Android) قبل عرض أي واجهة مستخدم.
في عمليات نشر مفتاح المرور المحسّنة واسعة النطاق، أكثر من 95٪ من أخطاء WebAuthn المسجلة هي إحباطات متوقعة من قبل المستخدم، وليست إخفاقات في النظام. إن تتبع أعداد error.name الأولية دون فصل "مربع حوار رفضه المستخدم" عن الإخفاقات الحقيقية يؤدي إلى تضخيم مقاييس الخطأ ويخفي التراجعات الحقيقية المخفية داخل حجم NotAllowedError. قسّم أعدادك حسب نوع العملية وتعامل مع دلاء إلغاء المستخدم بشكل منفصل عن الأخطاء غير المتوقعة مثل SecurityError و ConstraintError و DataError.
يعني رمز iOS 1005 (NotInteractive) أنه لا يوجد مفتاح مرور متاح على الجهاز عند تعيين preferImmediatelyAvailableCredentials على ASAuthorizationController، ولم يتم عرض واجهة مستخدم للمستخدم. هذه هي إشارة "لا يوجد مفتاح مرور على هذا الجهاز" النظيفة التي لا تستطيع متصفحات الويب توفيرها بسبب قيود الخصوصية. صنف دائماً بناءً على الرمز الرقمي، وليس على localizedDescription، لأن رسائل Apple مترجمة إلى أكثر من 30 لغة ويمكن أن تتغير عبر إصدارات نظام التشغيل.
أثناء الإنشاء المشروط، تُعد الأخطاء NotAllowedError و AbortError و InvalidStateError نتائج متوقعة ويجب تجاهلها بصمت بدلاً من ظهورها كأخطاء. يشير NotAllowedError إلى أن الملء التلقائي غير متاح أو أن الصفحة فقدت التركيز، بينما يعني InvalidStateError أن مفتاح المرور موجود بالفعل في المزود. قبل محاولة الاتصال، استخدم getClientCapabilities() للتحقق من دعم conditionalCreate والتحقق من حالة رؤية المستند لتجنب تضخيم عدد الأخطاء.
التقط نوع العملية (واجهة مستخدم مشروطة، تسجيل دخول نمطي، إنشاء يدوي، إنشاء مشروط أو إضافة تلقائية)، ووقت الخطأ من بداية العملية، وإصدار نظام التشغيل، وإصدار المتصفح، وطراز الجهاز، وما إذا ظهرت واجهة الاستجابة السريعة / الهجينة ومعرف ارتباط للانضمام إلى سجلات جانب الخادم. يجب تسجيل إخفاقات التحقق من الخادم مثل عدم تطابق التحدي، والتوقيع غير الصالح، وعدم العثور على بيانات اعتماد كرموز مهيكلة صريحة، وعدم خلطها في نفس سلة أسماء DOMException الخاصة بجانب العميل. تسمح هذه الإشارات معاً بتصنيف الغالبية العظمى من الأخطاء إلى مجموعات قابلة للتنفيذ دون تخمين.
مقالات ذات صلة
جدول المحتويات