यह पेज अपने-आप अनुवादित किया गया है। मूल अंग्रेज़ी संस्करण पढ़ें यहाँ.
उत्पादन (production) में, WebAuthn त्रुटियाँ भ्रमित करने वाली होती हैं क्योंकि ब्राउज़र DOMException नामों का एक छोटा सा सेट (जैसे NotAllowedError) उजागर करते हैं जो कई अंतर्निहित कारणों का प्रतिनिधित्व कर सकते हैं। इसके अलावा, अधिकांश "त्रुटियाँ" - अनुकूलित बड़े पैमाने की तैनाती में अक्सर 95% से ऊपर - वास्तव में अपेक्षित व्यवहार (उपयोगकर्ता ने ऑपरेटिंग सिस्टम पासकी (passkey) प्रॉम्प्ट को रद्द कर दिया) होती हैं।
Passkeys Debugger में passkey flows के साथ experiment करें.
महत्वपूर्ण: गोपनीयता कारणों से, ब्राउज़र यह अंतर नहीं करते हैं कि उपयोगकर्ता ने सक्रिय रूप से रद्द किया है या कोई पासकी मौजूद नहीं थी। हालाँकि, कुछ स्थितियों में और पर्याप्त संदर्भ के साथ, वेब और नेटिव प्लेटफ़ॉर्म दोनों पर, इनमें से कुछ मामलों को समय (timing) जैसे संकेतों का उपयोग करके अलग किया जा सकता है।
यदि आप इन नामों के लिए विहित परिभाषाएँ चाहते हैं, तो MDN DOMException से प्रारंभ करें। WebAuthn-विशिष्ट स्थितियों के लिए जो इन अपवादों को जन्म देती हैं (और ब्राउज़र को क्या लागू करना आवश्यक है), W3C Web Authentication spec देखें।
यदि आप सभी त्रुटियों को "बग" के रूप में मानते हैं, तो आप गलत काम करेंगे:
NotAllowedError के ढेर के अंदर छिपे वास्तविक प्रतिगमन को याद करेंगेइस लेख में हम उत्तर देते हैं:
NotAllowedError को कार्रवाई योग्य बकेट (कैंसल बनाम टाइमआउट बनाम उपलब्धता) में कैसे अलग करते हैं?NotAllowedError एक सतही संकेत है, कोई मूल कारण नहीं। संदर्भ के आधार पर इसका अर्थ कैंसल, टाइमआउट, "कोई स्थानीय क्रेडेंशियल नहीं", या उपयोगकर्ता सक्रियता का न होना हो सकता है।NotAllowedError का अर्थ अलग-अलग होता है।<1s), उपयोगकर्ता-कैंसल (1-15s) और टाइमआउट (30s+) मौलिक रूप से भिन्न श्रेणियां हैं।AbortError आमतौर पर एक जीवनचक्र/समवर्ती समस्या है (नेविगेशन, री-रेंडर, कई इन-फ़्लाइट अनुरोध)।SecurityError लगभग हमेशा कॉन्फ़िगरेशन/संदर्भ है और परिपक्व उत्पादन परिनियोजन में दुर्लभ है।error.name के साथ ऑपरेशन का प्रकार, समय और प्लेटफ़ॉर्म संदर्भ कैप्चर करें ताकि आप त्रुटियों को उन बकेट में वर्गीकृत कर सकें जिन्हें आप वास्तव में ठीक कर सकते हैं।यदि आपको डीबगिंग को अनब्लॉक करने के लिए केवल एक त्वरित मैपिंग की आवश्यकता है, तो इस तालिका से प्रारंभ करें। यह इस बात की ओर पक्षपाती है कि टीमें वास्तव में डैशबोर्ड और सपोर्ट टिकटों में क्या देखती हैं।
error.name | उत्पादन में इसका आमतौर पर क्या अर्थ होता है | पुष्टि करने के लिए क्या जाँचें | पहली कार्रवाई (UX + इंजीनियरिंग) |
|---|---|---|---|
NotAllowedError | उपयोगकर्ता ने शीट को खारिज कर दिया, टाइम आउट हो गया, या उपलब्धता बेमेल एक बकेट में ढह गई। उत्पादन में यह सबसे बड़ा त्रुटि बकेट है। | त्रुटि का समय, क्या QR/हाइब्रिड UI दिखाई दिया, क्या समारोह एक वास्तविक उपयोगकर्ता कार्रवाई से शुरू हुआ | अपेक्षित रूप में व्यवहार करें: UI पुनर्स्थापित करें + फ़ॉलबैक दिखाएं |
AbortError | आपके ऐप (या ब्राउज़र) ने समारोह को निरस्त कर दिया | समारोह के दौरान नेविगेशन/री-रेंडर; समवर्ती WebAuthn कॉल; AbortController.abort() | एक इन-फ़्लाइट अनुरोध लागू करें; मार्ग परिवर्तन रोकें; गर्भपात को सामान्य नियंत्रण प्रवाह के रूप में संभालें |
SecurityError | संदर्भ/नीति की अनुमति नहीं है | उत्पत्ति + RP ID रणनीति; iframe/एम्बेडिंग; HTTPS; फीचर नीति | RP ID/उत्पत्ति कॉन्फ़िगरेशन ठीक करें; एम्बेडिंग नीतियों को मान्य करें; सुरक्षित संदर्भ सुनिश्चित करें |
InvalidStateError | स्थिति बेमेल (अक्सर डुप्लिकेट पंजीकरण) | पंजीकरण बनाम लॉगिन; excludeCredentials; ऑथेंटिकेटर पर मौजूदा क्रेडेंशियल | "पहले से ही नामांकित" के रूप में व्यवहार करें; UX पथ समायोजित करें; विकल्प निर्माण को ठीक करें |
ConstraintError | आवश्यकताएँ पूरी नहीं की जा सकतीं | authenticatorAttachment, userVerification, निवासी कुंजी आवश्यकताएँ | बाधाओं को आराम दें या वैकल्पिक मार्ग/फ़ॉलबैक प्रदान करें। उदाहरण: Android पर स्क्रीन लॉक गायब है |
DataError | इनपुट विकृत/असंगत हैं | base64url एन्कोडिंग; आईडी/चुनौती/उपयोगकर्ता हैंडल प्रारूप | एन्कोडिंग/सीरियलाइजेशन को ठीक करें; विकल्प निर्माण में सत्यापन जोड़ें |
NotSupportedError | प्लेटफ़ॉर्म/ब्राउज़र आपने जो पूछा उसका समर्थन नहीं करता है | OS/ब्राउज़र संस्करण; सुविधा का पता लगाने की धारणाएँ | तुरंत वापस आएँ; खंड रिकॉर्ड करें; असमर्थित वातावरण के लिए पासकी CTA दिखाने से बचें |
UnknownError | प्लेटफ़ॉर्म/ऑथेंटिकेटर सामान्य तरीके से विफल रहा | OS अपडेट के बाद स्पाइक्स; डिवाइस निर्माण; क्रेडेंशियल-मैनेजर प्रदाता की समस्याएं | पुनः प्रयास-अनुकूल UX; बिल्ड नंबर कैप्चर करें; सेगमेंट स्पाइक्स की जांच करें |
एक चीज जिसे याद करना आसान है: एक ही error.name का ऑपरेशन प्रकार के आधार पर बहुत अलग अर्थ हो सकता है। नीचे दिए गए अनुभागों को पढ़ते समय ऑपरेशन संदर्भ को ध्यान में रखें। व्यवहार में, पासकी निर्माण (पंजीकरण) त्रुटियां आमतौर पर बड़े अंतर से लॉगिन त्रुटियों से अधिक होती हैं - उपरोक्त तालिका दोनों पर लागू होती है, लेकिन निर्माण वह जगह है जहां अधिकांश मात्रा रहती है।
आगे, हम NotAllowedError पर गहराई से जाएंगे क्योंकि यह वह है जिसे आप सबसे ज्यादा देखेंगे और जिसे टीमें सबसे अधिक बार गलत समझती हैं।
NotAllowedError अक्सर "पासकी विफल" जैसा दिखता है, लेकिन यह आमतौर पर प्लेटफ़ॉर्म आपको यह बता रहा होता है कि उपयोगकर्ता ने OS UI को पूरा नहीं किया। मुख्य बात यह है कि इसे उन बकेट में विभाजित किया जाए जिन पर आप कार्रवाई कर सकते हैं।
आप ब्राउज़र कंसोल में क्या देखेंगे:
| स्रोत | त्रुटि संदेश |
|---|---|
| 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 ब्राउज़र इंजन और अंतर्निहित कारण के अनुसार भिन्न होता है, लेकिन परिणाम समान होता है: समारोह पूरा नहीं हुआ।
यह लॉगिन और पासकी निर्माण दोनों पर लागू होता है। लॉगिन (सशर्त UI, अनुमति सूची के साथ या उसके बिना मोडल) के दौरान, NotAllowedError का आमतौर पर मतलब है कि उपयोगकर्ता ने समारोह पूरा नहीं किया। पासकी निर्माण के दौरान, वही त्रुटि अलग-अलग कारणों से सामने आती है: उपयोगकर्ता ने निर्माण संवाद को खारिज कर दिया (सशर्त निर्माण काम नहीं किया, या ऑटो-ट्रिगर अपेंड के दौरान पृष्ठ ने फोकस खो दिया)। ऑपरेशन प्रकार यह बदल देता है कि त्रुटि का क्या अर्थ है और आपको इसके बारे में क्या करना चाहिए।
समय अक्सर एक कम आंका गया संकेत है। एक क्लिक के एक सेकंड से भी कम समय के बाद त्रुटि आमतौर पर एक तत्काल अस्वीकृति होती है (वातावरण ऐसा नहीं कर सकता, दस्तावेज़ केंद्रित नहीं है, क्षमता का अभाव है)। कुछ सेकंड के बाद एक त्रुटि एक उपयोगकर्ता कैंसल है (उन्होंने संवाद देखा और आगे न बढ़ने का फैसला किया)। 30+ सेकंड के बाद एक त्रुटि एक टाइमआउट है। नेटिव प्लेटफ़ॉर्म पर, समय विशेष रूप से महत्वपूर्ण है: ऑथेंटिकेटर राउंड-ट्रिप, बायोमेट्रिक प्रॉम्प्ट और क्रेडेंशियल मैनेजर हैंडऑफ़ सभी की विशिष्ट अवधि होती है जो आपको "उपयोगकर्ता दूर चला गया" से "काम नहीं किया" को अलग करने में मदद करती है। आप अभी भी आसानी से अंतर नहीं कर सकते हैं यदि एक पासकी मौजूद थी।
आपको एक आदर्श संकेत की आवश्यकता नहीं है। आपको हर NotAllowedError को समान तरीके से मानने से बचने के लिए पर्याप्त संदर्भ की आवश्यकता है। iOS/Safari पर नीचे विशेष ध्यान दिया गया है क्योंकि इसमें अद्वितीय बाधाएं हैं (पहले के संस्करणों में उपयोगकर्ता सक्रियण आवश्यकताएं), लेकिन कच्चे त्रुटि मात्रा में, Windows और Chromium ब्राउज़र अक्सर किसी भी अन्य प्लेटफ़ॉर्म की तुलना में अधिक NotAllowedError उत्पन्न करते हैं। ये संकेत अक्सर आपको 80% रास्ते तक ले जाते हैं:
| संकेत | संभावित अर्थ | आगे क्या करें |
|---|---|---|
तत्काल विफलता (<1s) | पर्यावरण अस्वीकृति: कोई क्षमता नहीं, दस्तावेज़ केंद्रित नहीं है, सशर्त निर्माण सतह अनुपलब्ध है | सुविधा का पता लगाने की जाँच करें; सुनिश्चित करें कि दस्तावेज़ पर फ़ोकस है; सत्यापित करें कि इस प्लेटफ़ॉर्म पर ऑपरेशन समर्थित है |
| तेज़ कैंसल (1-3s) | आश्चर्यजनक प्रॉम्प्ट / कोई संदर्भ नहीं | प्रॉम्प्ट समय बदलें; कैंसल के बाद कूलडाउन जोड़ें |
| उपयोगकर्ता-लंबाई कैंसल (3-15s) | उपयोगकर्ता ने संवाद देखा और आगे न बढ़ने का फैसला किया | अपेक्षित UX; UI पुनर्स्थापित करें + फ़ॉलबैक दिखाएं |
| टाइमआउट (30s+) | समारोह उपयोगकर्ता कार्रवाई के बिना टाइम आउट हो गया | "पूरा नहीं हुआ" के रूप में बकेट करें; विचार करें कि क्या प्रॉम्प्ट पर ध्यान दिया गया था |
| विफलता से पहले QR/हाइब्रिड UI दिखाई देता है | इस डिवाइस पर कोई स्थानीय क्रेडेंशियल उपलब्ध नहीं है। ध्यान दें: QR कोड निर्णयों के होने से पहले मज़बूती से पता लगाने के लिए एक पासकी इंटेलिजेंस लेयर की आवश्यकता होती है जो जानती हो कि क्या वर्तमान डिवाइस पर एक प्रयोग करने योग्य क्रेडेंशियल मौजूद है। | पासकी ऑफ़र गेट करें; "फ़ोन का उपयोग करें" को स्पष्ट करें; आश्चर्यजनक QR को कम करें |
| iOS/Safari पर केंद्रित और बिना क्लिक/टैप के ट्रिगर किया गया | उपयोगकर्ता सक्रियण गायब है | एक वास्तविक उपयोगकर्ता जेस्चर से समारोह शुरू करें |
| सशर्त निर्माण या ऑटो-ट्रिगर अपेंड के दौरान | ऑटोफ़िल उपलब्ध नहीं है, क्रेडेंशियल पहले से मौजूद है, या पृष्ठ का फोकस खो गया है। सुविधा लॉन्च होने पर सशर्त निर्माण त्रुटियां अचानक और उच्च मात्रा में दिखाई दे सकती हैं, जिससे यह रातोंरात सबसे बड़े त्रुटि स्रोतों में से एक बन जाता है। | सशर्त निर्माण देखें; दस्तावेज़ दृश्यता स्थिति जांचें; कॉल का प्रयास करने से पहले conditionalCreate समर्थन को सत्यापित करने के लिए getClientCapabilities() का उपयोग करें |
यही कारण है कि NotAllowedError उपयोगकर्ता को शायद ही कभी दिखाई देनी चाहिए। यह ऐसा संदेश नहीं है जिस पर उपयोगकर्ता कार्रवाई कर सके।
संदर्भ वर्गीकरण वह भी है जहां सफलता दर सबसे तेजी से विभाजित होती है। Corbado Passkey Benchmark 2026 पासकी प्रमाणीकरण सफलता दर विश्लेषण बड़े पैमाने पर B2C परिनियोजन में ज्ञात-डिवाइस रिटर्न के लिए 95–99% की तुलना में अज्ञात-डिवाइस पहचानकर्ता-प्रथम प्रवाह के लिए 55–95% पर Q1 2026 समापन को मापता है। iOS वेब पहचानकर्ता-प्रथम 85–95% समापन (% CDA 0–5%) पर, Android वेब 70–85% (% CDA 5–10%) पर और macOS वेब 70–85% (% CDA 10–15%) पर है, जबकि Windows वेब 45–60% पहचानकर्ता-प्रथम समापन पर बैठता है जिसमें Windows 11 पर % CDA 55–65% और Windows 10 पर 40–55% है। ज्ञात बनाम अज्ञात डिवाइस संदर्भों को अलग किए बिना NotAllowedError वॉल्यूम पढ़ना दो मौलिक रूप से भिन्न सफलता व्यवस्थाओं को मिलाता है।
उत्पादन में एक बात जो मायने रखती है: कुछ उपयोगकर्ता एजेंट टाइमआउट को TimeoutError के रूप में सामने ला सकते हैं, लेकिन कई टीमें अभी भी डैशबोर्ड में NotAllowedError में टाइमआउट को ढहते हुए देखती हैं। किसी भी तरह से, टाइमआउट को "समारोह पूरा नहीं हुआ" के रूप में मानें और समय और संदर्भ का उपयोग करके बकेट करें।
जब OS शीट को खारिज कर दिया जाता है या टाइम आउट हो जाता है, तो आपका UI तुरंत पुनर्प्राप्त होना चाहिए और शालीनता से प्रतिक्रिया करनी चाहिए। नियमों का एक व्यावहारिक सेट:
मूल बातों से परे:
यदि आपके "कैंसल" वास्तव में अधिक हैं, तो अगला कदम उनके पीछे के मूल कारणों को ठीक करना है: प्रॉम्प्ट समय, QR आश्चर्य और कम उपलब्धता।
उन परिवर्तनों के साथ प्रारंभ करें जो मेट्रिक्स को जल्दी ले जाते हैं:
NotAllowedError बकेट को न बढ़ाएं। सबसे बुनियादी गेट के रूप में isUVPAA() के साथ प्रारंभ करें, फिर बारीक जांच (सशर्त निर्माण, सशर्त गेट, हाइब्रिड ट्रांसपोर्ट, प्लेटफ़ॉर्म ऑथेंटिकेटर) के लिए getClientCapabilities() का उपयोग करें। ध्यान रखें कि डिटेक्शन API OS अपडेट के साथ टूट सकते हैं: iOS 26.2 में एक WebKit बग आया जहाँ isUVPAA() सभी WKWebView-आधारित ब्राउज़रों पर false लौटाता है, भले ही पासकी ठीक से काम कर रही हों, जिससे 10-25% iOS उपयोगकर्ताओं के लिए अचानक NotAllowedError स्पाइक्स हो जाते हैं (getClientCapabilities() के साथ पासकी डिटेक्शन को ठीक करना देखें)।त्रुटि नाम एक गतिशील लक्ष्य हैं। अधिक दानेदार WebAuthn त्रुटियों को जोड़ने के लिए चल रहे प्रस्ताव हैं (उदाहरण के लिए, "कोई क्रेडेंशियल उपलब्ध नहीं है" को "उपयोगकर्ता ने रद्द कर दिया" से अलग करने के लिए)। फरवरी 2026 तक, यह किसी भी ब्राउज़र में लागू नहीं किया गया है, इसलिए संदर्भ और समय के आधार पर अपने स्वयं के कारण बकेट बनाना अभी भी उचित है। यदि आप इस काम को ट्रैक करना चाहते हैं, तो WebAuthn issue #2062 और "New Error Codes" explainer देखें।
शेष त्रुटि नाम कम होते हैं लेकिन फिर भी वे जब सामने आते हैं तो समझने योग्य होते हैं।
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 गलत कॉन्फ़िगर किया गया है, गायब है, या अस्थायी रूप से अनुपलब्ध है। उस महत्वपूर्ण विंडो के दौरान नेटवर्क समस्याएं जब ब्राउज़र इन फ़ाइलों को प्राप्त करता है, विफलताओं का कारण बनेंगी। एक सामान्य अंधा स्थान: यदि आपका होमपेज रखरखाव के लिए डाउन है, तो well-known फाइलें भी ऑफ़लाइन हैं, जो उन पर निर्भर करने वाले सभी आश्रित पक्षों में पासकी समारोहों को तोड़ देती हैं।आप ब्राउज़र कंसोल में क्या देखेंगे:
| स्रोत | त्रुटि संदेश |
|---|---|
| Chrome, Edge | SecurityError: WebAuthn is not supported on sites with TLS certificate errors. |
| कोई भी ब्राउज़र | 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 चीटशीट. passkey कार्यक्रमों के लिए व्यावहारिक मार्गदर्शन, रोलआउट पैटर्न और KPIs।
एक परिपक्व पासकी कार्यान्वयन में ये त्रुटियां दुर्लभ होनी चाहिए। जब वे दिखाई देते हैं, तो वे आम तौर पर संकेत देते हैं कि किसी खंड के लिए विकल्प निर्माण गलत है या प्रवाह गलत स्थिति में है।
आप ब्राउज़र कंसोल में क्या देखेंगे:
| स्रोत | त्रुटि संदेश |
|---|---|
| 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 एक कवरेज सिग्नल है, विश्वसनीयता सिग्नल नहीं। इसका आमतौर पर मतलब है कि कोई खंड वह नहीं कर सकता जो आपने पूछा था (OS/ब्राउज़र बहुत पुराना, लापता क्षमता, सुविधा सक्षम नहीं)।
आप ब्राउज़र कंसोल में क्या देखेंगे:
| स्रोत | त्रुटि संदेश |
|---|---|
| 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 |
पहले दो वास्तविक NotSupportedError DOMExceptions हैं। TypeError प्रविष्टियां तकनीकी रूप से एक अलग अपवाद प्रकार हैं लेकिन समस्या के एक ही वर्ग का प्रतिनिधित्व करती हैं: ब्राउज़र या वातावरण आपने जो पूछा है उसका समर्थन नहीं करता है। JSON सीरियलाइज़ेशन TypeError परिवार व्यवहार में स्वयं NotSupportedError DOMException की तुलना में कहीं अधिक आम है (नीचे देखें)।
सामान्य कारणों में शामिल हैं:
JSON सीरियलाइज़ेशन परिवार उत्पादन में NotSupportedError-श्रेणी की विफलताओं का सबसे बड़ा स्रोत है। तकनीकी रूप से ये TypeError (मिसिंग मेथड) के रूप में सामने आते हैं, न कि DOMException के रूप में, लेकिन यह वह जगह है जहाँ आप उनका सामना करेंगे। दो अलग-अलग मूल कारण:
navigator.credentials है लेकिन PublicKeyCredential.parseCreationOptionsFromJSON / parseRequestOptionsFromJSON नहीं है। यह इस त्रुटि परिवार का लगभग 90% हिस्सा है, जो पुराने Safari और Chrome संस्करणों में केंद्रित है। यदि आपकी क्लाइंट लाइब्रेरी बिना फ़ॉलबैक के इन विधियों पर निर्भर करती है, तो यह महत्वपूर्ण त्रुटि मात्रा उत्पन्न करती है।.toJSON() को तोड़ते हैं। Bitwarden, LastPass, या 1Password जैसे एक्सटेंशन समारोह को बीच में रोक सकते हैं और एक ऑब्जेक्ट वापस कर सकते हैं जो एक क्रेडेंशियल जैसा दिखता है लेकिन एक वास्तविक PublicKeyCredential इंस्टेंस नहीं है। इस पर .toJSON() को कॉल करने से या तो थ्रो होता है, अपरिभाषित लौटता है, या ऑब्जेक्ट पूरी तरह से null होता है। यह परिवार का लगभग 10% है लेकिन डिबग करने के लिए विशेष रूप से भ्रामक है क्योंकि त्रुटि संदेश ब्राउज़र द्वारा भिन्न होते हैं (Safari: "Can only call on instances of PublicKeyCredential"; Firefox: "does not implement interface PublicKeyCredential")।हैंडलिंग कुंद और तेज़ होनी चाहिए:
यदि कवरेज ठीक लगता है लेकिन विफलताएं अभी भी विशिष्ट खंडों में होती हैं, तो आप UnknownError के रूप में सामने आने वाले प्लेटफ़ॉर्म-लेयर मुद्दों से निपट सकते हैं।
UnknownError ऑथेंटिकेटर/OS विफलताओं के लिए एक कैच-ऑल है जो अन्य श्रेणियों में सफाई से मैप नहीं करते हैं। यह अक्सर क्षणिक होता है, लेकिन OS अपडेट के बाद भी यह बढ़ सकता है।
आप ब्राउज़र कंसोल में क्या देखेंगे:
| स्रोत | त्रुटि संदेश |
|---|---|
| Chrome (Android) | UnknownError: An unknown error occurred while talking to the credential manager. |
| कोई भी ब्राउज़र | UnknownError: The operation failed for an unknown transient reason. |
| कोई भी ब्राउज़र | UnknownError: Either the device has received unexpected request data, or the device has been reconfigured since the request was made. |
| कोई भी ब्राउज़र | 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 या अवर्गीकृत अपवादों के रूप में सामने आते हैं। यदि आप बिना किसी OS-स्तरीय स्पष्टीकरण के विशिष्ट ब्राउज़रों में केंद्रित त्रुटि स्पाइक्स देखते हैं, तो जांचें कि क्या क्रेडेंशियल मैनेजर एक्सटेंशन शामिल है।
अब तक हमने वेब ब्राउज़र त्रुटि नामों को कवर किया है। लेकिन यदि आप नेटिव ऐप भी शिप करते हैं, तो त्रुटि परिदृश्य अलग है - और कुछ मायनों में, काफी बेहतर है।
उपरोक्त सब कुछ वेब ब्राउज़रों को कवर करता है। नेटिव ऐप्स - ASAuthorization फ्रेमवर्क के साथ iOS, Credential Manager के साथ Android - समान मौलिक त्रुटि श्रेणियों को साझा करते हैं लेकिन महत्वपूर्ण तरीकों से भिन्न होते हैं:
"कोई क्रेडेंशियल नहीं" एक अलग संकेत है। वेब पर, ब्राउज़र गोपनीयता के लिए "कोई क्रेडेंशियल उपलब्ध नहीं" और "उपयोगकर्ता रद्द" को एक ही NotAllowedError में ढहा देते हैं। नेटिव पर, iOS (ASAuthorizationController) पर preferImmediatelyAvailableCredentials या Android (GetCredentialRequest) पर setPreferImmediatelyAvailableCredentials(true) का उपयोग करने से OS को केवल डिवाइस पर पहले से मौजूद क्रेडेंशियल प्रस्तुत करने और कोई भी मौजूद न होने पर तुरंत विफल होने के लिए कहा जाता है। यह आपको एक साफ "कोई क्रेडेंशियल नहीं" रिटर्न देता है जो वेब प्रदान नहीं कर सकता।
क्रेडेंशियल प्रदाता की स्थिति दिखाई दे रही है। कुछ स्थितियों में नेटिव प्लेटफ़ॉर्म आपको बता सकते हैं कि जब कोई क्रेडेंशियल प्रदाता (Google Password Manager, iCloud Keychain, 1Password, आदि) स्थापित, कॉन्फ़िगर, या डिफ़ॉल्ट के रूप में सेट नहीं है और उस पर प्रतिक्रिया करते हैं। वेब पर, यह जानकारी अपारदर्शी NotAllowedError संदेशों के पीछे छिपी होती है।
त्रुटि संदेश अधिक विशिष्ट हैं। क्योंकि उपयोगकर्ता ने ऐप इंस्टॉल कर लिया है - और इस तरह रिलाइंग पार्टी के साथ विश्वास संबंध स्थापित कर लिया है - OS अधिक नैदानिक विवरण सामने लाता है। गोपनीयता संबंधी विचार जो वेब ब्राउज़रों को अस्पष्ट होने के लिए मजबूर करते हैं, उसी तरह लागू नहीं होते हैं जब ऐप पहले से ही डिवाइस पर होता है। iOS उपयोगकर्ता की डिवाइस भाषा में स्थानीयकृत संदेश लौटाता है। Android कारण श्रृंखलाओं के साथ संरचित त्रुटि प्रकार देता है। इससे डिबगिंग आसान हो जाती है लेकिन इसका मतलब है कि आपके त्रुटि प्रबंधन को स्थानीयकरण और प्लेटफ़ॉर्म-विशिष्ट त्रुटि प्रारूपों का हिसाब रखना होगा।
iOS ASAuthorization फ्रेमवर्क के माध्यम से पासकी त्रुटियों को सामने लाता है। सभी त्रुटियां authorizationController(controller:didCompleteWithError:) डेलिगेट कॉलबैक में NSError ऑब्जेक्ट के रूप में आती हैं।
डोमेन + कोड द्वारा वर्गीकृत करें, संदेश स्ट्रिंग द्वारा नहीं। प्राथमिक त्रुटि डोमेन com.apple.AuthenticationServices.AuthorizationError (ASAuthorizationError.errorDomain) है। let nsError = error as NSError के साथ त्रुटि को कास्ट करें और .domain और .code पर मिलान करें। उत्पादन में कभी भी .localizedDescription पर मिलान न करें - Apple के संदेशों को 30+ भाषाओं में स्थानीयकृत किया जाता है और OS संस्करणों में बदला जा सकता है। नीचे सूचीबद्ध संदेश स्ट्रिंग लॉग में त्रुटियों को पहचानने के लिए उपयोगी हैं, लेकिन वे वर्गीकरण मानदंड नहीं हैं।
सार्वजनिक ASAuthorizationError कोड:
| कोड | नाम | कब से | इसका क्या मतलब है |
|---|---|---|---|
| 1000 | Unknown | iOS 13 | उत्पादन में नहीं दिखाई देना चाहिए। सामान्य कैच-ऑल। |
| 1001 | Canceled | iOS 13 | उपयोगकर्ता ने पासकी शीट को खारिज कर दिया। कुल मिलाकर सबसे आम त्रुटि - NotAllowedError समतुल्य। खाली userInfo और बिना किसी अंतर्निहित त्रुटि के साफ संकेत। |
| 1002 | InvalidResponse | iOS 13 | फ्रेमवर्क-स्तरीय भ्रष्टाचार। व्यवहार में दुर्लभ। |
| 1003 | NotHandled | iOS 13 | किसी भी प्रदाता ने अनुरोध को नहीं संभाला। एंटाइटेलमेंट और क्रेडेंशियल प्रदाता कॉन्फ़िगरेशन की जांच करें। |
| 1004 | Failed | iOS 13 | सामान्य विफलता। localizedDescription में वास्तविक कारण होता है (उदा. "Application with identifier X is not associated with domain Y")। userInfo में FailureReason स्ट्रिंग हो सकती है, लेकिन NSUnderlyingErrorKey हमेशा पॉप्युलेट नहीं होती है - डोमेन एसोसिएशन विफलताएं अंतर्निहित त्रुटि के लिए शून्य (nil) लौटाती हैं। |
| 1005 | NotInteractive | iOS 15 | preferImmediatelyAvailableCredentials का उपयोग करते समय कोई क्रेडेंशियल उपलब्ध नहीं है। यह साफ़ "नहीं मिला" संकेत है - "इस डिवाइस पर कोई पासकी मौजूद नहीं है" का iOS समतुल्य। कोई UI नहीं दिखाया गया। |
| 1006 | MatchedExcludedCredential | iOS 18 | इस डिवाइस पर इस RP के लिए एक पासकी पहले से मौजूद है। डुप्लिकेट डिटेक्शन के लिए क्लीन सिग्नल - खाली userInfo, कोई NSUnderlyingErrorKey नहीं। वर्गीकरण स्ट्रिंग मिलान के बिना काम करता है। |
| 1007 | CredentialImport | iOS 18.2 | क्रेडेंशियल आयात विफल रहा। |
| 1008 | CredentialExport | iOS 18.2 | क्रेडेंशियल निर्यात विफल रहा। |
| 1009 | PreferSignInWithApple | iOS 26 | उपयोगकर्ता पासकी के बजाय Sign in with Apple पसंद करता है। iOS 26 में नया। |
| 1010 | DeviceNotConfiguredForPasskeyCreation | iOS 26 | डिवाइस में पासकोड या iCloud कीचेन कॉन्फ़िगरेशन का अभाव है। ज्ञात 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) | ऐप का Associated Domains एंटाइटेलमेंट रिलाइंग पार्टी से मेल नहीं खाता है। अपने सर्वर पर 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+ Stolen Device Protection अपरिचित स्थानों में बायोमेट्रिक प्रमाणीकरण को रोकता है। डेवलपर्स द्वारा कार्रवाई योग्य नहीं है, लेकिन उपयोगकर्ता के सामने लाने लायक है। |
(AuthenticationServicesCore.ASCABLEClient.ClientError error 2.) | Separate domain | क्रॉस-डिवाइस प्रमाणीकरण (हाइब्रिड/CABLE) ब्लूटूथ हैंडशेक विफल रहा। |
(AuthenticationServicesCore.ASCABLEClient.ClientError error 3.) | Separate domain | क्रॉस-डिवाइस प्रमाणीकरण ब्लूटूथ कनेक्शन विफल रहा। |
स्थानीयकृत "कोई क्रेडेंशियल नहीं" संदेश (कोड 1005):
जब preferImmediatelyAvailableCredentials सेट किया जाता है और कोई पासकी मौजूद नहीं होती है, तो iOS उपयोगकर्ता की डिवाइस भाषा में स्थानीयकृत संदेश के साथ कोड 1005 (NotInteractive) लौटाता है। यह नेटिव ऐप्स के लिए अद्वितीय है - वेब ब्राउज़र इस संकेत को कभी उजागर नहीं करते हैं। संदेश हमेशा The operation couldn't be completed. के साथ शुरू होता है, जिसके बाद स्थानीयकृत टेक्स्ट होता है:
| भाषा | संदेश |
|---|---|
| Chinese (Simplified) | 没有可用于登录的凭证。 |
| Vietnamese | Không có sẵn thông tin để đăng nhập. |
| Arabic | لا تتوفر بيانات اعتماد لتسجيل الدخول. |
| Spanish | No hay ninguna credencial disponible para iniciar sesión. |
| Chinese (Traditional) | 沒有可用於登入的憑證。 |
| Korean | 로그인을 위한 자격 증명이 없습니다. |
| French (Canada) | Aucun identifiant disponible pour la connexion. |
| Portuguese (Brazil) | Nenhuma credencial disponível para login. |
| French (France) | Aucune information d'identification n'est disponible pour procéder à la connexion. |
| Thai | ไม่มีข้อมูลประจำตัวสำหรับเข้าสู่ระบบ |
| Italian | Non ci sono credenziali disponibili per l'accesso. |
| Dutch | Geen inloggegevens beschikbaar. |
| Japanese | ログイン用の資格情報がありません。 |
| Turkish | Oturum açmak için kullanılabilecek kimlik bilgisi yok. |
अंग्रेजी-लोकेल डिवाइस आमतौर पर API स्तर पर "कोई क्रेडेंशियल नहीं" का समाधान करते हैं, इससे पहले कि ASAuthorization ढांचा स्थानीयकृत त्रुटि लौटाए, यही वजह है कि ऊपर कोई अंग्रेजी संस्करण दिखाई नहीं देता है। प्रोग्रामेटिक रूप से, इन स्ट्रिंग्स को पार्स करने के बजाय हमेशा कोड 1005 पर मिलान करें।
Android Credential Manager API (androidx.credentials) के माध्यम से पासकी त्रुटियों को सामने लाता है। त्रुटि संदेशों में एक प्राथमिक संदेश और अक्सर अतिरिक्त विवरण के साथ एक cause शामिल होता है। iOS की तुलना में, Android कॉन्फ़िगरेशन मुद्दों के लिए अधिक संरचित त्रुटि प्रकार और अधिक स्पष्ट कारण प्रदान करता है।
उपयोगकर्ता रद्दीकरण और क्रेडेंशियल पहचान:
| त्रुटि | टिप्पणियाँ |
|---|---|
User cancelled the operation | उपयोगकर्ता ने पासकी प्रॉम्प्ट को खारिज कर दिया। NotAllowedError समतुल्य। ध्यान दें: क्रेडेंशियल मैनेजर एक अलग कोड पथ से User canceled the request (US स्पेलिंग) भी लौटाता है - दोनों समान हैं। |
Excluded credential matches existing credential | इस क्रेडेंशियल आईडी के लिए एक पासकी पहले से मौजूद है। InvalidStateError समतुल्य। iOS के विपरीत, संदेश उपयोगकर्ता रद्दीकरण से अलग है। |
No create options available. | कोई भी योग्य क्रेडेंशियल प्रदाता निर्माण अनुरोध को नहीं संभाल सकता है। आमतौर पर इसका मतलब है कि Google Play Services पुरानी है या कोई भी क्रेडेंशियल प्रदाता पासकी निर्माण का समर्थन नहीं करता है। |
कॉन्फ़िगरेशन और सुरक्षा त्रुटियां:
| त्रुटि | टिप्पणियाँ |
|---|---|
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. | डिवाइस पर कोई पिन, पैटर्न या बायोमेट्रिक कॉन्फ़िगर नहीं किया गया है। पासकी को उपयोगकर्ता सत्यापन की आवश्यकता होती है। ConstraintError समतुल्य। |
Cannot find an eligible account. | डिवाइस पर कोई भी Google खाता पासकी निर्माण के लिए योग्य नहीं है (दुर्लभ, आमतौर पर कस्टम एंटरप्राइज़ सेटअप)। |
प्लेटफ़ॉर्म और ऑथेंटिकेटर त्रुटियां:
| त्रुटि | टिप्पणियाँ |
|---|---|
Unsuccessful result from folsom activity. | Google Play Services आंतरिक विफलता। "Folsom" पासकी संचालन के लिए एक GMS घटक है। क्षणिक - पुनः प्रयास उचित है। |
Can't find the proper key to decrypt the private key from WebauthnCredentialSpecifics. | एक समन्वयित (synced) पासकी मौजूद है लेकिन डिवाइस इसकी निजी कुंजी को डिक्रिप्ट नहीं कर सकता है। Google Password Manager सिंक स्थिति असंगत है - क्रेडेंशियल को किसी अन्य डिवाइस से समन्वयित किया गया था लेकिन डिक्रिप्शन कुंजी अनुपलब्ध है। डेवलपर्स द्वारा कार्रवाई योग्य नहीं है। |
Operation was interrupted (cause: The UI was interrupted - please try again.) | क्रेडेंशियल मैनेजर UI किसी अन्य गतिविधि (आने वाली कॉल, स्क्रीन रोटेशन, ऐप बैकग्राउंडेड) द्वारा बाधित किया गया था। AbortError समतुल्य। |
Unknown credential error | सामान्य कैच-ऑल जब कोई विशिष्ट त्रुटि प्रकार लागू नहीं होता है। आमतौर पर क्षणिक। |
timeout (cause: Canceled) | उपयोगकर्ता द्वारा बायोमेट्रिक सत्यापन पूरा करने से पहले क्रेडेंशियल मैनेजर ऑपरेशन टाइम आउट हो गया। |
निम्नलिखित आरेख दिखाता है कि ऊपर चर्चा की गई सभी परतें - इन्फ्रास्ट्रक्चर, पर्यावरण, ऑपरेशन प्रकार, वर्गीकरण और डिटेक्शन - एक छोर से दूसरे छोर तक कैसे जुड़ते हैं। यह वह मानसिक मॉडल है जिसे आपको अपनी त्रुटि ट्रैकिंग डिज़ाइन करते समय ध्यान में रखना चाहिए।
मुख्य अंतर्दृष्टि: एक कच्चा error.name केवल तभी समझ में आता है जब आप जानते हैं कि पर्यावरण की किस परत ने इसे उत्पन्न किया, कौन सा ऑपरेशन चल रहा था और क्या त्रुटि अपेक्षित थी या अप्रत्याशित थी। नीचे दिए गए अनुभाग शामिल करते हैं कि क्या लॉग करना है और उस पर कैसे कार्य करना है।
इस लेख में अधिकांश त्रुटि वर्गीकरण अकेले क्लाइंट-साइड संकेतों के साथ किया जा सकता है। एक फ्रंटएंड-ओनली ऑब्ज़र्वेबिलिटी SDK अधिकांश WebAuthn त्रुटियों को वर्गीकृत करने के लिए पर्याप्त संदर्भ कैप्चर करता है। इसी तरह Corbado का ऑब्ज़र्वेबिलिटी SDK भी आर्किटेक्ट किया गया है: क्लाइंट-साइड लेयर त्रुटि एट्रिब्यूशन, समय, ऑपरेशन संदर्भ और प्लेटफ़ॉर्म डिटेक्शन को संभालती है। सर्वर-साइड लॉगिंग उन विफलताओं के लिए एक दूसरी परत जोड़ता है जिन्हें केवल बैकएंड ही देख सकता है।
मुख्य आवश्यकता: हर प्रयास को एंड-टू-एंड जुड़ने योग्य होना चाहिए। एक साझा सहसंबंध आईडी (उदा. auth_flow_id) क्लाइंट-साइड संदर्भ को सर्वर सत्यापन परिणाम से जोड़ता है।
| सिग्नल | यह क्यों मायने रखता है |
|---|---|
error.name + सामान्यीकृत कारण बकेट | कच्ची ब्राउज़र त्रुटि + आपका वर्गीकरण |
| ऑपरेशन प्रकार | सशर्त UI, मोडल लॉगिन, मैन्युअल निर्माण, सशर्त निर्माण, ऑटो-अपेंड। CDA (क्रॉस-डिवाइस ऑथ) अपने आप में एक जटिल जानवर है। |
| पूर्ण पर्यावरण संदर्भ | OS + संस्करण, ब्राउज़र + संस्करण, हार्डवेयर ब्रांड/मॉडल, ऑथेंटिकेटर सेटिंग्स (उदा., GPM सक्षम है?) |
| ऑथेंटिकेटर / क्रेडेंशियल मैनेजर संदर्भ | एक्सटेंशन और प्रदाता टूटना |
| ऑपरेशन शुरू होने से त्रुटि तक का समय | तत्काल अस्वीकृति (<1s) बनाम उपयोगकर्ता कैंसल (1-15s) बनाम टाइमआउट (30s+) |
| नेटवर्क / कनेक्टिविटी स्थिति | नेटवर्क त्रुटियां अक्सर क्लाइंट त्रुटियों के रूप में प्रकट होती हैं। ट्रैक करें कि क्या उपयोगकर्ता ऑफ़लाइन था और कनेक्टिविटी बहाल होने पर भेजने के लिए लॉग कतारबद्ध करें। |
| क्या QR/हाइब्रिड UI दिखाई दिया | स्थानीय बनाम क्रॉस-डिवाइस विफलता |
सहसंबंध आईडी (auth_flow_id) | सर्वर लॉग के साथ जुड़ें |
ब्राउज़र द्वारा एक क्रेडेंशियल और हस्ताक्षरित चुनौती लौटाए जाने के बाद सर्वर सत्यापन विफलताएं होती हैं। ये स्पष्ट कोड के साथ संरचित त्रुटियां होनी चाहिए, न कि क्लाइंट-साइड DOMException नामों के समान बकेट में मिश्रित। WebAuthn सर्वर कार्यान्वयन देखें।
| सिग्नल | यह क्यों मायने रखता है |
|---|---|
| चुनौती बेमेल / समाप्त चुनौती | सत्र समय या रीप्ले समस्याएं |
| ओरिजिन / RP ID बेमेल | मल्टी-डोमेन कॉन्फ़िगरेशन बग |
| अमान्य हस्ताक्षर / क्रेडेंशियल नहीं मिला | हटाया गया या दूषित क्रेडेंशियल। सामान्य मामला: एक पासकी के साथ सशर्त UI लॉगिन जिसे उपयोगकर्ता पहले ही सर्वर-साइड हटा चुका है। क्लाइंट और सर्वर क्रेडेंशियल सूचियों को सिंक में रखने के लिए सिग्नल API का उपयोग करें। |
| उपयोगकर्ता हैंडल बेमेल | खाता मानचित्रण समस्याएँ |
सहसंबंध आईडी (auth_flow_id) | क्लाइंट-साइड संदर्भ के साथ जुड़ें |
यदि आप एक पूर्ण फ़नल मॉडल (चरण और चरणों के बीच रूपांतरण द्वारा ड्रॉप-ऑफ़) चाहते हैं, तो ड्रॉप-ऑफ़ को समझने के लिए पासकी टेलीमेट्री देखें।
Latest news के लिए हमारे Passkeys Substack को subscribe करें.
इस डेटा के साथ, निष्कर्ष सरल हो जाता है: अधिकांश "त्रुटियां" या तो UX फिक्स, कवरेज फिक्स, या कॉन्फ़िगरेशन फिक्स बन जाती हैं। लेकिन इस वर्गीकरण को स्वयं बनाना और बनाए रखना महत्वपूर्ण चल रहा काम है।
ऊपर दी गई लॉगिंग चेकलिस्ट कच्चे संकेतों को कैप्चर करती है। बड़े पैमाने पर उत्पादन में, अकेले error.name पर्याप्त नहीं है। इस वर्गीकरण को स्वयं बनाना महत्वपूर्ण चल रहा काम है: त्रुटि संदेश हर ब्राउज़र और OS रिलीज़ के साथ बदलते हैं, पासवर्ड मैनेजर प्रदाता ऐसे अपडेट शिप करते हैं जो समारोह के व्यवहार को बदलते हैं और हर फीचर लॉन्च के साथ नए त्रुटि हस्ताक्षर दिखाई देते हैं।
error.name ही पर्याप्त क्यों नहीं है#एक ही NotAllowedError का मतलब छह अलग-अलग चीजें हो सकती हैं जो तीन आयामों पर निर्भर करती हैं जिन्हें ब्राउज़र आपके लिए अलग नहीं करते हैं:
| आयाम | ब्राउज़र आपको क्या देते हैं | आपको वास्तव में क्या चाहिए | उदाहरण |
|---|---|---|---|
| ऑपरेशन संदर्भ | NotAllowedError | क्या यह सशर्त UI, मोडल लॉगिन, मैन्युअल निर्माण, सशर्त निर्माण, या ऑटो-अपेंड था? | Android लॉगिन डिसमिस (अपेक्षित) और निर्माण विफलता (अप्रत्याशित) के लिए समान "अज्ञात त्रुटि" लौटाता है |
| समय | कोई अवधि डेटा नहीं | तत्काल (<1s) बनाम उपयोगकर्ता कैंसल (1-15s) बनाम टाइमआउट (30s+) | 200ms = पर्यावरण अस्वीकृति; 5s = उपयोगकर्ता ने संवाद देखा और रद्द कर दिया; 35s = टाइमआउट |
| प्लेटफ़ॉर्म + ऑथेंटिकेटर | सामान्य error.name | हर त्रुटि के लिए OS, ब्राउज़र, संस्करण, क्रेडेंशियल मैनेजर | Chrome पर "उपयोगकर्ता ने संवाद खारिज कर दिया" और Safari पर "ऑटोफिल अनुपलब्ध" दोनों NotAllowedError के रूप में सामने आते हैं |
यही वह समस्या है जिसे हल करने के लिए Corbado का ऑब्ज़र्वेबिलिटी SDK बनाया गया है। यह एक हल्का फ्रंटएंड एकीकरण है जो आपके मौजूदा पासकी कार्यान्वयन के शीर्ष पर बैठता है, किसी भी WebAuthn सर्वर और किसी भी IDP के साथ काम करता है, और स्वचालित रूप से सभी तीन आयामों के साथ हर WebAuthn त्रुटि को वर्गीकृत करता है:
| क्षमता | यह क्या करता है |
|---|---|
| त्रुटि एट्रिब्यूशन | हर समारोह प्रयास के साथ OS, OS संस्करण, ब्राउज़र, ब्राउज़र संस्करण और ऑथेंटिकेटर को कैप्चर करता है |
| ऑपरेशन मोड | प्रत्येक त्रुटि को विशिष्ट ऑपरेशन (सशर्त UI, मोडल लॉगिन, मैन्युअल निर्माण, सशर्त निर्माण, ऑटो-अपेंड) से जोड़ता है ताकि एक ही NotAllowedError अलग-अलग मूल कारणों को हल करे |
| कार्रवाई शुरू होने से समय | तत्काल अस्वीकृतियों, उपयोगकर्ता कैंसल और टाइमआउट को बिना अनुमान लगाए अलग करने के लिए समारोह की शुरुआत से अवधि रिकॉर्ड करता है |
| बुद्धिमान त्रुटि वर्गीकरण | संपूर्ण त्रुटि संदर्भ (न केवल नाम) पर मिलान करता है, विविध वातावरण (OS, हार्डवेयर, सेटिंग्स) में सामान्यीकरण करता है। CDA बनाम लोकल जैसे विशिष्ट त्रुटि समूहों को प्राथमिकता देता है, और अपेक्षित (उपयोगकर्ता निरस्त) को अप्रत्याशित (सिस्टम विफलता) त्रुटियों से अलग करता है। |
| पासवर्ड मैनेजर विखंडन | पता लगाता है कि क्रेडेंशियल मैनेजर एक्सटेंशन (Bitwarden, 1Password, LastPass) समारोहों को कब रोकते हैं और गैर-मानक प्रतिक्रियाएं देते हैं, एक्सटेंशन-कारण विफलताओं को प्लेटफ़ॉर्म विफलताओं से अलग करते हैं |
यह ऑब्ज़र्व लेयर है: आपके कार्यान्वयन को बदले बिना, क्या हो रहा है इसकी दृश्यता।
Corbado का प्रबंधन कंसोल दो जांच पथों का समर्थन करता है:
टॉप-डाउन (डैशबोर्ड से मूल कारण तक):
बॉटम-अप (त्रुटि पैटर्न से प्रभाव तक):
दोनों पथ अभिसरण करते हैं: टॉप-डाउन आपको बताता है कि कुछ गलत है, बॉटम-अप आपको बताता है कि क्यों। AI Analytics Assistant त्रुटि डेटा और अपनाने के मेट्रिक्स दोनों में आपको प्राकृतिक भाषा में प्रश्न पूछने की अनुमति देकर दोनों को जोड़ता है।
जो टीमें इन संकेतों पर कार्य करना चाहती हैं, वे एडॉप्ट में जा सकती हैं, जो स्वचालित रूप से समारोहों को गेट करने, नामांकन प्रॉम्प्ट को अनुकूलित करने और टूटी हुई पासकी स्थितियों को ठीक करने के लिए पासकी इंटेलिजेंस जोड़ता है। विनियमित वातावरण या हाइपरस्केल तैनाती के लिए, एंटरप्राइज़ सिंगल-टेनेंट होस्टिंग, SIEM एकीकरण और PSD2-अनुपालन कॉन्फ़िगरेशन जोड़ता है।
Enterprises के लिए मुफ्त passkey whitepaper पाएं.
WebAuthn त्रुटि नाम एक फैसला नहीं हैं। वे संकेत हैं - और वे केवल तभी कार्रवाई योग्य हो जाते हैं जब आप उन्हें ऑपरेशन प्रकार, समय और प्लेटफ़ॉर्म संदर्भ से जोड़ते हैं।
NotAllowedError), ऐप जीवनचक्र/समवर्ती (AbortError), सुरक्षा संदर्भ/कॉन्फ़िगरेशन (SecurityError), या विकल्प/स्थिति बग (InvalidStateError, ConstraintError, DataError)। अधिकांश मात्रा NotAllowedError है, और इसमें से अधिकांश अपेक्षित व्यवहार (उपयोगकर्ता ने प्रॉम्प्ट को खारिज कर दिया) है।NotAllowedError को कैसे अस्पष्ट करते हैं? समय (तत्काल अस्वीकृति बनाम उपयोगकर्ता कैंसल बनाम टाइमआउट), एक QR/हाइब्रिड संकेतक (उपलब्धता बेमेल), उपयोगकर्ता-सक्रियण संदर्भ (विशेष रूप से iOS/Safari पर) और ऑपरेशन प्रकार (सशर्त UI बनाम मोडल लॉगिन बनाम पासकी निर्माण बनाम सशर्त निर्माण) का उपयोग करें। सभी NotAllowedError को एक विफलता मोड के रूप में न मानें।error.name सशर्त निर्माण या मैन्युअल पासकी निर्माण (उपयोगकर्ता ने संवाद खारिज कर दिया) की तुलना में पूरी तरह से अलग संकेत है। त्रुटि के साथ ऑपरेशन प्रकार को लॉग करना ही सामान्य NotAllowedError को एक कार्रवाई योग्य बकेट में बदल देता है।error.name, ऑपरेशन प्रकार, ऑपरेशन शुरू होने से त्रुटि तक का समय, प्रवाह प्रकार, क्या QR/हाइब्रिड UI दिखाया गया था, OS/ब्राउज़र/डिवाइस (संस्करणों सहित), एक सहसंबंध आईडी (auth_flow_id) और सर्वर सत्यापन अस्वीकृतियों को स्पष्ट कोड के रूप में कैप्चर करें।विफलता के सभी प्रकारों को काटने वाले थंब रूल: कभी भी उपयोगकर्ताओं को कच्चे ब्राउज़र त्रुटियां न दिखाएं - हमेशा एक स्पष्ट फ़ॉलबैक पथ प्रदान करें - और स्थानीय प्रयासों को QR/हाइब्रिड क्रॉस-डिवाइस प्रयासों से अलग करें, क्योंकि वे अलग-अलग कारणों से विफल होते हैं और अलग-अलग फिक्स की आवश्यकता होती है। पैमाने पर, ब्राउज़रों, OS संस्करणों और क्रेडेंशियल प्रबंधकों में त्रुटि वर्गीकरण बनाए रखना चल रहा काम है। इसे खरोंच से बनाने के बजाय एक अनुरक्षित पैटर्न लाइब्रेरी के साथ एक ऑब्ज़र्वेबिलिटी SDK का उपयोग करने पर विचार करें।
Corbado बड़े पैमाने पर consumer authentication चलाने वाली CIAM टीमों के लिए Authentication Intelligence Platform है। हम आपको वह दिखाते हैं जो IDP logs और सामान्य analytics tools नहीं दिखा सकते: कौन-से devices, OS versions, browsers और credential managers passkeys को support करते हैं, क्यों enrollments login में नहीं बदलते, WebAuthn flow कहाँ fail होता है, और कब कोई OS या browser update चुपचाप login को तोड़ देता है — और यह सब Okta, Auth0, Ping, Cognito या आपके in-house IDP को बदले बिना। दो products: Corbado Observe जोड़ता है passkeys और किसी भी अन्य login method के लिए observability। Corbado Connect देता है analytics के साथ built-in managed passkeys (आपके IDP के साथ-साथ)। VicRoads, Corbado के साथ 5M+ users के लिए passkeys चला रहा है (+80% passkey activation)। Passkey विशेषज्ञ से बात करें →
वेब पर, ब्राउज़र गोपनीयता कारणों से दोनों मामलों को NotAllowedError में ढहा देते हैं, इसलिए आप उन्हें सीधे अलग नहीं कर सकते। एक प्रॉक्सी के रूप में समय का उपयोग करें: 1 सेकंड से कम की त्रुटि का आमतौर पर मतलब पर्यावरण अस्वीकृति या लापता क्षमता होता है, जबकि 1-15 सेकंड बताता है कि उपयोगकर्ता ने संवाद देखा और खारिज कर दिया। नेटिव iOS और Android ऐप पर, अनुरोध से पहले preferImmediatelyAvailableCredentials सेट करने से आपको कोई भी UI दिखाए जाने से पहले एक साफ "कोई क्रेडेंशियल नहीं" संकेत (iOS कोड 1005, Android GetCredentialRequest) मिलता है।
अनुकूलित बड़े पैमाने पर पासकी तैनाती में, दर्ज की गई 95% से अधिक WebAuthn त्रुटियां अपेक्षित उपयोगकर्ता गर्भपात हैं, सिस्टम विफलताएं नहीं हैं। "उपयोगकर्ता ने प्रॉम्प्ट खारिज कर दिया" को वास्तविक विफलताओं से अलग किए बिना कच्चे error.name की गिनती ट्रैक करने से त्रुटि मेट्रिक्स बढ़ जाते हैं और NotAllowedError वॉल्यूम के अंदर छिपे वास्तविक प्रतिगमन को मुखौटा बना देते हैं। अपनी गणनाओं को ऑपरेशन प्रकार से विभाजित करें और उपयोगकर्ता-कैंसल बकेट को SecurityError, ConstraintError और DataError जैसी अप्रत्याशित त्रुटियों से अलग से मानें।
iOS कोड 1005 (NotInteractive) का अर्थ है कि डिवाइस पर कोई पासकी उपलब्ध नहीं थी जब ASAuthorizationController पर preferImmediatelyAvailableCredentials सेट किया गया था, और उपयोगकर्ता को कोई UI नहीं दिखाया गया था। यह साफ़ "इस डिवाइस पर कोई पासकी मौजूद नहीं है" संकेत है जो वेब ब्राउज़र गोपनीयता बाधाओं के कारण प्रदान नहीं कर सकते हैं। हमेशा संख्यात्मक कोड पर वर्गीकृत करें, localizedDescription पर नहीं, क्योंकि Apple के संदेशों को 30+ भाषाओं में स्थानीयकृत किया जाता है और OS संस्करणों में बदला जा सकता है।
सशर्त निर्माण के दौरान, NotAllowedError, AbortError और InvalidStateError सभी अपेक्षित परिणाम हैं और इन्हें त्रुटियों के रूप में सामने लाने के बजाय चुपचाप अनदेखा किया जाना चाहिए। NotAllowedError इंगित करता है कि ऑटोफिल अनुपलब्ध है या पृष्ठ ने फोकस खो दिया है, जबकि InvalidStateError का अर्थ है कि प्रदाता में एक पासकी पहले से मौजूद है। कॉल का प्रयास करने से पहले, conditionalCreate समर्थन को सत्यापित करने के लिए getClientCapabilities() का उपयोग करें और अपनी त्रुटि गणनाओं को बढ़ाने से बचने के लिए दस्तावेज़ दृश्यता स्थिति की जांच करें।
ऑपरेशन प्रकार (सशर्त UI, मोडल लॉगिन, मैन्युअल निर्माण, सशर्त निर्माण या ऑटो-अपेंड), ऑपरेशन शुरू होने से त्रुटि तक का समय, OS संस्करण, ब्राउज़र संस्करण, हार्डवेयर मॉडल, क्या QR/हाइब्रिड UI दिखाई दिया और सर्वर-साइड लॉग के साथ जुड़ने के लिए एक सहसंबंध आईडी कैप्चर करें। चुनौती बेमेल, अमान्य हस्ताक्षर और क्रेडेंशियल न मिलने जैसी सर्वर सत्यापन विफलताओं को स्पष्ट संरचित कोड के रूप में लॉग किया जाना चाहिए, न कि क्लाइंट-साइड DOMException नामों के समान बकेट में मिश्रित किया जाना चाहिए। ये संकेत एक साथ बिना अनुमान लगाए कार्रवाई योग्य बकेट में अधिकांश त्रुटियों के वर्गीकरण की अनुमति देते हैं।
संबंधित लेख
विषय सूची