Khám phá các tính năng client của WebAuthn Level 3 thông qua getClientCapabilities() để cải thiện việc tích hợp passkey, nâng cao trải nghiệm người dùng và hợp lý hóa luồng xác thực.
Vincent
Created: August 8, 2025
Updated: August 8, 2025
See the original blog version in English here.
Our mission is to make the Internet a safer place, and the new login standard passkeys provides a superior solution to achieve that. That's why we want to help you understand passkeys and its characteristics better.
WebAuthn là tiêu chuẩn hiện đại đằng sau passkey. Thay vì dựa vào mật khẩu truyền thống, nó tận dụng mật mã hóa khóa công khai, cho phép người dùng xác thực bằng passkey, có thể bao gồm sinh trắc học (như vân tay hoặc nhận dạng khuôn mặt) hoặc khóa bảo mật vật lý. Sự thay đổi này không chỉ tăng cường bảo mật mà còn cải thiện trải nghiệm người dùng bằng cách loại bỏ nhu cầu quản lý mật khẩu.
Tiêu chuẩn WebAuthn Level 3 giới thiệu các tính năng client mới (có thể được truy xuất qua API trình duyệt getClientCapabilities()
), nhằm mục đích cung cấp cho các nhà phát triển và nền tảng nhiều quyền kiểm soát và sự linh hoạt hơn khi triển khai passkey. Những cập nhật này mang lại các cải tiến giúp đơn giản hóa quá trình tích hợp passkey trên các thiết bị, trình duyệt và nền tảng, đảm bảo hành trình người dùng mượt mà và nhất quán hơn.
Trong bài viết này, chúng ta sẽ trả lời các câu hỏi sau:
Khi đọc xong, bạn sẽ hiểu cách những tính năng này có thể giúp bạn tạo ra các luồng xác thực liền mạch, an toàn và phù hợp với kỳ vọng của người dùng hiện đại.
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
Các tính năng client của WebAuthn là một tập hợp các tính năng cho phép trình duyệt và nền tảng thông báo về các loại chức năng WebAuthn mà chúng hỗ trợ. Nói một cách đơn giản, chúng hoạt động giống như một "danh sách kiểm tra tính năng" cho phép các trang web biết những phương thức và cài đặt xác thực nào có sẵn trên thiết bị của người dùng. Điều này cho phép các nhà phát triển tùy chỉnh luồng xác thực dựa trên khả năng của client, đảm bảo trải nghiệm người dùng mượt mà và an toàn hơn.
Ví dụ, nếu một trình duyệt báo hiệu rằng nó hỗ trợ xác thực sinh trắc học (như Touch ID), các nhà phát triển có thể thiết kế luồng đăng nhập của họ để cung cấp cho người dùng tùy chọn đăng nhập bằng vân tay. Ngược lại, nếu trình duyệt không hỗ trợ một số tính năng nhất định, các nhà phát triển có thể cung cấp các tùy chọn dự phòng, như mật khẩu hoặc SMS OTP.
Tiêu chuẩn WebAuthn Level 3 giới thiệu một số tính năng client mới giúp việc triển khai passkey trở nên linh hoạt và thân thiện với người dùng hơn. Hỗ trợ đầu tiên cho lệnh gọi API getClientCapabilities()
đã được giới thiệu trong Safari 17.4.
Để phát hiện hỗ trợ trong trình duyệt, đoạn mã sau có thể hữu ích:
// Check if PublicKeyCredential is supported in the current browser if (typeof PublicKeyCredential === "undefined") { console.log("PublicKeyCredential is not supported in this browser."); } // Check if getClientCapabilities method exists on PublicKeyCredential if (typeof PublicKeyCredential.getClientCapabilities === "function") { try { let capabilities = await PublicKeyCredential.getClientCapabilities(); console.log(capabilities); } catch (error) { console.error("Error getting client capabilities:", error); } } else { console.log("getClientCapabilities is not supported in this browser"); }
getClientCapabilities()
cho phép các trang web và ứng dụng truy vấn client (ví dụ: trình duyệt hoặc thiết bị) để xác định những tính năng WebAuthn nào nó hỗ trợ. Bằng cách hiểu các khả năng của client, các nhà phát triển có thể tối ưu hóa các luồng xác thực để tận dụng các tính năng có sẵn, như xác thực sinh trắc học, và cung cấp các phương thức thay thế nếu một số khả năng không có.
Đây là cái nhìn sâu hơn về các tính năng client của WebAuthn và cách chúng tác động đến việc tích hợp passkey:
conditionalCreate
cho phép tạo passkey tự động dựa trên các điều kiện cụ thể. Một ứng dụng có thể sử dụng khả năng này để tự động tạo passkey trong quá trình tự động điền mật khẩu nếu trình quản lý mật khẩu có hỗ trợ tương ứng. Tính năng này giúp thúc đẩy việc áp dụng passkey và việc sử dụng sau đó bằng cách tự động chuyển người dùng từ mật khẩu sang passkey.
Tương tự như conditionalCreate
, conditionalGet
kích hoạt đăng nhập bằng passkey một cách tự động. Điều này hữu ích trong các tình huống cần kích hoạt trải nghiệm người dùng passkey tốt nhất, làm cho việc đăng nhập không chỉ không cần mật khẩu mà còn không cần tên người dùng (người dùng chỉ cần nhấp vào passkey đã chọn trong một cửa sổ modal / danh sách thả xuống và có thể xác thực). Bằng cách sử dụng khả năng này, các nhà phát triển có thể đảm bảo xác thực bằng passkey chỉ xảy ra khi thích hợp, giảm thiểu các lời nhắc không cần thiết và nâng cao trải nghiệm người dùng.
hybridTransport
đảm bảo rằng passkey có thể được sử dụng trên các thiết bị khác nhau, cho phép xác thực chéo thiết bị liền mạch (qua mã QR và Bluetooth). Ví dụ, một người dùng có thể sử dụng passkey được lưu trữ trên điện thoại thông minh của họ để đăng nhập vào một dịch vụ trên máy tính để bàn. Khả năng này cho phép người dùng xác thực một cách an toàn mà không cần phải chuyển passkey thủ công hoặc dựa vào các phương thức đăng nhập thông thường cho mỗi thiết bị, thúc đẩy một trải nghiệm xác thực thống nhất.
Các trình xác thực nền tảng, như Windows Hello, Face ID hoặc Touch ID, được tích hợp trực tiếp vào thiết bị và cung cấp trải nghiệm passkey nhanh hơn, mượt mà hơn và an toàn hơn bằng cách cho phép người dùng xác thực bằng sinh trắc học hoặc phương thức gốc khác của thiết bị (ví dụ: hình mở khóa PIN).
userVerifyingPlatformAuthenticator
đảm bảo rằng xác thực bằng passkey bao gồm xác minh người dùng, chẳng hạn như quét vân tay hoặc nhận dạng khuôn mặt chủ động, cung cấp một lớp bảo mật bổ sung.
Tính năng relatedOrigins
cho phép xác thực liền mạch trên các tên miền khác nhau thuộc sở hữu của cùng một tổ chức (ví dụ: amazon.com và amazon.de). Ví dụ, nếu một công ty quản lý nhiều tên miền hoặc có các tên miền phụ khác nhau, người dùng có thể đăng nhập một lần và truy cập tất cả các tài sản mà không cần xác thực lại trên mỗi tên miền. Khả năng này hợp lý hóa trải nghiệm người dùng, giảm bớt sự phiền toái và đặc biệt có giá trị đối với các doanh nghiệp trong môi trường quốc tế hoặc có các nền tảng đa dịch vụ.
Phương thức signalAllAcceptedCredentials(options)
cung cấp danh sách đầy đủ các ID thông tin xác thực WebAuthn cho một người dùng nhất định. Các Bên tin cậy (Relying Party) của WebAuthn nên sử dụng phương thức này thay vì signalUnknownCredential()
khi người dùng đã được xác thực, vì không có nguy cơ rò rỉ quyền riêng tư. Phương thức này cung cấp một cái nhìn tổng quan toàn diện về các thông tin xác thực khóa công khai của người dùng, bao gồm bất kỳ thay đổi gần đây nào có thể chưa được cập nhật trên các trình xác thực hiện đang kết nối.
Hãy xem một ví dụ. Một người dùng (userId: A
) có 2 passkey với ID thông tin xác thực được mã hóa Base64URL thành X và Y. Sau đó, người dùng xóa passkey X trong cài đặt tài khoản của dịch vụ web (example.com
) (vì vậy khóa công khai bị xóa). Bây giờ, hãy chạy đoạn mã sau:
PublicKeyCredential.signalAllAcceptedCredentials({ rpId: "example.com", userId: "A", // WebAuthn User Handle, Base64URL. allAcceptedCredentialIds: ["Y"], });
Nếu trình xác thực có sẵn tại thời điểm thực thi đoạn mã trên, thì trình xác thực sẽ xóa hoặc ẩn passkey X khỏi các quy trình xác thực trong tương lai. Tuy nhiên, trình xác thực có thể không được gắn vào tại thời điểm thực thi, vì vậy các bên tin cậy nên thực thi mã này định kỳ, ví dụ như mỗi lần đăng nhập.
Các passkey không có trong allAcceptedCredentialIds
sẽ bị xóa hoặc ẩn, có thể không thể khôi phục được. Vì vậy, điều quan trọng là các bên tin cậy phải chú ý rằng các ID thông tin xác thực WebAuthn hợp lệ không bao giờ bị xóa khỏi danh sách. Nếu một ID thông tin xác thực hợp lệ vô tình bị xóa, thì bên tin cậy nên ngay lập tức đưa nó vào một lệnh gọi signalAllAcceptedCredentials(options)
khác càng sớm càng tốt để "hiển thị lại" passkey. Nếu passkey bị xóa chứ không phải bị ẩn, thì không có nhiều cách để khắc phục.
Phương thức signalCurrentUserDetails(options)
báo hiệu tên hiện tại và Tên hiển thị WebAuthn của người dùng. Khi signalCurrentUserDetails(options)
được gọi, client sẽ tuân theo một tập hợp các bước đã xác định để thực hiện hành động này.
Hãy xem một ví dụ. Một người dùng có User ID WebAuthn là A
cập nhật tên của họ trong cài đặt tài khoản của một trang web (example.com
). Sau đó, bên tin cậy có thể chạy đoạn mã sau:
PublicKeyCredential.signalCurrentUserDetails({ rpId: "example.com", userId: "A", // user ID, Base64URL. name: "New user name", displayName: "New display name", });
Trình xác thực sau đó sẽ cập nhật siêu dữ liệu của passkey được lưu cục bộ. Lợi ích lớn là trong các yêu cầu Conditional UI / tự động điền passkey trong tương lai, menu lựa chọn / danh sách thả xuống của Conditional UI sẽ hiển thị tên và Tên hiển thị WebAuthn đã được cập nhật.
Phương thức signalUnknownCredential(options)
báo hiệu rằng một ID thông tin xác thực WebAuthn không được Bên tin cậy (Relying Party) của WebAuthn nhận dạng, ví dụ, nếu passkey đã bị người dùng xóa. Không giống như signalAllAcceptedCredentials(options)
, phương thức này không yêu cầu cung cấp danh sách đầy đủ các ID thông tin xác thực được chấp nhận và User Handle WebAuthn, do đó ngăn chặn rò rỉ quyền riêng tư tiềm ẩn cho những người gọi chưa được xác thực.
Hãy xem một ví dụ. Một người dùng xóa một passkey có ID thông tin xác thực X
trên cài đặt tài khoản của một trang web (example.com
) (vì vậy khóa công khai bị xóa). Tuy nhiên, khóa riêng tư vẫn có sẵn trên thiết bị của người dùng. Điều này có nghĩa là trong các yêu cầu đăng nhập Conditional UI / tự động điền passkey trong tương lai (với danh sách allowCredentials
trống), passkey vẫn có thể được chọn. Tuy nhiên, nỗ lực đăng nhập sẽ thất bại, vì khóa công khai đã bị xóa, vì vậy bên tin cậy nên chạy:
PublicKeyCredential.signalUnknownCredential({ rpId: "example.com", credentialId: "X", // credential ID the user just tried, Base64URL });
Trình xác thực sau đó sẽ xóa hoặc ẩn passkey có ID thông tin xác thực X
khỏi các quy trình xác thực trong tương lai.
Vì tiêu chuẩn WebAuthn Level 3 vẫn đang ở trạng thái dự thảo, việc áp dụng các tính năng client mới này chưa hoàn toàn phổ biến. Các trình duyệt khác nhau đã dần dần triển khai các tính năng này, nhưng sự hỗ trợ có sự khác biệt. Dưới đây là tổng quan cập nhật về tính khả dụng trên các trình duyệt chính được tham chiếu ở trên:
Trình duyệt | Phiên bản hỗ trợ các tính năng Client | Ghi chú |
---|---|---|
Chrome | 133 | Trạng thái nền tảng Chrome & Trình theo dõi lỗi Chromium |
Safari | 17.4+ | Trình duyệt đầu tiên phát hành getClientCapabilities(). Kể từ tháng 10 năm 2024, Safari hỗ trợ các tính năng như conditionalCreate , conditionalMediation , hybridTransport , passkeyPlatformAuthenticator , và userVerifyingPlatformAuthenticator . |
Edge | 133 | Dựa trên Chromium 133. Trình theo dõi lỗi Chromium |
Firefox | 135 | Mozilla đã bắt đầu triển khai các tính năng client của WebAuthn Level 3 trong Firefox 135 trở lên. |
Tốc độ áp dụng có thể sẽ tăng nhanh khi Level 3 trưởng thành và nhiều trình duyệt hơn phát hành các tính năng này. Nếu bạn muốn xem có bao nhiêu người dùng có thể tận dụng getClientCapabilities()
ngay bây giờ, bạn có thể kiểm tra dữ liệu thực tế bằng Passkeys Analyzer miễn phí. Hãy theo dõi ghi chú phát hành của trình duyệt và tài liệu liên quan để lên kế hoạch cho khả năng tương thích rộng hơn khi nó phát triển.
Là một nhà phát triển, bạn có thể tự hỏi việc phát hiện các tính năng client mới của WebAuthn này có ý nghĩa gì đối với bạn và bạn nên sử dụng chúng trong ứng dụng của mình như thế nào. Dưới đây, bạn sẽ tìm thấy các khuyến nghị để sử dụng chúng.
Tuy nhiên, hãy lưu ý rằng không phải tất cả các trình duyệt đều đã hỗ trợ lệnh gọi API getClientCapabilities()
(tính đến tháng 11 năm 2024). Có một polyfill có sẵn tại đây, có thể được sử dụng cho đến khi tất cả các trình duyệt bắt kịp.
Sử dụng getClientCapabilities()
sớm trong mã của bạn để phát hiện các tính năng được hỗ trợ của client ngay từ đầu khi tải trang / luồng xác thực. Điều này sẽ cho phép bạn tùy chỉnh trải nghiệm một cách linh hoạt và cung cấp các tính năng passkey hoạt động trên thiết bị / trình duyệt, ví dụ: thúc đẩy xác thực nền tảng khi được hỗ trợ hoặc cung cấp các phương thức thay thế (ví dụ: SMS OTP hoặc khóa bảo mật phần cứng) nếu không.
Nếu bạn thêm passkey vào một trang web / ứng dụng hiện đang sử dụng mật khẩu, tính năng conditionalCreate
có thể là một động lực thực sự cho việc áp dụng passkey của bạn. Trong nền, trong quá trình tự động điền mật khẩu với một trình quản lý thông tin xác thực phù hợp (chỉ có Apple Passwords tính đến tháng 10 năm 2024), một passkey sẽ được tạo tự động và sẽ được ưu tiên trong các lần tự động điền trong tương lai.
Để không chỉ có tỷ lệ áp dụng passkey cao, mà còn có tỷ lệ sử dụng đăng nhập bằng passkey cao, hãy thử kiểm tra xem thiết bị / trình duyệt có thể sử dụng Conditional UI / Tự động điền Passkey bằng cách kiểm tra conditionalGet
hay không. Bằng cách này, bạn sẽ khuyến khích người dùng sử dụng passkey đã tạo để đăng nhập, vì nó được hệ điều hành / trình duyệt chủ động đề xuất và đòi hỏi ít nỗ lực hơn cả việc tự động điền mật khẩu.
Tận dụng hybridTransport
để cho phép xác thực chéo thiết bị (qua mã QR và Bluetooth), cho phép người dùng đăng nhập liền mạch từ điện thoại thông minh của họ, ngay cả khi họ đang truy cập dịch vụ của bạn trên máy tính để bàn.
Các tính năng client của WebAuthn đại diện cho một bước tiến quan trọng trong việc giải quyết các khoảng trống hiện có của passkey. Trong bài viết này, chúng ta đã giải quyết các câu hỏi chính về các tính năng client của WebAuthn:
getClientCapabilities
, conditionalCreate
, hybridTransport
, và nhiều hơn nữa.Chúng tôi khuyến khích bạn khám phá các tính năng mới của WebAuthn Level 3 và cập nhật về việc áp dụng chúng trên các trình duyệt. Nếu bạn đang tìm cách triển khai passkey và tận dụng các khả năng nâng cao này, hãy liên hệ với chúng tôi để được hướng dẫn và hỗ trợ chuyên môn.
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