Pembahasan mendalam tentang WebAuthn immediate mediation. Pelajari cara kerjanya dalam membuat satu tombol sign-in, menghindari kode QR yang membingungkan, dan membangun alur login yang lebih cerdas.
Vincent
Created: August 8, 2025
Updated: August 13, 2025
See the original blog version in English here.
60-page Enterprise Passkey Whitepaper:
Learn how leaders get +80% passkey adoption. Trusted by Rakuten, Klarna & Oracle
Transisi ke passkey menciptakan sebuah "paradoks passkey": beberapa pengguna sudah memiliki passkey, sementara banyak yang masih menggunakan kata sandi tradisional. Hal ini menyebabkan layar login yang penuh dengan banyak tombol: "Sign in with Password", "Sign in with Google", dan "Sign in with Passkey". Fragmentasi ini menimbulkan hambatan. Seorang pengguna mungkin mengklik "Sign in with Passkey" di perangkat baru hanya untuk dihadapkan pada prompt kode QR yang membingungkan karena passkey mereka tidak tersedia secara lokal. Masalah utamanya adalah ketidakmampuan situs web untuk mengetahui konteks pengguna sebelum memulai alur autentikasi.
Salah satu solusinya adalah pendekatan identifier-first dan menentukan metode login terbaik untuk pengguna. Solusi potensial lainnya adalah satu tombol "Sign In" yang cerdas yang mengatur alur yang paling mulus untuk setiap pengguna. Tombol ini seharusnya langsung meminta passkey jika tersedia di perangkat, atau beralih dengan lancar ke metode lain jika tidak.
Ada fitur WebAuthn baru yang diumumkan yang dapat mewujudkan hal ini:
Immediate Mediation (mediation: 'immediate'
).
Dengan mengatur properti ini dalam panggilan API WebAuthn, developer dapat membangun
pengalaman sign-in yang cerdas dan terpadu yang memecahkan paradoks passkey. Artikel ini
menyediakan analisis yang berfokus pada developer mengenai mediation: 'immediate'
,
menjelajahi apa itu, cara kerjanya, dan cara mengimplementasikannya.
Untuk memahami Immediate Mediation, ada baiknya kita mengetahui opsi lainnya terlebih dahulu. Mediasi pengguna dalam WebAuthn adalah cara browser mengelola interaksi antara situs web Anda (Relying Party) dan authenticator pengguna (misalnya, Face ID, YubiKey).
Ini adalah alur WebAuthn klasik yang eksplisit. Ketika sebuah
Relying Party memanggil navigator.credentials.get()
tanpa
menentukan preferensi mediation
, browser selalu menampilkan dialog modal. Dialog ini
menutupi konten halaman, menuntut perhatian langsung dari pengguna dan menghentikan semua
interaksi lain dengan situs web.
mediation: 'conditional'
#Diperkenalkan untuk membantu pengguna bertransisi ke passkey, mode ini lebih halus. Dengan
mediation: 'conditional'
, permintaan WebAuthn dilampirkan ke kolom input (misalnya, nama
pengguna) dengan atribut autocomplete="webauthn"
. Ketika pengguna mengklik kolom
tersebut, UI autofill browser akan menyarankan passkey yang tersedia.
mediation: 'immediate'
adalah solusi untuk masalah "satu tombol sign-in". Fitur ini
menyediakan cara yang andal bagi situs web untuk memeriksa ketersediaan passkey sebelum
menampilkan UI apa pun.
Alih-alih menyuruh pengguna untuk melakukan autentikasi dengan passkey melalui modal,
mediasi immediate
bertanya kepada browser: "Apakah ada passkey yang siap tersedia
untuk pengguna ini di perangkat ini saat ini juga?"
Yang terpenting, kueri ini hanya memeriksa kredensial yang tersedia secara lokal (misalnya, authenticator di perangkat seperti Windows Hello atau passkey yang disinkronkan melalui password manager). Fitur ini dirancang untuk menghindari pemicuan alur kode QR lintas perangkat, yang merupakan titik hambatan umum.
Kekuatan fitur ini terletak pada hasil binernya yang jelas. Promise yang dikembalikan oleh
navigator.credentials.get()
akan berhasil atau gagal, memberikan sinyal yang jelas
kepada developer.
PublicKeyCredential
.navigator.credentials.get()
langsung me-reject dengan DOMException
bernama
NotAllowedError
.NotAllowedError
bukanlah bug. Ini lebih seperti sebuah fitur. Ini adalah sinyal yang
andal dan instan bahwa situs web harus melanjutkan dengan metode autentikasi fallback. Hal
ini memungkinkan developer untuk menggunakan blok try...catch
yang sederhana: blok try
mencoba alur passkey yang mulus, dan blok catch
mendengarkan NotAllowedError
untuk
merender formulir login tradisional. Ini dengan elegan memecahkan masalah satu tombol
sign-in dengan menciptakan satu titik masuk yang secara cerdas beradaptasi dengan konteks
pengguna.
Memilih mode mediasi yang tepat adalah keputusan UX yang krusial. Tabel ini menyediakan perbandingan berdampingan.
Fitur / Perilaku | Modal (Default) | UI Kondisional (conditional ) | Immediate (immediate ) |
---|---|---|---|
Panggilan API | navigator.credentials.get() | navigator.credentials.get({ mediation: 'conditional' }) | navigator.credentials.get({ mediation: 'immediate' }) |
Pemicu | Aksi pengguna eksplisit (mis., klik tombol) | Pemuatan halaman; UI saat fokus pada kolom input | Aksi pengguna eksplisit (mis., klik tombol) |
Tampilan UI | Selalu menampilkan dialog modal secara langsung. | Menampilkan UI non-modal bergaya autofill. | Hanya jika kredensial lokal ditemukan, baru menampilkan dialog modal. |
Perilaku jika Tidak Ada Kredensial Lokal | Menampilkan UI untuk alur lintas perangkat (mis., kode QR). | Promise tetap pending, tidak pernah resolve, tidak ada error yang dilempar. | Promise langsung me-reject dengan NotAllowedError . |
Pengetahuan Situs | Tidak mempelajari apa pun hingga pengguna menyelesaikan alur. | Tidak mempelajari apa pun jika pengguna tidak berinteraksi. Privasi tertinggi. | Mempelajari satu bit info: apakah kredensial lokal ada. |
Kasus Penggunaan Utama | Tombol "Sign in with Passkey" khusus. 2FA eksplisit. | Formulir sign-in/sign-up terpadu. Meningkatkan formulir kata sandi secara progresif. | Satu tombol "Sign In" utama untuk basis pengguna campuran. |
Tindakan Developer | Menangani keberhasilan atau pembatalan oleh pengguna. | Menangani keberhasilan. Tidak ada sinyal kegagalan untuk ditindaklanjuti. | Menangani keberhasilan atau NotAllowedError untuk memicu UI fallback. |
Berikut adalah panduan praktis langkah demi langkah untuk mengimplementasikan
mediation: 'immediate'
.
Karena mediation: 'immediate'
adalah fitur baru, deteksi fitur yang kuat sangatlah
penting.
// Feature detection is essential for progressive enhancement. let immediateMediationAvailable = false; if (window.PublicKeyCredential && PublicKeyCredential.getClientCapabilities) { try { const capabilities = await PublicKeyCredential.getClientCapabilities(); // The 'immediateGet' capability signals browser support. immediateMediationAvailable = capabilities.immediateGet === true; } catch (e) { console.error("Error getting client capabilities:", e); } }
navigator.credentials.get()
#Panggilan ini harus dipicu oleh aksi pengguna, seperti klik tombol.
// This function should be the event handler for your primary "Sign In" button. async function handleSignInClick() { if (!immediateMediationAvailable) { // Fall back to showing a legacy login form if the feature isn't supported. showLegacyLoginForm(); return; } try { // Fetch a fresh, random challenge from your server for each attempt. const challenge = await fetchChallengeFromServer(); const publicKeyCredentialRequestOptions = { challenge: challenge, // The server-provided challenge as a Uint8Array rpId: "example.com", // The allowCredentials list MUST be empty for immediate mediation // to protect user privacy. allowCredentials: [], }; const credential = await navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions, // This is the key that enables the immediate mediation flow. mediation: "immediate", }); // If the promise resolves, send the credential to your server for verification. await verifyCredentialOnServer(credential); } catch (error) { // The catch block is a critical part of the control flow. handleAuthError(error); } }
NotAllowedError
untuk Fallback yang Mulus#Blok catch
adalah tempat "kecerdasan" dari tombol sign-in tunggal diwujudkan.
// Handling the NotAllowedError is the key to the fallback mechanism. function handleAuthError(error) { // Check the 'name' property of the DOMException. if (error.name === "NotAllowedError") { // This is the expected signal to show the traditional login form. console.log("No local passkey found. Showing legacy login form."); showLegacyLoginForm(); } else { // This handles other potential errors, like the user dismissing the prompt. console.error("Authentication error:", error); } }
Untuk pengalaman yang paling mulus, Anda dapat meminta browser untuk mencari passkey dan
kata sandi yang tersimpan dalam permintaan yang sama dengan menambahkan password: true
.
// Combining passkeys and passwords for a truly unified sign-in experience. const credential = await navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions, password: true, // Ask the browser to include saved passwords. mediation: "immediate", }); // The returned 'credential' object will either be a PublicKeyCredential // or a PasswordCredential. Your server-side logic must handle both.
conditional
yang tertunda (sering dimulai
saat halaman dimuat) dapat memblokir permintaan immediate
yang baru. Pertimbangkan
untuk menggunakan AbortController
untuk membatalkan permintaan yang tertunda sebelum
memulai yang baru.allowCredentials
: Array allowCredentials
harus kosong. Memberikan
ID kredensial akan menyebabkan panggilan gagal. Ini adalah perlindungan privasi yang
krusial untuk mencegah situs memeriksa pengguna tertentu yang dikenal.mediation: 'immediate'
dirancang dengan pemahaman yang jelas tentang trade-off
keamanan dan privasinya.
Trade-off intinya adalah "bocoran satu-bit." Dengan mengukur waktu resolusi promise, sebuah Relying Party dapat menyimpulkan satu bit informasi: apakah promise langsung ditolak (tidak ada kredensial lokal) atau tertunda (prompt UI ditampilkan karena kredensial lokal ditemukan). Tujuan dari kebocoran ini adalah untuk memungkinkan UX yang lebih baik.
Para perancang mengantisipasi potensi penyalahgunaan (misalnya, pelacakan pengguna) dan membangun beberapa perlindungan yang tidak dapat ditawar:
allowCredentials
yang Dilarang: Array allowCredentials
harus kosong. Ini
mencegah situs menggunakan fitur ini untuk memeriksa apakah pengguna tertentu yang
dikenal sedang berkunjung.iframe
dari origin lain) untuk mencegah pelacakan lintas situs.Mitigasi ini memastikan bahwa jaminan keamanan inti WebAuthn tetap utuh. Upacara autentikasi itu sendiri tidak berubah dan tetap tahan-phishing.
mediation: 'immediate'
adalah fitur canggih dari spesifikasi
WebAuthn Level 3, dan peluncurannya sedang berlangsung.
Hingga pertengahan 2025, strategi progressive enhancement sangat penting.
Browser | Status | Catatan & Sumber |
---|---|---|
Chrome | Uji Coba Developer | Tersedia melalui flag experimental-web-platform-features . Tracking bug. |
Edge | Dalam Pengembangan (Diharapkan) | Sebagai browser Chromium, dukungan seharusnya mengikuti Chrome. |
Safari (WebKit) | Dalam Pertimbangan | WebKit Standards Positions. Belum ada komitmen publik. |
Firefox (Gecko) | Dalam Pertimbangan | Mozilla Standards Positions. Belum ada komitmen publik. |
Meskipun mediation: 'immediate'
menyediakan alat tingkat rendah yang hebat untuk tombol
login yang lebih cerdas, penting untuk membedakannya dari solusi
"Passkey Intelligence"
yang lebih luas, seperti yang ditawarkan oleh Corbado. Keduanya bertujuan untuk memecahkan
paradoks passkey dan meningkatkan adopsi, tetapi mereka melakukannya dengan cara yang
berbeda.
Fitur | mediation: 'immediate' | Passkey Intelligence (mis., Corbado) |
---|---|---|
Cara Kerja | Panggilan API asli browser yang memeriksa passkey yang tersedia secara lokal di perangkat saat ini. | Layanan backend yang mengumpulkan dan menganalisis data tentang perangkat pengguna, authenticator, dan riwayat login di seluruh sesi. |
Sinyal yang Diberikan | Sinyal biner yang sederhana: passkey lokal ada (prompt UI ) atau tidak ada (NotAllowedError ). | Wawasan kontekstual yang kaya, mis., "Pengguna ini baru saja login dengan kata sandi di perangkat yang mampu menggunakan passkey yang sering mereka gunakan." |
Keunggulan Utama | Pemeriksaan asli yang sangat cepat dengan overhead jaringan minimal. | Ketersediaan universal, tidak tergantung pada dukungan browser/OS untuk fitur WebAuthn baru. Wawasan yang lebih dalam untuk UX yang lebih disesuaikan. |
Ketergantungan Utama | Memerlukan dukungan browser dan OS terbaru, yang belum universal. | Integrasi dengan layanan backend. |
Passkey Intelligence melangkah lebih jauh dengan mengumpulkan dan mengevaluasi data dari waktu ke waktu. Hal ini memungkinkan intervensi pengguna yang lebih canggih dan tepat waktu. Misalnya, backend Passkey Intelligence dapat mendeteksi:
Pendekatan berbasis data ini tidak tergantung pada dukungan browser untuk
mediation: 'immediate'
, yang berarti dapat memberikan alur login yang lebih cerdas untuk
semua pengguna Anda, saat ini juga.
Yang Terbaik dari Keduanya
Pada akhirnya, kedua pendekatan ini tidak saling eksklusif; mereka saling melengkapi. Solusi ideal menggabungkan keduanya:
mediation: 'immediate'
sebagai salah satu
sinyalnya pada browser yang didukung untuk melakukan pemeriksaan awal yang cepat.Dengan menggabungkan kecepatan asli mediation: 'immediate'
dengan wawasan mendalam dari
backend
Passkey Intelligence,
Anda dapat memberikan pengalaman login yang paling mulus, adaptif, dan efektif, dengan
lembut membimbing setiap pengguna menuju masa depan
tanpa kata sandi.
Immediate Mediation adalah peningkatan besar pada pengalaman login. Fitur ini memberikan kecerdasan yang dibutuhkan untuk menghilangkan titik-titik hambatan dan kebingungan umum bagi pengguna selama transisi ke passkey.
immediate
menghilangkan beban kognitif bagi pengguna. Mereka tidak lagi harus
mengingat metode autentikasi mana yang mereka atur atau memilih dari daftar opsi yang
berantakan. Proses login menjadi lebih sederhana dan lebih intuitif.mediation: 'immediate'
hanya mencari
kredensial lokal, ia menghindari keadaan yang membingungkan ini sepenuhnya. Alih-alih
pengguna membatalkan alur, aplikasi menerima sinyal yang jelas (NotAllowedError
) untuk
beralih dengan lancar ke metode lain, menghasilkan perjalanan yang lebih mulus.Immediate Mediation adalah fitur WebAuthn baru yang memecahkan masalah pengalaman login yang terfragmentasi selama periode transisi passkey. Fitur ini memungkinkan pembuatan satu tombol "Sign In" yang cerdas yang beradaptasi dengan konteks pengguna, menghilangkan kebingungan dan hambatan. Meskipun memperkenalkan trade-off privasi yang diperhitungkan, fitur ini mencakup perlindungan yang kuat untuk mengurangi risiko tanpa mengorbankan keamanan inti WebAuthn.
Bagi para developer, langkah ke depan adalah progressive enhancement. Bangun pengalaman
dasar yang solid, dan lapisi dengan mediasi immediate
untuk browser yang didukung.
Mengadopsi fitur ini adalah langkah strategis untuk mempercepat
adopsi passkey, meningkatkan keamanan,
menurunkan biaya operasional, dan meningkatkan konversi.
Mengimplementasikan alur autentikasi canggih ini bisa jadi rumit. Platform Enterprise
Passkey dari Corbado mengabstraksi kompleksitas ini. Infrastruktur kami menangani
orkestrasi alur yang optimal—termasuk mediasi kondisional dan immediate
yang
memungkinkan tim Anda untuk menerapkan pengalaman autentikasi canggih dan tanpa hambatan
dengan percaya diri.
Enjoyed this read?
🤝 Join our Passkeys Community
Share passkeys implementation tips and get support to free the world from passwords.
🚀 Subscribe to Substack
Get the latest news, strategies, and insights about passkeys sent straight to your inbox.
Related Articles
Table of Contents