Halaman ini diterjemahkan secara otomatis. Baca versi asli berbahasa Inggris di sini.
Di lingkungan produksi, kesalahan WebAuthn membingungkan
karena browser mengekspos sekumpulan kecil nama DOMException (seperti NotAllowedError) yang
dapat mewakili berbagai penyebab yang mendasarinya. Selain itu, sebagian besar "kesalahan" -
sering kali di atas 95% dalam penerapan
kunci sandi skala besar yang dioptimalkan - sebenarnya merupakan
perilaku yang diharapkan (pengguna membatalkan prompt kunci sandi sistem operasi).
Eksperimen dengan alur passkey di Passkeys Debugger.
Penting: Karena alasan privasi, browser tidak membedakan apakah pengguna aktif membatalkan atau tidak ada kunci sandi yang ada. Namun, dalam beberapa situasi dan dengan cukup konteks, baik di web maupun di platform native, beberapa kasus ini dapat dibedakan menggunakan sinyal seperti pengaturan waktu.
Jika Anda menginginkan definisi kanonis untuk nama-nama ini, mulailah dengan
MDN DOMException. Untuk
kondisi spesifik WebAuthn yang mengarah ke pengecualian ini (dan yang wajib ditegakkan
oleh browser), lihat spesifikasi Autentikasi Web W3C.
Jika Anda memperlakukan semua kesalahan sebagai "bug", Anda akan melakukan hal yang salah:
NotAllowedErrorDalam artikel ini kami menjawab:
NotAllowedError ke dalam keranjang yang dapat ditindaklanjuti (batal vs waktu habis vs
ketersediaan)?Artikel terbaru
NotAllowedError adalah sinyal permukaan, bukan akar penyebab. Ini bisa berarti pembatalan,
waktu habis, "tidak ada kredensial lokal", atau tidak ada aktivasi pengguna tergantung pada konteks.NotAllowedError yang sama memiliki arti berbeda
selama login UI bersyarat, login modal, pembuatan kunci sandi manual, pembuatan
bersyarat dan penambahan yang dipicu otomatis.<1 dtk),
pembatalan pengguna (1-15 dtk) dan waktu habis (30 dtk+) adalah kategori yang pada dasarnya berbeda.AbortError biasanya merupakan masalah siklus hidup/konkurensi (navigasi, render ulang, beberapa
permintaan dalam proses).SecurityError hampir selalu konfigurasi/konteks dan langka dalam penerapan produksi yang matang.error.name sehingga Anda dapat mengklasifikasikan kesalahan ke dalam keranjang yang
benar-benar dapat Anda perbaiki.Jika Anda hanya membutuhkan pemetaan cepat untuk membebaskan proses debug, mulailah dengan tabel ini. Ini berpihak pada apa yang sebenarnya dilihat tim di dasbor dan tiket dukungan.
error.name | Apa artinya biasanya di produksi | Apa yang harus diperiksa untuk konfirmasi | Tindakan pertama (UX + teknis) |
|---|---|---|---|
NotAllowedError | Lembar penolakan pengguna, batas waktu terlampaui, atau ketidaksesuaian ketersediaan yang dikumpulkan menjadi satu. Ini merupakan keranjang kesalahan terbesar di produksi. | waktu ke kesalahan, apakah UI QR/hybrid muncul, apakah upacara dimulai dari tindakan pengguna asli | Perlakukan sebagai hal yang wajar: pulihkan UI + tunjukkan opsi alternatif |
AbortError | Aplikasi Anda (atau browser) membatalkan upacara | navigasi/perenderan ulang selama upacara; panggilan WebAuthn serentak; AbortController.abort() | Batasi pada satu permintaan serentak; cegah perubahan rute; tangani pembatalan sebagai alur kontrol wajar |
SecurityError | Konteks/kebijakan tidak diizinkan | asal + strategi ID RP; iframe/penyematan; HTTPS; kebijakan fitur | Perbaiki ID RP/konfigurasi asal; validasi kebijakan penyematan; pastikan konteks yang aman |
InvalidStateError | Ketidaksesuaian status (sering kali karena pendaftaran ganda) | pendaftaran vs log masuk; excludeCredentials; ada kredensial yang sudah ada di pengautentikasi | Anggap sebagai "sudah terdaftar"; sesuaikan rute UX; perbaiki pembuatan opsi |
ConstraintError | Persyaratan tidak dapat dipenuhi | authenticatorAttachment, userVerification, persyaratan kunci residen | Longgarkan pembatasan atau berikan opsi lain/alternatif. Contoh: Pengunci layar tidak ada pada Android |
DataError | Input salah bentuk/tidak konsisten | pengodean base64url; format id/tantangan/penangan pengguna | Perbaiki pengodean/serialisasi; tambahkan validasi pada pembuatan opsi |
NotSupportedError | Platform/browser tidak mendukung permintaan Anda | versi OS/browser; asumsi pendeteksian fitur | Langsung gunakan alternatif; catat bagiannya; hindari menampilkan CTA passkey pada lingkungan yang tidak mendukung |
UnknownError | Platform/pengautentikasi gagal secara umum | lonjakan setelah pembaruan OS; build perangkat; masalah dengan penyedia kredensial-manajer | UX yang dapat dicoba lagi; catat nomor build; cari tahu lebih lanjut mengenai lonjakan pada bagian tertentu |
Satu hal yang mudah terlewatkan: error.name yang sama bisa berarti hal yang sangat berbeda
bergantung pada tipe operasi. Tetap ingat konteks operasi saat Anda membaca
bagian di bawah ini. Praktiknya, kesalahan pembuatan kunci sandi
(pendaftaran) biasanya jauh melebihi jumlah kesalahan login - tabel di atas
berlaku untuk keduanya, tetapi pembuatan adalah tempat sebagian besar volume berada.
Selanjutnya, kita akan membahas lebih dalam NotAllowedError karena itu adalah salah satu yang paling sering Anda lihat dan
yang sering salah diartikan tim.
NotAllowedError sering terlihat seperti "kunci sandi gagal", tetapi biasanya itu adalah platform
yang memberi tahu Anda bahwa pengguna tidak menyelesaikan UI OS. Kuncinya adalah membaginya menjadi keranjang yang dapat Anda
tindaklanjuti.
Apa yang akan Anda lihat di konsol browser:
| Sumber | Pesan kesalahan |
|---|---|
| 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. |
Semua ini muncul sebagai error.name === "NotAllowedError". error.message berbeda menurut
mesin browser dan penyebab yang mendasari, namun hasilnya sama: upacara tidak
selesai.
Ini berlaku untuk login dan pembuatan kunci sandi. Selama login (UI bersyarat, modal
dengan atau tanpa daftar yang diizinkan), NotAllowedError biasanya berarti pengguna tidak menyelesaikan
upacara. Selama pembuatan kunci sandi, kesalahan yang sama
muncul karena alasan yang berbeda: pengguna mengabaikan dialog pembuatan (pembuatan bersyarat
tidak berfungsi, atau halaman kehilangan fokus selama penambahan yang dipicu secara otomatis. Tipe operasi
mengubah makna kesalahan dan apa yang harus Anda lakukan tentangnya.
Pengaturan waktu sering kali merupakan sinyal yang diremehkan. Kegagalan setelah kurang dari satu detik klik adalah biasanya penolakan langsung (lingkungan tidak bisa melakukannya, dokumen tidak difokuskan, kemampuan hilang). Kesalahan setelah beberapa detik adalah pembatalan pengguna (mereka melihat dialog dan memutuskan untuk tidak melanjutkan). Kesalahan setelah 30+ detik adalah batas waktu. Pada platform native, pengaturan waktu sangat penting: perjalanan autentikator pulang pergi, prompt biometrik dan penyerahan pengelola kredensial semuanya memiliki durasi karakteristik yang membantu Anda memisahkan "tidak berfungsi" dari "pengguna pergi". Anda masih tidak dapat membedakannya dengan mudah jika kunci sandi ada.
Anda tidak memerlukan sinyal yang sempurna. Anda memerlukan konteks yang cukup untuk menghindari memperlakukan setiap
NotAllowedError dengan cara yang sama. iOS/Safari mendapatkan
perhatian khusus di bawah ini karena ia memiliki kendala unik (persyaratan aktivasi pengguna
di versi sebelumnya), namun dalam volume kesalahan mentah, Windows dan Chromium browsers sering
menghasilkan lebih banyak NotAllowedError daripada platform lainnya. Sinyal-sinyal ini sering membuat Anda mendapatkan 80%
dari cara:
| Sinyal | Kemungkinan arti | Apa yang harus dilakukan selanjutnya |
|---|---|---|
Kegagalan langsung (<1 dtk) | Penolakan lingkungan: tidak ada kemampuan, dokumen tidak fokus, permukaan pembuatan bersyarat tidak tersedia | Periksa deteksi fitur; pastikan dokumen memiliki fokus; pastikan operasi didukung di platform ini |
| Pembatalan cepat (1-3 dtk) | Perintah kejutan / tidak ada konteks | Ubah waktu perintah; tambahkan waktu henti setelah pembatalan |
| Pembatalan sepanjang pengguna (3-15 dtk) | Pengguna melihat dialog dan memilih untuk tidak melanjutkan | UX yang Diharapkan; pulihkan UI + tunjukkan fallback |
| Batas waktu (30 dtk+) | Upacara habis waktu tanpa tindakan pengguna | Keranjang sebagai "tidak selesai"; pertimbangkan apakah perintah tersebut diperhatikan |
| UI QR/hybrid muncul sebelum kegagalan | Tidak ada kredensial lokal yang tersedia di perangkat ini. Catatan: secara andal mendeteksi keputusan kode QR sebelum hal tersebut terjadi memerlukan intelijen kunci sandi yang mengetahui apakah terdapat kredensial yang dapat digunakan di perangkat saat ini. | Batasi penawaran kunci sandi; buat "Gunakan ponsel" eksplisit; kurangi kejutan QR |
| Terkonsentrasi di iOS/Safari dan terpicu tanpa klik/ketuk | Aktivasi pengguna tidak ada | Mulai upacara dari gerakan pengguna sungguhan |
| Saat pembuatan bersyarat atau tambahan yang terpicu otomatis | Isi otomatis tidak tersedia, kredensial sudah ada, atau halaman kehilangan fokus. Kesalahan pembuatan bersyarat dapat muncul tiba-tiba dan dalam volume tinggi ketika fitur diluncurkan, sehingga menjadikannya salah satu sumber kesalahan terbesar dalam semalam. | Lihat pembuatan bersyarat; periksa status visibilitas dokumen; gunakan getClientCapabilities() untuk memverifikasi dukungan conditionalCreate sebelum mencoba panggilan tersebut |
Inilah juga mengapa NotAllowedError jarang terlihat oleh pengguna. Ini bukan pesan
yang dapat ditindaklanjuti oleh pengguna.
Klasifikasi konteks juga merupakan titik pembagian tingkat keberhasilan secara tajam. Analisis tingkat keberhasilan autentikasi kunci sandi Tolok Ukur Kunci Sandi Corbado 2026
mengukur penyelesaian Q1 2026 sebesar 55–95% untuk alur pengidentifikasi-pertama perangkat yang tidak dikenal versus
95–99% untuk pengembalian perangkat yang dikenal di seluruh
penerapan B2C skala besar.
Pengidentifikasi-pertama web iOS mendarat di penyelesaian 85–95%
(% CDA 0–5%), web Android pada 70–85% (% CDA 5–10%) dan web macOS pada 70–85% (% CDA 10–15%),
sementara web Windows duduk di 45–60% penyelesaian pengidentifikasi-pertama dengan % CDA di 55–65% pada
Windows 11 dan 40–55% pada Windows 10. Membaca
volume NotAllowedError tanpa memisahkan konteks perangkat yang dikenal versus perangkat yang tidak dikenal menggabungkan
dua rezim keberhasilan yang secara mendasar berbeda.
Satu nuansa yang penting dalam produksi: beberapa user agent dapat memunculkan batas waktu sebagai
TimeoutError, namun banyak tim masih melihat batas waktu mengerucut menjadi NotAllowedError di
dasbor. Bagaimanapun, perlakukan batas waktu sebagai “upacara tidak selesai” dan kelompokkan menggunakan
waktu beserta konteks.
Ketika lembar OS diabaikan atau habis waktunya, UI Anda harus segera pulih dan bereaksi dengan baik. Serangkaian aturan praktis:
Di luar hal dasar:
Jika "pembatalan" Anda benar-benar tinggi, langkah selanjutnya adalah memperbaiki akar masalah di baliknya: waktu perintah, kejutan QR, dan ketersediaan yang rendah.
Mulai dengan perubahan yang memindahkan metrik dengan cepat:
NotAllowedError Anda. Mulai dengan
isUVPAA() sebagai
pembatas paling dasar, lalu gunakan getClientCapabilities() untuk
pemeriksaan yang lebih baik (pembuatan bersyarat, penerimaan bersyarat, transportasi hybrid,
pengautentikasi platform). Perhatikan bahwa
API deteksi dapat rusak pada pembaruan OS: iOS 26.2 meluncurkan bug WebKit
di mana isUVPAA() menghasilkan false pada semua browser berbasis WKWebView
meskipun passkey berfungsi dengan baik, menyebabkan lonjakan NotAllowedError mendadak bagi
10-25% pengguna iOS (lihat memperbaiki deteksi passkey dengan
getClientCapabilities()).Nama-nama kesalahan adalah target yang bergerak. Ada berbagai proposal berkelanjutan untuk menambah rincian kesalahan WebAuthn (misalnya, untuk memisahkan “tidak ada kredensial yang tersedia” dari “pengguna yang membatalkan”). Sejak Februari 2026, hal tersebut belum diterapkan di dalam sebagian besar peramban, jadi ada baiknya membangun keranjang alasan Anda sendiri berdasarkan konteks dan waktu. Bila Anda ingin melacak pekerjaan ini, lihat WebAuthn issue #2062 dan penjelas "Kode Kesalahan Baru".
Nama-nama kesalahan lainnya kurang sering terjadi namun tetap berguna untuk dipahami bila muncul.
AbortError tidak umum dalam volume jika dibandingkan dengan NotAllowedError, tetapi saat muncul ini
sangat diagnostik: ini biasanya berarti upacara tidak selesai karena aplikasi Anda
membatalkan permintaan - navigasi terjadi, state berubah, atau permintaan kedua dimulai.
Apa yang akan Anda lihat di konsol browser:
| Sumber | Pesan kesalahan |
|---|---|
| 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. |
Penyebab umum produksi meliputi:
AbortController.abort() selama pencobaan ulang atau pembersihan statusUntuk memperbaikinya, berfokuslah untuk menjadikan upacara sebagai "bagian kritis":
Jika Anda melihat AbortError terkonsentrasi di permukaan yang disematkan atau aplikasi multimesin, hal berikutnya
yang harus diperiksa adalah SecurityError.
SecurityError adalah browser yang memberitahu Anda: "konteks ini tidak diizinkan untuk melakukan yang
Anda minta." Dalam praktik, hampir selalu soal konfigurasi, bukan perilaku pengguna. Pada pengerahan
produksi yang sudah matang, SecurityError langka terjadi karena masalah ini umumnya sudah tertangkap
saat tes integrasi. Jika ini muncul di produksi, umumnya hal ini berarti ada penambahan
domain baru, penyematan konteks, atau sasaran pengerahan yang dilakukan tanpa konfigurasi WebAuthn
yang tepat.
Penyebab-penyebab umum termasuk:
.well-known/webauthn atau .well-known/assetlinks.json salah konfigurasi, hilang, atau
tidak tersedia sementara. Isu jaringan saat terjadi kondisi krusial yang saat mana browser
mengambil berkas-berkas ini bakal menimbulkan kegagalan. Satu rupa buta yang umum: jika halamamuka Anda turun
untuk di-maintenance, berkas-berkas well-known juga ikutan offline, lantas merusak perayaan kunci sandi
lintas seluruh pihak-tergantung yang memerlukannya.Apa yang bakal Anda lihat dalam konsol browser:
| Sumber | Pesan galat |
|---|---|
| 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. |
Dalam produksi, SecurityError langka terjadi - ini lumrah tertangkap saat tes integrasi.
Ketika ini terjadi, kesalahan sertifikat TLS yang paling umum bertahan hidup.
Loop debugging paling cepat adalah:
publickey-credentials-create / publickey-credentials-get):
MDN Permissions-PolicySetelah SecurityError di-urus, wadah selanjutnya yang patut ditangani secara serius adalah rangkaian kesalahan
yang menandakan bug penerapan: InvalidStateError, ConstraintError serta
DataError.

