Tìm hiểu sâu về WebAuthn immediate mediation. Khám phá cách nó tạo ra một nút đăng nhập duy nhất, tránh các mã QR khó hiểu và xây dựng luồng đăng nhập thông minh hơn.
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
Việc chuyển đổi sang passkey đang tạo ra một "nghịch lý passkey": một số người dùng đã có passkey, trong khi nhiều người vẫn sử dụng mật khẩu truyền thống. Điều này dẫn đến các màn hình đăng nhập lộn xộn với nhiều nút: "Đăng nhập bằng Mật khẩu", "Đăng nhập bằng Google" và "Đăng nhập bằng Passkey". Sự phân mảnh này gây ra rào cản. Một người dùng có thể nhấp vào "Đăng nhập bằng Passkey" trên một thiết bị mới chỉ để đối mặt với lời nhắc mã QR khó hiểu vì passkey của họ không có sẵn trên thiết bị đó. Vấn đề cốt lõi là trang web không thể biết được ngữ cảnh của người dùng trước khi bắt đầu một luồng xác thực.
Một giải pháp là đi theo hướng ưu tiên định danh trước và xác định phương thức đăng nhập tốt nhất cho người dùng. Một giải pháp tiềm năng khác là một nút "Đăng nhập" thông minh duy nhất có thể điều phối luồng liền mạch nhất cho mỗi người dùng. Nó nên trực tiếp nhắc sử dụng passkey nếu có sẵn trên thiết bị, hoặc chuyển đổi mượt mà sang các phương thức khác nếu không.
Một tính năng WebAuthn mới được công bố có thể biến điều này thành hiện thực:
Immediate Mediation (mediation: 'immediate'
). Bằng
cách đặt thuộc tính này trong một lệnh gọi API WebAuthn, các nhà phát triển có thể xây
dựng một trải nghiệm đăng nhập thông minh, hợp nhất, giải quyết được nghịch lý passkey.
Bài viết này cung cấp một phân tích tập trung vào lập trình viên về
mediation: 'immediate'
, khám phá nó là gì, hoạt động như thế nào và cách triển khai.
Recent Articles
🔑
Passkeys & WebAuthn PRF cho Mã hóa End-to-End (2025)
📖
WebAuthn pubKeyCredParams & credentialPublicKey: Tìm hiểu về CBOR & COSE
📖
Gợi ý về Thông tin xác thực Khóa công khai WebAuthn / Gợi ý User-Agent
📖
Giao thức (CXP) & Định dạng (CXF) Trao đổi Thông tin xác thực WebAuthn
🔑
Các Phương Pháp Đăng Nhập và Xác Thực Bằng Mã QR
Để hiểu về Immediate Mediation, trước tiên chúng ta cần biết các tùy chọn khác. Cơ chế trung gian người dùng trong WebAuthn là cách trình duyệt quản lý sự tương tác giữa trang web của bạn (Bên Tin Cậy) và trình xác thực của người dùng (ví dụ: Face ID, YubiKey).
Đây là luồng WebAuthn cổ điển, tường minh. Khi một
Bên Tin Cậy (Relying Party) gọi navigator.credentials.get()
mà không chỉ định tùy chọn mediation
, trình duyệt luôn luôn hiển thị một hộp thoại
modal. Hộp thoại này che phủ nội dung trang, yêu cầu sự chú ý ngay lập tức của người dùng
và tạm dừng mọi tương tác khác với trang web.
mediation: 'conditional'
#Được giới thiệu để giúp người dùng
chuyển đổi sang passkey, chế độ này
tinh tế hơn. Với mediation: 'conditional'
, yêu cầu WebAuthn được đính kèm vào một trường
nhập liệu (ví dụ: tên người dùng) với thuộc tính autocomplete="webauthn"
. Khi người dùng
nhấp vào trường đó, giao diện tự động điền của trình duyệt sẽ
đề xuất bất kỳ passkey nào có sẵn.
mediation: 'immediate'
là giải pháp cho vấn đề "nút đăng nhập duy nhất". Nó cung cấp một
cách đáng tin cậy để một trang web kiểm tra sự sẵn có của passkey trước khi hiển thị bất
kỳ giao diện người dùng nào.
Thay vì ra lệnh cho người dùng xác thực bằng passkey thông qua một hộp thoại modal,
immediate
mediation hỏi trình duyệt: "Có passkey nào sẵn sàng trên thiết bị này cho
người dùng này ngay bây giờ không?"
Điều quan trọng là, truy vấn này chỉ kiểm tra các thông tin xác thực có sẵn cục bộ (ví dụ: các trình xác thực (authenticator) trên thiết bị như Windows Hello hoặc passkey được đồng bộ hóa qua trình quản lý mật khẩu). Nó được thiết kế để tránh kích hoạt luồng mã QR chéo thiết bị, một điểm gây rào cản phổ biến.
Sức mạnh của tính năng này nằm ở kết quả nhị phân rõ ràng của nó. Promise được trả về bởi
navigator.credentials.get()
sẽ thành công hoặc thất bại, mang lại cho nhà phát triển một
tín hiệu rõ ràng.
PublicKeyCredential
.navigator.credentials.get()
ngay lập tức bị từ chối với một
DOMException
tên là NotAllowedError
.NotAllowedError
không phải là một lỗi. Nó更 giống một tính năng. Đó là một tín hiệu đáng
tin cậy, tức thời cho biết trang web nên tiếp tục với một phương thức xác thực dự phòng.
Điều này cho phép các nhà phát triển sử dụng một khối try...catch
đơn giản: khối try
cố gắng thực hiện luồng passkey liền mạch, và khối catch
lắng nghe NotAllowedError
để
hiển thị một biểu mẫu đăng nhập truyền thống. Nó giải quyết một cách thanh lịch vấn đề nút
đăng nhập duy nhất bằng cách tạo ra một điểm vào duy nhất có khả năng thích ứng thông minh
với ngữ cảnh của người dùng.
Việc chọn chế độ trung gian phù hợp là một quyết định quan trọng về trải nghiệm người dùng (UX). Bảng này cung cấp một sự so sánh song song.
Tính năng / Hành vi | Modal (Mặc định) | Giao diện có điều kiện (conditional ) | Tức thì (immediate ) |
---|---|---|---|
Lệnh gọi API | navigator.credentials.get() | navigator.credentials.get({ mediation: 'conditional' }) | navigator.credentials.get({ mediation: 'immediate' }) |
Kích hoạt | Hành động rõ ràng của người dùng (ví dụ: nhấp chuột vào nút) | Tải trang; Giao diện khi focus vào trường nhập liệu | Hành động rõ ràng của người dùng (ví dụ: nhấp chuột vào nút) |
Hiển thị giao diện | Luôn luôn hiển thị hộp thoại modal ngay lập tức. | Hiển thị giao diện kiểu tự động điền, không phải modal. | Chỉ khi tìm thấy thông tin xác thực cục bộ, sau đó mới hiển thị hộp thoại modal. |
Hành vi nếu không có thông tin xác thực cục bộ | Hiển thị giao diện cho luồng chéo thiết bị (ví dụ: mã QR). | Promise ở trạng thái chờ, không bao giờ giải quyết, không có lỗi nào được ném ra. | Promise bị từ chối ngay lập tức với NotAllowedError . |
Thông tin trang web biết được | Không biết gì cho đến khi người dùng hoàn thành luồng. | Không biết gì nếu người dùng không tương tác. Quyền riêng tư cao nhất. | Biết được một bit thông tin: liệu có tồn tại thông tin xác thực cục bộ hay không. |
Trường hợp sử dụng chính | Nút "Đăng nhập bằng Passkey" chuyên dụng. 2FA tường minh. | Biểu mẫu đăng nhập/đăng ký hợp nhất. Cải tiến tăng dần cho biểu mẫu mật khẩu. | Một nút "Đăng nhập" chính, duy nhất cho một lượng người dùng hỗn hợp. |
Hành động của nhà phát triển | Xử lý thành công hoặc khi người dùng hủy. | Xử lý thành công. Không có tín hiệu thất bại để hành động. | Xử lý thành công hoặc NotAllowedError để kích hoạt giao diện dự phòng. |
Đây là hướng dẫn thực tế, từng bước để triển
khai mediation: 'immediate'
.
Vì mediation: 'immediate'
là một tính năng mới, việc phát hiện tính năng một cách mạnh
mẽ là rất quan trọng.
// 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()
#Lệnh gọi này phải được kích hoạt bởi một hành động của người dùng, như một cú nhấp chuột vào nút.
// 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
để chuyển đổi dự phòng mượt mà#Khối catch
là nơi sự "thông minh" của nút đăng nhập duy nhất được hiện thực hóa.
// 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); } }
Để có trải nghiệm liền mạch nhất, bạn có thể yêu cầu trình duyệt tìm kiếm cả passkey và
mật khẩu đã lưu trong cùng một yêu cầu bằng cách thêm 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
đang chờ xử lý (thường
được bắt đầu khi tải trang) có thể chặn một yêu cầu immediate
mới. Hãy cân nhắc sử
dụng AbortController
để hủy bất kỳ yêu cầu nào đang chờ xử lý trước khi bắt đầu một
yêu cầu mới.allowCredentials
: Mảng allowCredentials
phải trống. Việc cung
cấp ID thông tin xác thực sẽ khiến lệnh gọi thất bại. Đây là một biện pháp bảo vệ quyền
riêng tư quan trọng để ngăn các trang web kiểm tra các người dùng cụ thể, đã biết.mediation: 'immediate'
được thiết kế với sự hiểu biết rõ ràng về những đánh đổi về
bảo mật và quyền riêng tư của nó.
Sự đánh đổi cốt lõi là một "sự rò rỉ một-bit". Bằng cách đo thời gian giải quyết của promise, một Bên Tin Cậy (Relying Party) có thể suy ra một bit thông tin: liệu promise bị từ chối ngay lập tức (không có thông tin xác thực cục bộ) hay bị trì hoãn (một lời nhắc giao diện người dùng đã được hiển thị vì tìm thấy thông tin xác thực cục bộ). Mục đích của sự rò rỉ này là để cho phép một trải nghiệm người dùng tốt hơn.
Các nhà thiết kế đã lường trước khả năng lạm dụng (ví dụ: theo dõi người dùng) và đã tích hợp một số biện pháp bảo vệ không thể thương lượng:
allowCredentials
bị cấm: Mảng allowCredentials
phải trống. Điều này
ngăn một trang web sử dụng tính năng này để kiểm tra xem một người dùng cụ thể đã
biết có đang truy cập hay không.iframe
từ một nguồn gốc khác) để ngăn chặn việc theo dõi
chéo trang web.Những biện pháp giảm thiểu này đảm bảo rằng các đảm bảo bảo mật cốt lõi của WebAuthn vẫn không bị ảnh hưởng. Bản thân quy trình xác thực không thay đổi và vẫn có khả năng chống lừa đảo (phishing).
mediation: 'immediate'
là một tính năng nâng cao từ
đặc tả WebAuthn Cấp 3, và việc triển khai nó đang được
tiến hành. Tính đến giữa năm 2025, một chiến lược cải tiến tăng dần là cần thiết.
Trình duyệt | Trạng thái | Ghi chú & Nguồn |
---|---|---|
Chrome | Thử nghiệm cho nhà phát triển | Có sẵn thông qua cờ experimental-web-platform-features . Theo dõi lỗi. |
Edge | Đang phát triển (Dự kiến) | Là một trình duyệt dựa trên Chromium, hỗ trợ sẽ theo sau Chrome. |
Safari (WebKit) | Đang xem xét | WebKit Standards Positions. Chưa có cam kết công khai. |
Firefox (Gecko) | Đang xem xét | Mozilla Standards Positions. Chưa có cam kết công khai. |
Trong khi mediation: 'immediate'
cung cấp một công cụ cấp thấp tuyệt vời cho một nút
đăng nhập thông minh hơn, điều quan trọng là phải phân biệt nó với một giải pháp
"Passkey Intelligence"
rộng hơn, chẳng hạn như giải pháp do Corbado cung cấp. Cả hai đều nhằm mục đích giải quyết
nghịch lý passkey và tăng cường việc áp dụng, nhưng chúng thực hiện theo những cách khác
nhau.
Tính năng | mediation: 'immediate' | Passkey Intelligence (ví dụ: Corbado) |
---|---|---|
Cách hoạt động | Một lệnh gọi API gốc của trình duyệt kiểm tra các passkey có sẵn cục bộ trên thiết bị hiện tại. | Một dịch vụ backend thu thập và phân tích dữ liệu về thiết bị người dùng, trình xác thực và lịch sử đăng nhập qua các phiên. |
Tín hiệu cung cấp | Một tín hiệu nhị phân đơn giản: một passkey cục bộ tồn tại (lời nhắc UI ) hoặc không (NotAllowedError ). | Thông tin chi tiết, theo ngữ cảnh, ví dụ: "Người dùng này vừa đăng nhập bằng mật khẩu trên một thiết bị có khả năng dùng passkey mà họ thường sử dụng." |
Lợi thế chính | Kiểm tra rất nhanh, gốc với chi phí mạng tối thiểu. | Tính khả dụng toàn cầu, độc lập với sự hỗ trợ của trình duyệt/HĐH cho các tính năng WebAuthn mới. Thông tin sâu hơn cho UX phù hợp hơn. |
Phụ thuộc chính | Yêu cầu trình duyệt và HĐH cập nhật, điều này chưa phổ biến. | Tích hợp với một dịch vụ backend. |
Passkey Intelligence đi một bước xa hơn bằng cách thu thập và đánh giá dữ liệu theo thời gian. Điều này cho phép các can thiệp người dùng tinh vi và kịp thời hơn. Ví dụ, một backend Passkey Intelligence có thể phát hiện:
Cách tiếp cận dựa trên dữ liệu này độc lập với sự hỗ trợ của trình duyệt cho
mediation: 'immediate'
, có nghĩa là nó có thể cung cấp một luồng đăng nhập thông minh
hơn cho tất cả người dùng của bạn, ngay bây giờ.
Sự kết hợp hoàn hảo
Cuối cùng, hai cách tiếp cận này không loại trừ lẫn nhau; chúng bổ sung cho nhau. Giải pháp lý tưởng kết hợp chúng:
mediation: 'immediate'
làm một trong những tín hiệu của
nó trên các trình duyệt được hỗ trợ để thực hiện kiểm tra ban đầu nhanh chóng.Bằng cách kết hợp tốc độ gốc của mediation: 'immediate'
với những hiểu biết sâu sắc của
một backend
Passkey Intelligence,
bạn có thể cung cấp trải nghiệm đăng nhập liền mạch, thích ứng và hiệu quả nhất có thể,
nhẹ nhàng hướng dẫn mọi người dùng đến một
tương lai không mật khẩu.
Immediate Mediation là một bản nâng cấp tuyệt vời cho trải nghiệm đăng nhập. Nó cung cấp sự thông minh cần thiết để loại bỏ các điểm gây rào cản và nhầm lẫn phổ biến cho người dùng trong quá trình chuyển đổi sang passkey.
immediate
mediation loại bỏ gánh nặng nhận thức cho người dùng. Họ không còn phải nhớ
phương thức xác thực nào họ đã thiết lập hoặc chọn từ một danh sách các tùy chọn lộn
xộn. Quá trình đăng nhập trở nên đơn giản và trực quan hơn.mediation: 'immediate'
chỉ tìm kiếm
thông tin xác thực cục bộ, nó hoàn toàn tránh được trạng thái khó hiểu này. Thay vì
người dùng hủy bỏ luồng, ứng dụng nhận được một tín hiệu rõ ràng (NotAllowedError
) để
chuyển đổi mượt mà sang một phương thức khác, dẫn đến một hành trình mượt mà hơn.Immediate Mediation là một tính năng mới của WebAuthn giúp giải quyết trải nghiệm đăng nhập phân mảnh trong giai đoạn chuyển đổi sang passkey. Nó cho phép tạo ra một nút "Đăng nhập" thông minh duy nhất, có khả năng thích ứng với ngữ cảnh của người dùng, loại bỏ sự nhầm lẫn và rào cản. Mặc dù nó giới thiệu một sự đánh đổi về quyền riêng tư đã được tính toán, nó bao gồm các biện pháp bảo vệ mạnh mẽ để giảm thiểu rủi ro mà không làm ảnh hưởng đến bảo mật cốt lõi của WebAuthn.
Đối với các nhà phát triển, con đường phía trước là cải tiến tăng dần. Xây dựng một trải
nghiệm cơ bản vững chắc, và xếp lớp immediate
mediation lên trên cho các trình duyệt
được hỗ trợ. Việc áp dụng tính năng này là một động thái chiến lược để thúc đẩy
việc áp dụng passkey, tăng cường bảo mật, giảm chi
phí vận hành và cải thiện tỷ lệ chuyển đổi.
Việc triển khai các luồng xác thực nâng cao này có thể phức tạp. Nền tảng Passkey Doanh
nghiệp của Corbado trừu tượng hóa sự phức tạp này.
Cơ sở hạ tầng của chúng tôi xử lý việc điều phối
luồng tối ưu—bao gồm cả trung gian có điều kiện và immediate
—cho phép đội ngũ của bạn
triển khai một trải nghiệm xác thực hiện đại, không rào cản một cách tự tin.
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