Cheatsheet Passkeys. Panduan praktis, pola peluncuran, dan KPI untuk program passkeys.
Kesalahan-kesalahan ini harus langka dalam implementasi kunci sandi yang matang. Jika muncul, mereka biasanya menunjukkan bahwa opsi generasi salah untuk suatu segmen atau aliran ada dalam keadaan salah.
Apa yang akan Anda lihat di konsol browser:
| Sumber | Pesan kesalahan |
|---|---|
| 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 |
Arti tipikal:
Penanganan praktis:
excludeCredentials mencantumkan seluruh ID kredensial eksisten untuk pengguna sehingga
autentikator dapat mendeteksi duplikat (lihat
excludeCredentials)InvalidStateError merupakan
harapan dan sebaiknya diabaikan dalam diam: artinya sebuah kunci sandi sudah eksis dalam
provider. Hal yang sama juga berlaku untuk NotAllowedError dan AbortError selama
pembuatan kondisional (lihat
conditional create on Chrome)Arti Umum: authenticator tidak dapat memenuhi kendala yang Anda minta.
Pemicu umum:
authenticatorAttachment terlalu ketat atau
kunci residen
asumsiuserVerification pada segmen-segmen di mana hal tersebut tidak tersediaMemperbaiki: ringankan kendala (jika dimungkinkan) atau tawarkan rute alternatif. Untuk layar kunci yang hilang, pertimbangkan pendeteksian kondisi ini lalu arahkan user ketimbang membiarkan kegagalan berlalu tanpa notifikasi (Android).
Arti khas: masukan tidak berbentuk dengan baik atau inkonsisten.
Pemicu yang lazim:
Solusi: validasi dan normalisasi masukan di perbatasan tempat Anda mengonfigurasi WebAuthn opsional. Dalam
penerapannya, DataError secara praktis ditiadakan di dalam platform sistem pengerjaan—seandainya pembuatan pilihan Anda
telah diuji, Anda takkan melihatnya di panel informasi Anda.
Kala semua kesalahan ini ditangani, kendala berikutnya adalah tentang jangkauan: apakah user tak dapat menaut karena gawai yang dipakai tidak sesuai dengan dukungan WebAuthn yang Anda rancang?
NotSupportedError adalah sinyal cakupan, bukan sinyal keandalan. Biasanya ini berarti suatu
segmen tidak dapat melakukan apa yang Anda minta (versi OS/browser terlalu lama, kemampuan tidak ada, fitur tidak
diaktifkan).
Apa yang akan Anda lihat di konsol browser:
| Sumber | Pesan kesalahan |
|---|---|
| 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 |
Dua hal pertama adalah DOMException NotSupportedError asli. Entri TypeError
secara teknis adalah tipe pengecualian yang berbeda tetapi mewakili kelas masalah yang sama:
browser atau lingkungan tidak mendukung apa yang Anda minta. Rumpun TypeError serialisasi
JSON jauh lebih umum dalam praktiknya daripada DOMException NotSupportedError
itu sendiri (lihat di bawah).
Penyebab umum meliputi:
Rumpun serialisasi JSON adalah sumber terbesar dari kegagalan kelas NotSupportedError
di produksi. Secara teknis ini muncul sebagai TypeError (metode hilang), bukan
sebagai DOMException, tetapi di sinilah Anda akan menemukannya. Dua penyebab dasar berbeda:
navigator.credentials tetapi bukan PublicKeyCredential.parseCreationOptionsFromJSON /
parseRequestOptionsFromJSON. Ini merupakan sekitar 90% dari rumpun kesalahan ini,
terkonsentrasi pada versi Safari dan Chrome lama. Jika perpustakaan klien Anda bergantung pada
metode ini tanpa cadangan, ini menghasilkan volume kesalahan yang signifikan..toJSON(). Ekstensi seperti
Bitwarden,
LastPass, atau
1Password dapat mencegat
upacara dan mengembalikan objek yang terlihat seperti kredensial tetapi bukan
instance PublicKeyCredential yang sebenarnya. Memanggil .toJSON() padanya akan gagal, mengembalikan
tidak terdefinisi, atau objek tersebut null seluruhnya. Ini adalah sekitar 10% dari rumpun tetapi
terutama membingungkan untuk debug karena pesan kesalahan berbeda menurut browser (Safari:
"Can only call on instances of PublicKeyCredential"; Firefox: "does not implement
interface PublicKeyCredential").Penanganan harus tegas dan cepat:
Jika cakupan terlihat baik tetapi kegagalan masih terjadi pada segmen tertentu, Anda mungkin menghadapi
masalah lapisan platform yang muncul sebagai UnknownError.
UnknownError adalah serba-bisa untuk kegagalan autentikator/OS yang tidak dipetakan secara jelas ke dalam
kategori lain. Ini sering kali sementara, tetapi juga dapat melonjak setelah pembaruan OS.
Apa yang akan Anda lihat di konsol browser:
| Sumber | Pesan kesalahan |
|---|---|
| Chrome (Android) | UnknownError: An unknown error occurred while talking to the credential manager. |
| Browser apa saja | UnknownError: The operation failed for an unknown transient reason. |
| Browser apa saja | UnknownError: Either the device has received unexpected request data, or the device has been reconfigured since the request was made. |
| Browser apa saja | 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 |
Penanganan praktis:
Satu sumber kesalahan yang unik dan tidak masuk secara rapi ke dalam kategori DOMException mana pun:
ekstensi browser manajer kata sandi (seperti
Bitwarden,
LastPass,
1Password, dan lain-lain) dapat mencegat
panggilan API WebAuthn dan mengembalikan tanggapan non-standar. Meskipun kecil dalam volume dibandingkan dengan
pembatalan pengguna, kesalahan ini berharga untuk dilacak karena mereka memengaruhi segmen pengguna tertentu
secara konsisten dan gejala-gejalanya membingungkan: metode yang hilang dari objek kredensial yang dikembalikan,
tipe kesalahan yang tidak terduga, atau tanggapan cacat yang tidak cocok dengan satupun
kesalahan WebAuthn yang terdokumentasi. Kesalahan-kesalahan ini sering kali timbul sebagai UnknownError atau sebagai
pengecualian yang tidak terklasifikasi. Jika
Anda melihat adanya lonjakan kesalahan yang terkonsentrasi di dalam peramban tertentu tanpa alasan dari OS itu sendiri, periksa
apakah suatu ekstensi manajer kredensial terkait.
Selama ini kami hanya meliputi penamaan kesalahan penjelajah peramban saja. Tetapi jika Anda juga mengekspor aplikasi lokal, maka pemandangan kesalahan pun turut menjadi lain - serta dalam sedikit hal, lebih berarti.
Segala hal di atas mencakup peramban web. Aplikasi native - iOS dengan rangka ASAuthorization, Android beserta Manajer Kredensial - membagikan rumpun kesalahan sama pada kategori dasar mereka melainkan agak sedikit berbeda dalam arti yang lebih luas:
"Tidak ada kredensial" adalah sinyal yang berbeda. Di web, peramban menyatukan "tidak ada kredensial
yang tersedia" dan "pengguna membatalkan" ke dalam NotAllowedError yang sama demi privasi. Di ranah native,
menggunakan preferImmediatelyAvailableCredentials di iOS (ASAuthorizationController) atau
setPreferImmediatelyAvailableCredentials(true) di
Android (GetCredentialRequest) akan memberitahukan OS
hanya untuk menyajikan kredensial yang sudah ada di perangkat dan langsung gagal jika tidak ada kredensial tersebut.
Ini memberi Anda kembalian "tanpa kredensial" yang bersih, sesuatu yang tidak dapat diberikan oleh web.
Status penyedia kredensial tampak. Platform native dalam beberapa kondisi dapat
memberitahu Anda jika tidak ada penyedia kredensial (Google Password Manager,
iCloud Keychain,
1Password, dll.) yang dipasang,
dikonfigurasi, atau disetel sebagai nilai default lalu bereaksi terhadapnya. Pada web,
informasi ini tersembunyi di balik pesan buram NotAllowedError.
Pesan kesalahan lebih spesifik. Oleh karena sang pengguna telah memasang aplikasi tersebut - dan dengannya membuat satu hubungan kepecayaan dengan pihak terkait - maka OS memberi rincian diagnosisnya. Pertimbangan keprivasian yang secara paksa menekan peramban di web agar menyamarkan kesalahannya tidak berlaku sejalan kala pengaplikasian tersebut nyata sudah berada di gawai. iOS menyuguhkan pesan terlokalisasi di dalam gawai berdasarkan preferensi bahasa penggunanya. Android mengantarkan sejenis penataan struktur kesalahan lewat urutan permasalahannya. Karenanya perbaikan jauh lebih ringkas walaupun arti pada hal itu menuntun penanganan yang mengharuskan agar penyetelan dapat melokalisasi bentuk format kesalahan khas-platform.
iOS memunculkan kesalahan kunci sandi melalui kerangka ASAuthorization. Semua kesalahan tiba dalam
callback delegasi authorizationController(controller:didCompleteWithError:) sebagai
objek NSError.
Klasifikasikan berdasarkan domain + kode, bukan berdasarkan string pesan. Domain kesalahan utama adalah
com.apple.AuthenticationServices.AuthorizationError
(ASAuthorizationError.errorDomain). Cast kesalahan dengan let nsError = error as NSError
dan cocokkan pada .domain dan .code. Jangan pernah mencocokkan pada .localizedDescription di produksi -
pesan-pesan Apple dilokalkan ke 30+ bahasa dan dapat berubah seiring versi OS. String
pesan yang terdaftar di bawah ini berguna untuk mengenali kesalahan dalam catatan (log), tetapi itu bukanlah
kriteria klasifikasi.
Kode ASAuthorizationError Publik:
| Kode | Nama | Sejak | Apa artinya |
|---|---|---|---|
| 1000 | Unknown | iOS 13 | Tidak boleh muncul dalam produksi. Hal umum untuk menangkap-semua. |
| 1001 | Canceled | iOS 13 | Pengguna menepis lembaran passkey. Kesalahan terumum yang ada - setara NotAllowedError. Tanda bersih dengan userInfo kosong dan tiada kesalahan mendasar. |
| 1002 | InvalidResponse | iOS 13 | Kerusakan tingkatan kerangka kerja. Langka dalam pengerjaannya. |
| 1003 | NotHandled | iOS 13 | Tak ada provider yang menangani permintaan. Periksa setelan hak-guna serta provider. |
| 1004 | Failed | iOS 13 | Gagal pada umumnya. Terdapat keterangan nyata pada localizedDescription (semisal "Aplikasi beserta tanda kenal X tak bersangkut paut dengan ranah Y"). userInfo bisa menampung tulisan FailureReason, hanya saja tak selamanya NSUnderlyingErrorKey diisi - kegagalan penyatuan domain nihil nilainya bagi yang tersembunyi. |
| 1005 | NotInteractive | iOS 15 | Kredensial tidak sedia apabila menggunakan opsi preferImmediatelyAvailableCredentials`. Hal begini tanda bersih "tak dijumpai" - kesetaraan iOS dari perihal "tiada passkey pada perangkat." Antar muka sama sekali tak dimunculkan. |
| 1006 | MatchedExcludedCredential | iOS 18 | Passkey bagi RP peranti tersebut telah tersedia di dalamnya. Tanda jernih melacak gandaan - userInfo hampa, tanpa NSUnderlyingErrorKey. Tata urut berlaku walau tanpa menilik huruf. |
| 1007 | CredentialImport | iOS 18.2 | Impor kredensial tak berhasil. |
| 1008 | CredentialExport | iOS 18.2 | Ekspor kredensial tak berhasil. |
| 1009 | PreferSignInWithApple | iOS 26 | Pemakai cenderung Memasuki sistem menggunakan layanan masuk dengan ID Apple alih-alih kunci aksesnya. Baru dalam rilis iOS kali ini. |
| 1010 | DeviceNotConfiguredForPasskeyCreation | iOS 26 | Piranti kurang kata-sandi pembuka-layar maupun Keychain di lingkungan iCloud-nya. Inilah kelemahan simulator pada peluncuran OS kali ini: menampilkan ralat yang semestinya tak ada kendati kesemuanya beraturan dan beres (terbebas terhadap perangkat aslinya). |
Perbedaan terpenting pada lingkungan produksi: sejak dirilisnya sistem operasi teranyar itu, jejak duplikasi
mengirimkan notifikasi galatnya pribadi berkode 1006 (MatchedExcludedCredential). Dalam
penggunaan terdahulu di edisi sebelumnya, sisa duplikat terbungkus
jauh di bawah notifikasi Failed (1004). Kini
pada platform teranyar ini perbedaannya tersusun
(kode yang beda) alih-alih cuma rentetan kalimat.
Masalah umum di masa berjalannya sistem operasi (batas perinci-baca):
Uraian-uraian ini menyingkap di localizedDescription serta userInfo buat kekhususan aneka-salah
. Memanfaatkan hal tersebut berguna di penapisan maupun pengusutan dan penelusuran, walau tidak sepadan untuk pembagian berjenjang pada rancang kodenya.
| Pesan (Lokal Bahasa Inggris) | Kode dasar | Catatan |
|---|---|---|
Application with identifier <TeamID.BundleID> is not associated with domain X | 1004 (Failed) | Entitlement Associated Domains aplikasi tidak cocok dengan relying party. Perbaiki file apple-app-site-association di server Anda. |
Couldn't communicate with a helper application. | 1004 (Failed) | Ekstensi penyedia kredensial gagal merespons. Sementara - percobaan ulang sudah tepat. |
Request already in progress for specified application identifier. | 1004 (Failed) | Permintaan ASAuthorization duplikat terkirim saat ada permintaan yang tertunda. Race condition di aplikasi. |
Stolen Device Protection is enabled and biometry is required. | 1004 (Failed) | Perlindungan Perangkat yang Dicuri di iOS 17+ memblokir autentikasi biometrik di lokasi asing. Tidak dapat ditindaklanjuti oleh pengembang, tetapi layak ditampilkan kepada pengguna. |
(AuthenticationServicesCore.ASCABLEClient.ClientError error 2.) | Domain terpisah | Jabat tangan Bluetooth autentikasi lintas perangkat (hybrid/CABLE) gagal. |
(AuthenticationServicesCore.ASCABLEClient.ClientError error 3.) | Domain terpisah | Koneksi Bluetooth autentikasi lintas perangkat gagal. |
Pesan "tidak ada kredensial" lokal (kode 1005):
Bila preferImmediatelyAvailableCredentials ditetapkan dan tak terdapat sandi, iOS memberi kembalian
galat berkode 1005 (NotInteractive) berwujud kabar terlokalkan ke dalam bahasa asli sang pengguna yang tersetel pada gawai
kepunyaannya. Cuma ini yang dapat ditemui bagi perangkat tersemat secara bawan—mesin penjelajah pun urung
memunculkannya sekelumit juga. Keterangan tersebut senantiasa diawali kalimat The operation couldn't be completed.
(Bahasa Inggris) beriring teks tertata berdasarkan lokalisasinya di antaranya:
| Bahasa | Pesan |
|---|---|
| Mandarin (Sederhana) | 没有可用于登录的凭证。 |
| Vietnam | Không có sẵn thông tin để đăng nhập. |
| Arab | لا تتوفر بيانات اعتماد لتسجيل الدخول. |
| Spanyol | No hay ninguna credencial disponible para iniciar sesión. |
| Mandarin (Tradisional) | 沒有可用於登入的憑證。 |
| Korea | 로그인을 위한 자격 증명이 없습니다. |
| Prancis (Kanada) | Aucun identifiant disponible pour la connexion. |
| Portugis (Brasil) | Nenhuma credencial disponível para login. |
| Prancis (Prancis) | Aucune information d'identification n'est disponible pour procéder à la connexion. |
| Thai | ไม่มีข้อมูลประจำตัวสำหรับเข้าสู่ระบบ |
| Italia | Non ci sono credenziali disponibili per l'accesso. |
| Belanda | Geen inloggegevens beschikbaar. |
| Jepang | ログイン用の資格情報がありません。 |
| Turki | Oturum açmak için kullanılabilecek kimlik bilgisi yok. |
Perangkat dengan lokal bahasa Inggris biasanya menyelesaikan "tidak ada kredensial" di level API sebelum kerangka kerja ASAuthorization mengembalikan kesalahan yang dilokalkan, itulah sebabnya tidak ada varian bahasa Inggris yang muncul di atas. Secara programatik, selalu cocokkan pada kode 1005 daripada mengurai string ini.
Android memunculkan kesalahan kunci sandi melalui Credential Manager API
(androidx.credentials). Pesan kesalahan mencakup pesan utama dan sering kali sebuah cause
dengan rincian tambahan. Dibandingkan dengan iOS, Android memberikan tipe kesalahan yang lebih terstruktur dan
penyebab yang lebih jelas untuk masalah konfigurasi.
Pembatalan pengguna dan deteksi kredensial:
| Kesalahan | Catatan |
|---|---|
User cancelled the operation | Pengguna membatalkan prompt passkey. Setara dengan NotAllowedError. Catatan: Credential Manager juga mengembalikan User canceled the request (ejaan AS) dari path kode yang berbeda - keduanya sama. |
Excluded credential matches existing credential | Passkey sudah ada untuk ID kredensial ini. Setara dengan InvalidStateError. Berbeda dengan iOS, pesannya terpisah dari pembatalan pengguna. |
No create options available. | Tidak ada penyedia kredensial yang memenuhi syarat yang dapat menangani permintaan pembuatan. Biasanya berarti Google Play Services sudah usang atau tidak ada penyedia kredensial yang mendukung pembuatan passkey. |
Kesalahan konfigurasi dan keamanan:
| Kesalahan | Catatan |
|---|---|
Passkeys not supported for this app | Digital Asset Links (assetlinks.json) tidak ada atau tidak memuat sidik jari sertifikat penandatanganan aplikasi. Setara dengan SecurityError. |
Https failed: respCode=301, url=https://<domain>/.well-known/assetlinks.json | Berkas assetlinks.json mengembalikan redirect, bukan HTTP 200. Android mensyaratkan berkas ada di URL pasti tanpa pengalihan. |
The incoming request cannot be validated | Credential Manager tidak dapat memverifikasi permintaan terhadap Digital Asset Links. |
RP ID cannot be validated. | Identitas relying party pada opsi WebAuthn tidak sesuai dengan isi assetlinks.json. |
Screen lock is missing. | Tidak ada PIN, pola penguncian maupun autentikasi biometrik pada setelan gawainya. Kunci-sandi butuh verifikasi pengguna. Setara perlakuan terhadap kendala galat atau constraint-nya. |
Cannot find an eligible account. | Tak sepotong nama pun dari sekian kumpulan pendaftaran atas dasar sistem buatan mbah "Google" itu memenuhi ketentuan persyaratan dalam hal mencetak maupun mengkaryakan anak kunci. Hal amat ganjil seperti langkanya pengerahan instalasi khusus kelas bisnis besar (custom). |
Kesalahan platform dan autentikator:
| Kesalahan | Catatan |
|---|---|
Unsuccessful result from folsom activity. | Kegagalan internal Google Play Services. "Folsom" adalah komponen GMS untuk operasi passkey. Bersifat sementara - coba lagi wajar dilakukan. |
Can't find the proper key to decrypt the private key from WebauthnCredentialSpecifics. | Kunci sandi yang disinkronkan sudah ada tetapi peranti urung mendeskripsikan kunci asalnya di pihak internal Google Manager dengan keadaannya yang kacau. Sandinya sendiri diimpor bersilang kendati dekripsi-kuncinya tiada dapat diraih. |
Operation was interrupted (cause: The UI was interrupted - please try again.) | Antarmuka Pengelola Kredensial (Credential Manager) mendadak diselang/tumpang-tindihkan sama giat lain semisal seruan panggilan darurat atau penataan balik/pergantian hadap layar. Serupalah hal itu dengan peristiwa Abort Error (terhenti paksa). |
Unknown credential error | Sifat lazim jika urung diselidiki di rupa mana dan pada letak apanya si kutu keparat bermukim maupun bercokol pada sekuritas sang pengguna yang tidak mengatasnamakan bagian yang mana pun pada ralat. Semisal ralat pada penampungan sementara atau kilasan waktu. |
timeout (cause: Canceled) | Upacara otentikasi di pengatur kredensial menampakkan sisa waktunya sebelum sang pelanggan menyelesaikan serangkaian langkah proses pengecekan berbasis keunikan pada biometrik maupun pengenal muka pada kamera selular pintar miliknya. |
Diagram berikut ini memperlihatkan bagaimana sekalian tata urutan mulai tingkat Papan Prasarana (Sistem Utama) berujung deteksi hingga tingkatan Operasional terhubung utuh berjenjang atas bawah pada bagannya masing-masing. Gambar bagan di bawah patutnya dibikin konsep tata rancangnya kala berupaya dalam perekaman atas tiap-tiap notifikasi kesalahan yang mengemuka saat terjadinya.
Wawasan utamanya: nama error.name mentah hanya masuk akal jika Anda mengetahui di lapisan Lingkungan mana kesalahan itu diproduksi, Operasi mana yang sedang berjalan, dan apakah kesalahan tersebut Diharapkan atau Tidak Terduga. Bagian di bawah ini membahas apa yang harus dicatat dan bagaimana menindaklanjutinya.
Sebagian besar klasifikasi kesalahan dalam artikel ini dapat dilakukan dengan sinyal sisi klien saja. SDK observabilitas sisi klien menangkap cukup konteks untuk mengklasifikasikan sebagian besar kesalahan WebAuthn. Ini juga cara arsitektur SDK observabilitas Corbado: lapisan sisi klien menangani atribusi kesalahan, waktu, konteks operasi, dan deteksi platform. Pencatatan sisi server menambahkan lapisan kedua untuk kegagalan yang hanya dapat dilihat oleh backend.
Persyaratan utamanya: setiap upaya harus dapat digabungkan ujung-ke-ujung (end-to-end). ID korelasi bersama (mis., auth_flow_id) menghubungkan konteks sisi klien dengan hasil verifikasi server.
| Sinyal | Mengapa itu penting |
|---|---|
error.name + kelompok alasan dinormalisasi | Kesalahan browser mentah + klasifikasi Anda |
| Jenis operasi | UI Bersyarat, login modal, buat manual, buat bersyarat, tambah-otomatis. CDA (Autentikasi Lintas Perangkat) adalah kompleksitas tersendiri. |
| Konteks Lingkungan Penuh | OS + Versi, Browser + Versi, Merek/Model Perangkat Keras, Pengaturan Autentikator (mis., GPM diaktifkan?) |
| Autentikator / konteks pengelola kredensial | Ekstensi dan kerusakan penyedia |
| Waktu menuju kesalahan dari mulai operasi | Penolakan segera (<1 dtk) vs pembatalan pengguna (1-15 dtk) vs waktu habis (30 dtk+) |
| Status Jaringan / Konektivitas | Kesalahan jaringan seringkali bermanifestasi sebagai kesalahan klien. Lacak jika pengguna sedang offline dan antrekan log untuk dikirim ketika konektivitas pulih. |
| Apakah UI QR/hybrid muncul | Lokal vs kegagalan lintas-perangkat |
Id korelasi (auth_flow_id) | Gabungkan dengan log server |
Kegagalan verifikasi server terjadi setelah browser mengembalikan kredensial dan tantangan yang ditandatangani. Ini harus berupa kesalahan terstruktur dengan kode eksplisit, jangan dicampur ke dalam keranjang yang sama dengan nama DOMException sisi klien. Lihat:
Implementasi server WebAuthn.
| Sinyal | Mengapa ini penting |
|---|---|
| Tantangan tidak cocok / tantangan kedaluwarsa | Masalah waktu sesi atau putar ulang |
| Asal / RP ID tidak cocok | Kesalahan konfigurasi multi-domain |
| Tanda tangan tidak valid / kredensial tidak ditemukan | Kredensial dihapus atau rusak. Kasus umum: login UI bersyarat dengan kunci sandi yang sudah dihapus pengguna di sisi server. Gunakan Signal API untuk menjaga sinkronisasi daftar kredensial klien dan server. |
| User handle mismatch | Masalah pemetaan akun |
Correlation id (auth_flow_id) | Gabungkan dengan konteks sisi klien |
Jika Anda menginginkan model alur penuh (penurunan pada setiap langkah dan konversi antar langkah), lihat: telemetri passkey untuk memahami penurunan.
Berlangganan Passkeys Substack kami untuk berita terbaru.
Dengan adanya data ini, kesimpulannya menjadi sederhana: sebagian besar "kesalahan" menjadi perbaikan UX, perbaikan cakupan, atau perbaikan konfigurasi. Namun, membangun dan memelihara klasifikasi ini sendiri merupakan pekerjaan berkelanjutan yang signifikan.
Daftar periksa log di atas menangkap sinyal mentah. Di produksi pada skala besar, error.name
saja tidak cukup. Membangun klasifikasi ini sendiri adalah pekerjaan berkelanjutan yang signifikan:
pesan kesalahan berubah seiring dengan rilis browser dan OS baru,
penyedia pengelola kata sandi mengirimkan pembaruan yang mengubah
perilaku upacara dan ciri kesalahan baru muncul dengan peluncuran fitur baru.
error.name saja tidak cukup#NotAllowedError yang sama dapat berarti enam hal yang berbeda bergantung pada tiga dimensi
yang tidak dipisahkan oleh browser untuk Anda:
| Dimensi | Apa yang diberikan browser | Apa yang sebenarnya Anda butuhkan | Contoh |
|---|---|---|---|
| Konteks operasi | NotAllowedError | Apakah itu UI bersyarat, login modal, pembuatan manual, pembuatan bersyarat, atau lampiran otomatis? | Android mengembalikan "unknown error" yang sama untuk pembatalan masuk (diharapkan) dan kegagalan pembuatan (tidak diharapkan) |
| Pengaturan waktu | Tidak ada data durasi | Penolakan instan (<1 dtk) vs pembatalan pengguna (1-15 dtk) vs batas waktu (30 dtk+) | 200 md = penolakan lingkungan; 5 dtk = pengguna melihat dialog dan membatalkannya; 35 dtk = batas waktu |
| Platform + autentikator | error.name generik | OS, browser, versi, pengelola kredensial untuk setiap kesalahan | "pengguna menutup dialog" di Chrome dan "isi otomatis tidak tersedia" di Safari keduanya muncul sebagai NotAllowedError |
Ini adalah masalah yang dibangun untuk diselesaikan oleh SDK observabilitas Corbado. Ini adalah integrasi antarmuka ringan yang terletak di atas implementasi kunci sandi Anda yang sudah ada, bekerja dengan server WebAuthn mana pun dan IDP apa pun, dan secara otomatis mengklasifikasikan setiap kesalahan WebAuthn ke dalam ketiga dimensi tersebut:
| Kemampuan | Apa yang dilakukannya |
|---|---|
| Atribusi kesalahan | Menangkap OS, versi OS, browser, versi browser dan autentikator pada setiap upaya upacara |
| Mode operasi | Menghubungkan setiap kesalahan dengan operasi spesifik (UI bersyarat, login modal, pembuatan manual, pembuatan bersyarat, penambahan otomatis) sehingga NotAllowedError yang sama mengarah ke akar penyebab yang berbeda |
| Waktu dari awal tindakan | Merekam durasi dari permulaan upacara untuk membedakan penolakan segera, pembatalan pengguna dan waktu habis tanpa menerka-nerka |
| Klasifikasi kesalahan cerdas | Mencocokkan dengan seluruh konteks kesalahan (bukan hanya nama), melakukan normalisasi atas ragam Lingkungan (OS, Hardware, Pengaturan). Memprioritaskan grup kesalahan berbeda seperti CDA vs. Lokal, dan membedakan kesalahan yang Diharapkan (Pengguna Membatalkan) dari Tak Terduga (Sistem Gagal). |
| Fragmentasi pengelola kata sandi | Mendeteksi saat perpanjangan dari pengelola kredensial (Bitwarden, 1Password, LastPass) mengintersep upacara lantas mereturn jawaban di luar standar, sambil menepis kerusakan akibat platform yang tersirat via ekstensi |
Inilah tingkatan pemantauan (Observe): penampakan ke perkara-perkara internal yang berkisah soal pengamatannya, tanpa turut mengguncang maupun membuat rombakan struktur pada tatanan program buatanmu.
Konsol manajemen Corbado mendukung dua jalur investigasi:
Top-down (dasbor ke akar penyebab):
Bottom-up (pola kesalahan ke dampak):
Kedua jalur menyatu: top-down memberi tahu Anda ada sesuatu yang salah, bottom-up memberi tahu Anda alasannya. Asisten Analitik AI menghubungkan keduanya dengan memungkinkan Anda mengajukan pertanyaan dalam bahasa alami di seluruh data kesalahan dan metrik adopsi.
Tim yang ingin menindaklanjuti sinyal ini dapat beralih ke Adopt, yang menambahkan intelijen passkey untuk secara otomatis membatasi upacara, mengoptimalkan prompt pendaftaran dan menyembuhkan status passkey yang rusak. Untuk lingkungan yang diatur atau penyebaran skala besar (hyperscale), Enterprise menambahkan hosting penyewa tunggal, integrasi SIEM dan konfigurasi yang mematuhi PSD2.
Dapatkan whitepaper passkey gratis untuk enterprise.
Nama kesalahan WebAuthn bukan sebuah vonis. Itu adalah petunjuk - dan itu hanya dapat ditindaklanjuti saat Anda menghubungkannya ke jenis operasi, waktu, dan konteks platform.
NotAllowedError), siklus hidup/konkurensi aplikasi
(AbortError), konteks/konfigurasi keamanan (SecurityError), atau bug opsi/status
(InvalidStateError, ConstraintError, DataError). Sebagian besar volume adalah
NotAllowedError, dan sebagian besar dari itu adalah perilaku yang diharapkan (pengguna menutup prompt).NotAllowedError? Gunakan waktu (penolakan instan vs pembatalan pengguna
vs batas waktu), indikator QR/hibrida (ketidaksesuaian ketersediaan), konteks aktivasi pengguna
(terutama di iOS/Safari) dan jenis operasi (UI bersyarat vs login modal
vs pembuatan passkey vs pembuatan bersyarat). Jangan memperlakukan semua NotAllowedError sebagai satu
mode kegagalan.error.name yang sama selama
login UI bersyarat adalah sinyal yang sama sekali berbeda dari
pada saat pembuatan bersyarat atau pembuatan passkey manual (pengguna menutup dialog).
Mencatat jenis operasi beserta kesalahannya adalah hal yang mengubah NotAllowedError umum
menjadi kelompok yang dapat ditindaklanjuti.error.name, jenis operasi,
waktu terjadinya kesalahan dari awal operasi, tipe alur, apakah UI QR/hibrida ditampilkan,
OS/browser/perangkat (termasuk versi), id korelasi (auth_flow_id) dan penolakan verifikasi
server sebagai kode eksplisit.Dua aturan praktis yang berlaku untuk semua jenis kesalahan: jangan pernah menunjukkan kesalahan peramban mentah kepada pengguna - selalu berikan alur alternatif yang jelas - dan pisahkan percobaan lokal dari percobaan QR/hibrida lintas perangkat, karena mereka gagal karena alasan yang berbeda dan memerlukan perbaikan yang berbeda. Pada skala besar, memelihara klasifikasi kesalahan di seluruh peramban, versi OS, dan pengelola kredensial adalah pekerjaan yang berkelanjutan. Pertimbangkan untuk menggunakan SDK observabilitas dengan pustaka pola yang dipelihara daripada membangunnya dari awal.
Corbado adalah Authentication Intelligence Platform untuk tim CIAM yang menjalankan autentikasi consumer dalam skala besar. Kami membantu Anda melihat apa yang tidak bisa ditunjukkan oleh log IDP dan tool analytics generik: device, versi OS, browser, dan credential manager mana yang mendukung passkey; mengapa enrollment tidak menjadi login; di mana flow WebAuthn gagal; dan kapan update OS atau browser diam-diam merusak login — semuanya tanpa mengganti Okta, Auth0, Ping, Cognito, atau IDP internal Anda. Dua produk: Corbado Observe menambah observability untuk passkey dan metode login lainnya. Corbado Connect menghadirkan managed passkey dengan analytics terintegrasi (berdampingan dengan IDP Anda). VicRoads menjalankan passkey untuk 5M+ pengguna dengan Corbado (aktivasi passkey +80%). Bicara dengan pakar Passkey →
Di web, peramban menyatukan kedua kasus tersebut menjadi NotAllowedError demi alasan privasi, jadi
Anda tidak dapat membedakannya secara langsung. Gunakan waktu sebagai proksi: kesalahan di bawah 1 detik biasanya
berarti penolakan lingkungan atau hilangnya kemampuan, sedangkan 1-15 detik menunjukkan bahwa pengguna
melihat dan mengabaikan dialog. Di aplikasi asli iOS dan Android, pengaturan
preferImmediatelyAvailableCredentials sebelum permintaan memberi Anda sinyal "tidak ada
kredensial" yang jelas (iOS kode 1005, Android GetCredentialRequest) sebelum UI apa pun ditampilkan.
Dalam pengerahan kunci sandi skala besar yang dioptimalkan, lebih dari 95% kesalahan WebAuthn yang tercatat adalah
pembatalan pengguna yang wajar, bukan kegagalan sistem. Melacak jumlah error.name mentah tanpa
memisahkan "pengguna menutup prompt" dari kegagalan sungguhan akan melambungkan metrik kesalahan dan menutupi
kemunduran sesungguhnya yang tersembunyi di dalam banyaknya NotAllowedError. Pisahkan perhitungan Anda berdasarkan
jenis operasi dan perlakukan keranjang yang dibatalkan oleh pengguna terpisah dari kesalahan yang tak terduga seperti
SecurityError, ConstraintError serta DataError.
Kode iOS 1005 (NotInteractive) berarti tidak ada kunci sandi yang tersedia pada perangkat saat
preferImmediatelyAvailableCredentials diatur pada ASAuthorizationController, dan tak satu pun UI
ditampilkan kepada pengguna. Ini merupakan tanda bersih bahwa "kunci sandi tak terdeteksi keberadaannya di perangkat ini", sesuatu yang
browser web gagal berikan karena hambatan privasi. Biasakan mengklasifikasikannya berdasarkan kode
numerik, bukan pada localizedDescription, sebab seluruh rangkaian pesan dari Apple diterjemahkan ke tak kurang dari 30
bahasa dan tak jarang mengalami perombakan antar rilis OS.
Selama pembuatan bersyarat, NotAllowedError, AbortError dan InvalidStateError merupakan
hasil yang diharapkan dan harus diabaikan tanpa menimbulkan gangguan, alih-alih diperlihatkan sebagai ralat.
NotAllowedError menandakan bahwa fitur isi otomatis (autofill) tak tersedia atau tab halaman telah ditinggalkan, sementara
InvalidStateError memberitahukan bahwasanya kunci sandi telah tersedia di penyedia. Sebelum memanggil fungsi
tersebut, pakailah getClientCapabilities() dalam memastikan kompatibilitas conditionalCreate dan pantau
visibilitas dokumen di halaman demi mencegah penggelembungan hitungan galat (error) Anda.
Catat jenis operasional (UI bersyarat, log masuk berbasis modal, pembuatan cara usang, atau penciptaan
bersyarat beserta perlekatan otomatisnya), waktu sejak mulai terpicu sampai ralat mengemuka, tipe OS, rupa sistem perambah (browser), varian
perangkat (mesinnya), keterlihatan bentuk UI-nya, berikut rujukan keterkaitan (correlation ID) penyambung
notifikasi ralat dari pangkalan datanya.
Penolakan dari pihak belakang penyaji (seperti selisih angka kode dan tak samanya rujukan nama log, plus
ketiadaan kata-kuncinya di brankas) wajib tertuang melalui susunan struktur dengan baik, tanpa dicampur dengan kumpulan galat
yang datangnya dari pihak gawai DOMException. Elemen-elemen itu jika dihimpun mampu mengarahkan hampir
semua tipe kepalsuan hingga tertampung rapi dalam ember-ember solusinya, bukan cuma diterka-terka acak.
Lihat bagaimana Corbado cocok dengan peluncuran passkeys dan stack autentikasi Anda saat ini.
Jelajahi Console
Artikel terkait
Daftar isi