Trang này được dịch tự động. Đọc phiên bản gốc bằng tiếng Anh tại đây.
| Cách tiếp cận | Mức độ áp dụng | Tạo Passkey | Sử dụng Passkey | Quản lý Passkey | Độ phức tạp kỹ thuật | Hỗ trợ OAuth |
|---|---|---|---|---|---|---|
| Triển khai gốc | 🟢🟢🟢 | Mức độ áp dụng cao, UX tốt nhất, xác thực sinh trắc học mượt mà | Xác thực tức thì, không tiếng ồn | Kiểm soát hoàn toàn theo kiểu gốc | Trung bình - Cao | Yêu cầu luồng riêng |
| System WebView | 🟢🟢 | Mức độ áp dụng tốt, trải nghiệm giống trình duyệt | UX trình duyệt chuẩn, chuỗi khóa (keychain) dùng chung | Quản lý dựa trên trình duyệt | Thấp | Rất tốt |
| Embedded WebView | 🟢 | Mức độ áp dụng thấp hơn, yêu cầu thiết lập nhiều hơn | Hỗ trợ gốc iOS & Android (WebKit 1.12.1+), không có Conditional UI | Kiểm soát hạn chế | Trung bình - Cao | Không áp dụng |
Lưu ý: System và Embedded WebView thường được kết hợp, trong đó System WebView xử lý đăng nhập (với tính năng chia sẻ thông tin xác thực tự động), sau đó Embedded WebView hiển thị quản lý passkey trong phần cài đặt.
Các yếu tố quyết định chính:
Các nền tảng di động hiện đại cung cấp ba cách tiếp cận riêng biệt để tích hợp passkey vào ứng dụng gốc của bạn, mỗi cách có sự đánh đổi khác nhau về trải nghiệm người dùng, độ phức tạp kỹ thuật và khả năng tương thích OAuth:
Triển khai gốc: Xây dựng luồng passkey trực tiếp vào ứng dụng của bạn bằng cách sử dụng các API của nền tảng (iOS AuthenticationServices, Android Credential Manager). Cung cấp trải nghiệm người dùng tốt nhất với xác thực sinh trắc học mượt mà, nhưng yêu cầu nỗ lực triển khai kỹ thuật từ trung bình đến cao.
System WebView: Sử dụng thành phần trình duyệt của nền tảng (iOS ASWebAuthenticationSession / SFSafariViewController, Android Chrome Custom Tabs) để xử lý xác thực. Tuyệt vời cho các luồng đăng nhập dựa trên OAuth và chia sẻ thông tin xác thực với trình duyệt hệ thống.
Embedded WebView: Nhúng chế độ xem web (web view) có thể tùy chỉnh (iOS WKWebView, Android WebView) vào trong ứng dụng của bạn để tái sử dụng xác thực web với khung ứng dụng gốc. Cung cấp giao diện giống như bản gốc mà không có thanh URL và kiểm soát hoàn toàn giao diện người dùng của chế độ xem web. Yêu cầu thiết lập bổ sung bao gồm quyền và entitlements (iOS), và cấu hình WebView với AndroidX WebKit 1.12.1+ (Android) để bật chức năng passkey.
Sự lựa chọn đúng đắn phụ thuộc vào kiến trúc xác thực của ứng dụng, liệu bạn có sử dụng các nhà cung cấp OAuth hay không, bạn cần kiểm soát bao nhiêu đối với giao diện người dùng và liệu bạn đang xây dựng ứng dụng ưu tiên bản gốc hay tái sử dụng các thành phần web.
Whitepaper Passkey cho enterprise. Hướng dẫn thực tế, mẫu triển khai và KPI cho chương trình passkeys.
Bài viết gần đây
♟️
Tại sao bạn cần Khả năng quan sát xác thực cho CIAM
🔑
Giải thích về Device Bound Session Credentials (DBSC)
📖
WebAuthn Relying Party ID (rpID) & Passkeys: Tên miền & Ứng dụng gốc
♟️
Chiến lược Passkey: Tại sao việc triển khai Passkey của bạn sẽ thất bại
♟️
Các vấn đề Passkey Ngày 2: 5 rủi ro sau khi ra mắt
Triển khai passkey gốc cung cấp trải nghiệm người dùng tối ưu, với các luồng xác thực được xây dựng trực tiếp vào giao diện người dùng của ứng dụng bằng cách sử dụng các API dành riêng cho nền tảng. Người dùng được hưởng lợi từ các hộp thoại gốc của nền tảng, xác minh sinh trắc học mượt mà và thời gian đăng nhập nhanh nhất có thể.
Khi nào nên chọn Triển khai gốc:
preferImmediatelyAvailableCredentials để
hiển thị lớp phủ passkey tự động
khi có sẵn passkey, mang lại trải nghiệm đăng nhập nhanh nhất mà không yêu cầu nhập định
danhƯu điểm chính: preferImmediatelyAvailableCredentials()
Các triển khai gốc có thể tận dụng preferImmediatelyAvailableCredentials() để tạo
lớp phủ passkey tự động
xuất hiện ngay lập tức khi khởi động ứng dụng khi có sẵn passkey. Luồng không cần tên
người dùng này mang lại trải nghiệm đăng nhập nhanh nhất có thể-người dùng nhìn thấy
passkey của họ ngay lập tức mà không cần nhập định danh trước. Khả năng này là độc quyền
đối với các triển khai gốc và không có sẵn trong các biến thể WebView.
Biểu đồ dưới đây minh họa cách xác thực gốc mang lại hành trình người dùng nhanh hơn so với cách tiếp cận Conditional UI của WebView:
Lớp phủ tự động của bản gốc cung cấp UX vượt trội với tỷ lệ sử dụng passkey cao hơn vì xác thực bắt đầu ngay lập tức khi khởi chạy ứng dụng, trong khi các triển khai WebView yêu cầu người dùng tương tác với các trường nhập liệu trước.
Tổng quan về Yêu cầu kỹ thuật:
Tích hợp passkey gốc yêu cầu sự tin cậy mật mã giữa ứng dụng và miền web của bạn. Nếu không có điều đó, hệ điều hành sẽ từ chối tất cả các hoạt động WebAuthn. Yêu cầu chính:
/.well-known/Lợi ích chính: passkey được tạo trên trang web của bạn hoạt động liền mạch trong ứng dụng của bạn và ngược lại.
Triển khai passkey một cách gốc rễ trên iOS liên quan đến framework AuthenticationServices của Apple, cung cấp API cho các hoạt động WebAuthn:
Các thành phần chính:
ASAuthorizationController: Quản lý luồng xác thựcASAuthorizationPlatformPublicKeyCredentialProvider: Tạo các yêu cầu passkeyMẹo phát triển
?mode=developer vào URL AASA
của bạn để buộc tải tệp mới nhấtTriển khai passkey gốc của Android sử dụng API Credential Manager (hoặc API FIDO2 cũ hơn để tương thích ngược):
Các thành phần chính:
CredentialManager: API trung tâm cho tất cả các hoạt động thông tin xác thựcCreatePublicKeyCredentialRequest: Dành cho đăng ký passkeyGetCredentialRequest: Dành cho
xác thực passkeyLưu ý: Android hiện thiếu các gợi ý bàn phím Conditional UI của iOS trong các ứng dụng gốc (mặc dù Conditional UI hoạt động trong các ứng dụng web)
Triển khai passkey một cách gốc rễ có những thách thức quan trọng và bài học rút ra: Việc tích hợp ở cấp hệ điều hành có thể làm lộ ra các vấn đề trên các thiết bị và phiên bản hệ điều hành khác nhau.
Mặc dù bạn có thể triển khai passkey bằng cách sử dụng các API nền tảng gốc, các SDK được xây dựng có mục đích sẽ tăng tốc đáng kể sự phát triển bằng cách xử lý tính phức tạp của WebAuthn, các trường hợp ngoại lệ và cung cấp hệ thống từ xa (telemetry) tích hợp. SDK cũng cung cấp các giao diện có thể giả lập để thử nghiệm đơn vị (unit testing) (rất quan trọng vì bạn không thể kiểm tra sinh trắc học trong các trình mô phỏng).
Khuyến nghị: Đối với các triển khai gốc, chúng tôi khuyên bạn nên sử dụng SDK Corbado (SDK Passkey Swift cho iOS, SDK Passkey Kotlin cho Android) để xử lý nhiều trường hợp ngoại lệ được phát hiện thông qua các triển khai sản xuất, cung cấp thêm hệ thống từ xa và thử nghiệm.
Igor Gjorgjioski
Head of Digital Channels & Platform Enablement, VicRoads
We hit 80% mobile passkey activation across 5M+ users without replacing our IDP.
See how VicRoads scaled passkeys to 5M+ users — alongside their existing IDP.
Read the case studySystem WebViews sử dụng thành phần trình duyệt gốc của nền tảng để xử lý xác thực trong ứng dụng của bạn. Không giống như các triển khai hoàn toàn gốc, System WebViews hiển thị nội dung web bằng cách sử dụng trình duyệt hệ thống thực tế (Safari trên iOS, Chrome trên Android), duy trì cookie dùng chung, thông tin xác thực đã lưu và các chỉ báo bảo mật trình duyệt quen thuộc.
Khi nào nên chọn System WebView:
Ưu điểm chính:
Các thành phần nền tảng:
ASWebAuthenticationSession (được khuyến nghị cho các luồng xác thực) hoặc
SFSafariViewController (duyệt web chung)Các công ty lớn như Google và GitHub đã áp dụng cách tiếp cận này để thêm đăng nhập bằng passkey vào các ứng dụng di động của họ thông qua các lớp phủ WebView trên các trang xác thực web hiện có. Điều này hoạt động tốt khi việc xây dựng lại xác thực hoàn toàn gốc không khả thi ngay lập tức.
iOS cung cấp hai thành phần System WebView chính cho xác thực:
ASWebAuthenticationSession (Được khuyến nghị cho Xác thực):
SFSafariViewController (Duyệt web chung):
| Tính năng | ASWebAuthenticationSession | SFSafariViewController |
|---|---|---|
| Trường hợp sử dụng chính | Các luồng xác thực | Duyệt web chung |
| OAuth/OIDC | Rất tốt | Tốt |
| Hỗ trợ Passkey | Có | Có |
| Tùy chỉnh | Hạn chế | Tối thiểu |
Nếu ứng dụng của bạn sử dụng đăng nhập dựa trên OAuth, ASWebAuthenticationSession là
lựa chọn được khuyến nghị vì nó được thiết kế riêng cho các tình huống xác thực và cung
cấp sự cân bằng tốt nhất giữa bảo mật và trải
nghiệm người dùng.
Chrome Custom Tabs (CCT) cung cấp trải nghiệm xác thực được hỗ trợ bởi Chrome trong ứng dụng của bạn:
Các tính năng chính:
Tích hợp OAuth: Chrome Custom Tabs tương đương với iOS ASWebAuthenticationSession của Android, cung cấp hỗ trợ OAuth rất tốt đồng thời duy trì quyền truy cập vào các passkey đã lưu.
Thử passkeys trong demo trực tiếp.
Embedded WebViews cung cấp khả năng kiểm soát hoàn toàn việc hiển thị nội dung web trong ứng dụng của bạn, cho phép thao tác trực tiếp với cookie, phiên và điều hướng mà không có thanh URL. Tuy nhiên, sự kiểm soát này đi kèm với các yêu cầu kỹ thuật bổ sung để kích hoạt chức năng passkey.
Khi nào nên chọn Embedded WebView:
Bối cảnh quan trọng:
Nhiều ứng dụng sử dụng cách tiếp cận lai: System WebView xử lý xác thực OAuth ban đầu (nơi passkey hoạt động liền mạch), sau đó chuyển sang Embedded WebView cho sau xác thực để quản lý passkey trong phần cài đặt. Thách thức nảy sinh khi cố gắng sử dụng passkey trực tiếp trong Embedded WebViews.
Yêu cầu kỹ thuật:
Embedded WebViews yêu cầu thiết lập bổ sung so với System WebViews:
Các thành phần nền tảng:
WKWebViewandroid.webkit.WebViewSự đánh đổi:
Khi triển khai passkey thông qua WebViews, việc hiểu rõ sự khác biệt giữa System WebViews và Embedded WebViews là rất quan trọng. Ba cách tiếp cận được phác thảo ở trên (Triển khai gốc, System WebView và Embedded WebView) mỗi cách phục vụ các trường hợp sử dụng khác nhau.
Trên iOS, bạn có nhiều tùy chọn để hiển thị nội dung web trong ứng dụng:
Trên Android, các lựa chọn chính là:
android.webkit.WebView), về cơ bản
là một trình duyệt mini có thể được nhúng vào các hoạt động (activities) của bạn. Nó có
khả năng tùy chỉnh cao nhưng chạy trong tiến trình (process) của ứng dụng của bạn.Trong các phần tiếp theo, chúng ta sẽ đi sâu hơn một chút vào các loại WebView này đối với iOS và Android, đồng thời thảo luận xem loại nào có thể phù hợp nhất cho các luồng xác thực passkey.
Đăng ký Passkeys Substack để nhận tin mới nhất.
Nền tảng của Apple cung cấp ba tùy chọn WebView được liệt kê ở trên. Sự lựa chọn của bạn sẽ ảnh hưởng đến mức độ trơn tru của việc sử dụng passkey bên trong ứng dụng:
Để kiểm tra các hành vi WebView khác nhau trong iOS, chúng tôi khuyên bạn nên dùng ứng dụng WebView - WKWebView and UIWebView rendering.
WKWebView là một thành phần WebView linh hoạt cho iOS. Các nhà phát triển có thể nhúng WKWebView để hiển thị nội dung web với mức độ kiểm soát cao đối với giao diện người dùng và hành vi. WKWebView sử dụng cùng một công cụ kết xuất như Safari, vì vậy nó rất hiệu quả và hỗ trợ các tính năng web hiện đại. Về lý thuyết, WKWebView có thể xử lý WebAuthn (và do đó là passkey) nếu được cấu hình đúng cách, nhưng lưu ý rằng một số tính năng trình duyệt nâng cao có thể bị hạn chế vì lý do bảo mật. Một điều cần chú ý là WKWebView mặc định không chia sẻ cookie hoặc dữ liệu keychain với Mobile Safari. Người dùng có thể phải đăng nhập lại vì phiên WebView của họ bị cô lập với phiên của Safari. Ngoài ra, bởi vì nội dung WKWebView có thể được tùy chỉnh hoàn toàn bởi ứng dụng, người dùng không nhìn thấy thanh địa chỉ hoặc giao diện người dùng Safari – điều này rất tốt cho việc xây dựng thương hiệu, nhưng có nghĩa là người dùng có ít gợi ý hơn để xác minh tính hợp pháp của trang (một mối quan tâm đối với chống lừa đảo). Một số ứng dụng thậm chí đã lạm dụng WKWebView để tiêm mã (inject scripts) hoặc thay đổi nội dung (ví dụ: TikTok được ghi nhận là đã tiêm JS theo dõi qua trình duyệt trong ứng dụng của họ), do đó người ta phải cẩn thận sử dụng WKWebView một cách an toàn, đáng tin cậy cho người dùng.
SFSafariViewController cung cấp trải nghiệm Safari trong ứng dụng. Khi bạn mở URL bằng SFSafariViewController, gần giống như mở nó trong trình duyệt Safari thực, ngoại trừ người dùng vẫn ở trong giao diện người dùng của ứng dụng của bạn. Lợi thế đối với passkey là đáng kể: bởi vì nó về cơ bản là Safari, iCloud Keychain và passkey đã lưu của người dùng có thể truy cập được. Lưu ý rằng cookie không được chia sẻ trên iOS 11+. Điều này có nghĩa là nếu người dùng đã có passkey cho trang web của bạn, Safari có thể tìm thấy nó và thậm chí hiển thị tính năng tự động điền Conditional UI để đăng nhập dễ dàng. SFSafariViewController ít có thể tùy chỉnh hơn (bạn không thể thay đổi thanh công cụ của nó nhiều), nhưng nó tự động xử lý rất nhiều tính năng bảo mật và quyền riêng tư. Thanh URL được hiển thị, hoàn chỉnh với biểu tượng ổ khóa cho HTTPS, mang lại sự tự tin cho người dùng rằng họ đang truy cập đúng miền. Nói chung, SFSafariViewController được coi là an toàn hơn WKWebView thô và đơn giản hơn để triển khai (Apple cung cấp nó như một thành phần có thể thêm ngay). Sự đánh đổi chính là bạn hy sinh một số quyền kiểm soát đối với giao diện. Đối với luồng xác thực, điều đó thường được chấp nhận. Ưu tiên ở đây là tính bảo mật và dễ đăng nhập, điều mà SFSafariViewController xuất sắc thực hiện bằng cách sử dụng ngữ cảnh của Safari.
| WKWebView | SFSafariViewController | |
|---|---|---|
| Trải nghiệm người dùng | - Cảm giác gốc: Người dùng có thể cảm thấy rằng nội dung web là một phần gốc của ứng dụng vì các nhà phát triển có thể tùy chỉnh giao diện để phù hợp với thiết kế của ứng dụng. - Tự động điền: Có thể tự động điền với dữ liệu từ Safari | - Mượt mà: Trải nghiệm người dùng mượt mà khi sử dụng cài đặt Safari của người dùng, đảm bảo duyệt web nhất quán giữa ứng dụng gốc và trình duyệt. |
| Trải nghiệm nhà phát triển | - Có thể tùy chỉnh cao: Có sẵn khả năng tùy chỉnh và cấu hình sâu rộng - Linh hoạt: Nhiều API để tương tác với nội dung web | - Có thể tùy chỉnh trung bình: Các tùy chọn tùy chỉnh hạn chế, đặc biệt so với WKWebView, - Đơn giản: Đơn giản hơn để triển khai so với WKWebView |
| Hiệu suất | - Khá chậm: Tùy thuộc vào việc triển khai và nội dung web, tốc độ tải có thể được tối ưu hóa, nhưng vẫn có thể chậm hơn so với SFSafariViewController do quá trình xử lý bổ sung các tính năng và tương tác tùy chỉnh. | - Khá nhanh: Thường mang lại hiệu suất tốt hơn vì nó tận dụng công cụ Safari, được tối ưu hóa về tốc độ và hiệu quả, mang lại thời gian tải trang web nhanh chóng. |
| Niềm tin và sự công nhận | - Không yêu cầu hiển thị URL: WKWebView thường không hiển thị URL, khiến người dùng khó xác minh trang web hơn. Có khả năng các ứng dụng độc hại có thể bắt chước hành vi này và đánh cắp thông tin xác thực. | - Trải nghiệm giống trình duyệt: Hiển thị các trang web bằng Safari, mang lại trải nghiệm "giống trình duyệt". Người dùng có thể nhìn thấy URL và truy cập các tính năng tự động điền của Safari, điều này có khả năng mang lại sự tin tưởng hơn do giao diện quen thuộc. |
| Cô lập | - Tách biệt: Cookie và phiên được tách biệt khỏi Safari; người dùng sẽ không tự động đăng nhập vào WKWebView. | - Tách biệt: Cookie và phiên được tách biệt khỏi Safari; người dùng cũng sẽ không tự động đăng nhập vào SFSafariViewController. |
| Lỗ hổng bảo mật | - An toàn: An toàn do tính năng sanbox ứng dụng của Apple, nhưng hành vi và bảo mật phụ thuộc vào cách triển khai của ứng dụng. Có các lỗ hổng tiềm ẩn nếu không được triển khai chính xác. | - An toàn hơn: Hưởng lợi từ các tính năng bảo mật tích hợp của Safari, bao gồm cảnh báo chống lừa đảo và trang web độc hại. Thường được coi là an toàn hơn để hiển thị nội dung web so với WKWebView nhờ các tính năng này và sự quen thuộc của người dùng với Safari. |
| Khác | - Các tính năng không có sẵn: Một số tính năng của trình duyệt (ví dụ: WebAuthn) có thể không thể truy cập hoàn toàn do các mối lo ngại về bảo mật và WKWebView chạy trong ngữ cảnh ứng dụng. - Tiêm JavaScript (JavaScript injection): Một số ứng dụng, ví dụ như TikTok, tiêm mã JavaScript theo dõi vào WKWebView trong ứng dụng của họ hoặc hạn chế bộ điều khiển của người dùng (ví dụ: Facebook) - Vấn đề quyền riêng tư: Nhiều phản hồi từ cộng đồng hơn liên quan đến quyền riêng tư | - Không tiêm JavaScript: Không cho phép thực thi JavaScript từ ứng dụng, tăng cường bảo mật và quyền riêng tư. Nó cũng không hỗ trợ cảnh báo hoặc xác nhận JavaScript, điều này có khả năng ảnh hưởng đến trải nghiệm người dùng trên một số trang web. - Chế độ người đọc (Reader Mode): Cung cấp chế độ người đọc để có phiên bản bài viết sạch sẽ, dễ đọc. |
SFAuthenticationSession / ASWebAuthenticationSession – Các lớp này (lớp sau là tên thân thiện với Swift mới hơn) được xây dựng dành riêng cho các luồng đăng nhập như OAuth hoặc OpenID Connect. Khi bạn cần xác thực người dùng thông qua một trang web (có lẽ là với một nhà cung cấp định danh - IdP - bên ngoài), các phiên này là lựa chọn được khuyến nghị trên iOS. Chúng rất giống với SFSafariViewController ở chỗ chúng sử dụng trình duyệt Safari ở bên dưới và chia sẻ cookie/lưu trữ với Safari. Sự khác biệt chính là SFAuthenticationSession sẽ luôn nhắc người dùng rằng ứng dụng muốn xác thực bằng một trang web (để người dùng nhận biết) và nó sẽ tự động sử dụng phiên Safari hiện tại của người dùng nếu có sẵn.
Lợi ích là trải nghiệm SSO liền mạch – nếu người dùng đã đăng nhập vào nhà cung cấp trong Safari, phiên này có thể sử dụng cookie đó để tránh phải đăng nhập lại. Đối với passkey, điều này rất quan trọng vì nó có nghĩa là bất kỳ passkey nào được lưu trữ trong Safari/iCloud Keychain cũng có thể được sử dụng ở đây. Hướng dẫn chính thức của Apple là sử dụng ASWebAuthenticationSession cho bất kỳ luồng nào giống như đăng nhập. Ưu điểm là quyền riêng tư được nâng cao (ứng dụng của bạn không bao giờ nhìn thấy thông tin xác thực hoặc cookie, Safari xử lý điều đó) và hỗ trợ SSO tích hợp. Nhược điểm là nó bị giới hạn ở các luồng xác thực (bạn sẽ không sử dụng nó để chỉ hiển thị nội dung web tùy ý trong ứng dụng của mình). Tóm lại, nếu bạn chọn cách tiếp cận WebView trên iOS, ASWebAuthenticationSession thường là lựa chọn tốt nhất để triển khai passkey vì nó an toàn, chia sẻ trạng thái với Safari và được xây dựng có mục đích cho xác thực.
Xem có bao nhiêu người thực sự dùng passkeys.
Trên Android, quyết định về WebView là giữa WebView cổ điển và Chrome Custom Tabs:
Để kiểm tra hành vi WebView khác nhau trên Android, chúng tôi khuyên bạn nên sử dụng ứng dụng WebView vs Chrome Custom Tabs.
Android WebView (android.webkit.WebView) là một thành phần cho phép bạn nhúng các trang web vào bố cục hoạt động (activity layout) của mình. Nó tương tự như WKWebView ở chỗ nó cung cấp cho bạn toàn quyền kiểm soát: bạn có thể chặn điều hướng, tiêm JavaScript, tùy chỉnh UI, v.v. Nó cũng chạy trong tiến trình của ứng dụng của bạn. Sử dụng WebView cho passkey có nghĩa là ứng dụng của bạn tải trang đăng nhập web của bạn, và trang đó có thể khởi tạo WebAuthn. Android WebView hiện đại hỗ trợ WebAuthn (với điều kiện việc triển khai WebView của thiết bị được cập nhật thông qua Android System WebView hoặc thành phần Chrome). Một cân nhắc lớn: theo mặc định, một Android WebView không chia sẻ cookie hoặc thông tin xác thực đã lưu với trình duyệt Chrome của người dùng. Vì vậy, bất kỳ passkey nào được tạo hoặc sử dụng trong WebView đều có thể không được Chrome biết đến và ngược lại. Sự cô lập này có thể tốt cho bảo mật (ứng dụng của bạn không thể đọc cookie trình duyệt), nhưng nó có thể buộc người dùng phải đăng nhập lại nếu họ đã xác thực trong Chrome. Một vấn đề khác là niềm tin. Một WebView đơn thuần không hiển thị URL hoặc biểu tượng ổ khóa SSL, vì vậy người dùng phải hoàn toàn tin tưởng ứng dụng của bạn để không lừa đảo họ. Google thậm chí đã cấm sử dụng WebView cho đăng nhập Google OAuth do các rủi ro lừa đảo tiềm ẩn. Về hiệu suất, WebView thì ổn, nhưng chúng có thể chậm hơn hoặc tiêu tốn nhiều bộ nhớ hơn so với việc sử dụng trình duyệt mặc định của người dùng, đặc biệt là khi tải các trang nặng.
Chrome Custom Tabs (CCT) là một cách tiếp cận lai. Chúng cho phép ứng dụng của bạn mở một trang được Chrome hiển thị trông giống như một phần của ứng dụng của bạn. Bạn có thể tùy chỉnh màu thanh công cụ, thêm logo ứng dụng, v.v., nhưng nội dung được hiển thị bởi Chrome trong một tiến trình riêng biệt. Đối với passkey, CCT có một số lợi ích: chúng chia sẻ cookie và thông tin xác thực của người dùng với trình duyệt Chrome, có nghĩa là nếu người dùng đã lưu một passkey thông qua Chrome (Google Password Manager), Custom Tab có thể truy cập nó. Người dùng cũng sẽ nhìn thấy URL thực tế và các chỉ báo bảo mật, điều này xây dựng niềm tin. Hiệu suất thường tốt hơn – Chrome có thể được "làm nóng" trong nền để tải nhanh hơn. Và quan trọng nhất, bảo mật rất mạnh: bởi vì nó về cơ bản là ứng dụng Chrome, các tính năng như Google Safe Browsing bảo vệ phiên, và ứng dụng của bạn không thể tiêm các mã lệnh (scripts) tùy ý vào trang (ngăn chặn một số cuộc tấn công nhất định).
Nhược điểm là nó yêu cầu người dùng phải cài đặt Chrome (hoặc trình duyệt được hỗ trợ) và cập nhật. Hầu hết người dùng Android đều có, nhưng trên một số thiết bị ở các khu vực nhất định, điều này có thể là một vấn đề. Nhìn chung, nếu bạn đi với cách tiếp cận web nhúng trên Android, Chrome Custom Tabs được khuyến nghị cho các luồng passkey, vì chúng cung cấp sự cân bằng tốt về tích hợp và bảo mật. Trên thực tế, chúng tương tự như SFSafariViewController/ASWebAuthSession của iOS ở nhiều khía cạnh – tận dụng trình duyệt mặc định cho xác thực.
(Nói thêm: WKWebView vs SFSafariViewController của Apple và WebView vs CCT của Android có nhiều điểm tương đồng. Cả Safari VC và Chrome Tabs đều chia sẻ trạng thái trình duyệt và cung cấp bảo mật tốt hơn, trong khi WKWebView/Android WebView cung cấp nhiều quyền kiểm soát hơn nhưng cô lập nội dung web. Đối với passkey, việc chia sẻ trạng thái (cookie, kho thông tin xác thực) thường được mong muốn để passkey có thể được truy cập và tạo ra một cách liền mạch.)
| Tính năng | WebView | Chrome Custom Tab |
|---|---|---|
| Trải nghiệm người dùng | - Tính linh hoạt: Cung cấp một tập hợp phong phú các API để tương tác với nội dung web và quản lý tương tác của người dùng, bao gồm xử lý hộp thoại JavaScript và yêu cầu quyền. - Tính nhất quán: Việc quản lý UX nhất quán, đặc biệt là với nội dung web đa dạng, có thể là một thách thức. | - Tính năng trình duyệt: Chia sẻ các tính năng như Data Saver và AutoComplete được đồng bộ hóa trên các thiết bị. - Nút Quay lại: Cho phép người dùng dễ dàng quay lại ứng dụng bằng nút quay lại được tích hợp. - Sự phụ thuộc: Dựa vào ứng dụng Chrome, có thể không khả dụng hoặc không được cập nhật trên tất cả các thiết bị của người dùng - Chuyển hướng đến Trình duyệt: Các chức năng nhất định có thể chuyển hướng người dùng đến ứng dụng Chrome, điều này có khả năng làm gián đoạn trải nghiệm người dùng. - Các tab tùy chỉnh một phần: Chỉ một phần của màn hình có thể được sử dụng cho Chrome Custom Tab trong khi phần còn lại hiển thị ứng dụng gốc - Trang tính bên: Trong chế độ ngang và trên các thiết bị màn hình lớn, Chrome Custom Tab chỉ được hiển thị ở một bên màn hình, trong khi phần còn lại hiển thị ứng dụng gốc |
| Trải nghiệm nhà phát triển | - Có thể tùy chỉnh cao: Cung cấp các tùy chọn/nhu cầu tùy chỉnh sâu rộng. - Khả năng tương tác: Cung cấp nhiều API để tương tác với nội dung web và quản lý tương tác của người dùng. | - Có thể tùy chỉnh: Cho phép tùy chỉnh màu thanh công cụ, nút hành động, thanh công cụ dưới cùng, các mục menu tùy chỉnh, và hình ảnh động ra/vào. - Callback (Gọi lại): Cung cấp một callback cho ứng dụng sau một điều hướng bên ngoài. - Các tính năng bảo mật: Cung cấp các tính năng có sẵn (out-of-the-box), loại bỏ nhu cầu quản lý các yêu cầu, cấp quyền hoặc kho lưu trữ cookie. |
| Hiệu suất | - Hiệu suất trung bình: Có thể không cung cấp cùng mức hiệu suất như Chrome Custom Tabs (CCT) | - Làm nóng (Pre-Warming): Bao gồm việc làm nóng Trình duyệt trong nền và tải đầu cơ (speculative loading) các URL để nâng cao thời gian tải trang. - Ưu tiên: Ngăn các ứng dụng khởi chạy Custom Tab bị loại bỏ trong quá trình sử dụng bằng cách nâng tầm quan trọng của nó lên cấp "tiền cảnh" (foreground). |
| Niềm tin và sự công nhận | - URL & SSL không hiển thị: URL và thông tin SSL vốn dĩ không hiển thị trong WebView. Trừ khi nhà phát triển ứng dụng triển khai các tính năng này, người dùng sẽ không biết liệu họ đang ở đúng trang web hay một trang lừa đảo. | - URL & SSL hiển thị: Sử dụng trình duyệt Chrome thực tế để hiển thị các trang. Người dùng có thể nhìn thấy URL và chứng chỉ SSL (cho biết kết nối có an toàn hay không). Điều này có thể mang lại cho người dùng sự tin tưởng rằng họ không ở trên một trang web lừa đảo. |
| Cô lập | - Chạy trong tiến trình của ứng dụng: Nếu một ứng dụng có lỗ hổng cho phép thực thi mã độc, có nguy cơ WebView có thể bị xâm phạm. Tuy nhiên, WebView cũng nhận được các bản cập nhật, nhưng hành vi và bảo mật của nó có thể phụ thuộc nhiều hơn vào ứng dụng đang sử dụng nó. - Không chia sẻ Cookie/Phiên: Không chia sẻ cookie hoặc phiên với trình duyệt chính của thiết bị, cung cấp sự cô lập nhưng có thể yêu cầu người dùng đăng nhập lại. | - Chạy trong tiến trình của Chrome: Là một phần của Chrome, Custom Tabs chạy trong cùng một tiến trình và có các bản cập nhật bảo mật và tính năng tương tự như Chrome. - Hũ Cookie Dùng chung và Mô hình Quyền: Đảm bảo người dùng không phải đăng nhập lại vào các trang web hoặc cấp lại quyền. - Cài đặt & Tùy chọn của Chrome: Sử dụng các cài đặt và tùy chọn của Chrome. |
| Lỗ hổng bảo mật | - Callbacks để đánh cắp thông tin xác thực: Các lỗ hổng tiềm ẩn bao gồm đôi khi JavaScript được yêu cầu, điều này mở ra cánh cửa cho các ứng dụng khác chạy mã độc hại, chẳng hạn như đăng ký callbacks nhằm đánh cắp tên người dùng và mật khẩu. - Lừa đảo: Ngoài ra, một ứng dụng độc hại có thể mở một trang web khác bắt chước luồng Liên kết trong một nỗ lực lừa đảo. | - Google Safe Browsing: Sử dụng Google Safe Browsing để bảo vệ cả người dùng và thiết bị khỏi các trang web nguy hiểm. - Trang trí trình duyệt an toàn: Đảm bảo người dùng luôn nhìn thấy URL chính xác mà họ đang tương tác và có thể xem thông tin chứng chỉ của trang web, giảm nguy cơ lừa đảo. Hơn nữa, các custom tabs không cho phép tiêm JavaScript. |
| Khác | - Google đã cấm WebViews cho người dùng đăng nhập vào tài khoản Google |
Bất kể bạn chọn cách tiếp cận triển khai nào, các yêu cầu kỹ thuật nhất định phải được đáp ứng để bật chức năng passkey. Phần này cung cấp hướng dẫn toàn diện về cấu hình các tệp liên kết well-known, entitlements iOS, và cấu hình WebView Android.
Lưu ý về các Thiết bị được quản lý (Managed Devices): Hành vi của Passkey thay đổi đáng kể trên các thiết bị được quản lý khi các chính sách Quản lý Thiết bị Di động (MDM) kiểm soát việc lưu trữ thông tin xác thực. Để thử nghiệm passkey trên các thiết bị được quản lý, hãy xem Passkey trên Các thiết bị iOS & Android được quản lý.
Các luồng WebView Gốc và Nhúng yêu cầu các tệp liên kết để thiết lập sự tin cậy mật mã giữa ứng dụng và miền web của bạn. System WebView (ASWebAuthenticationSession) và Chrome Custom Tabs không yêu cầu liên kết ứng dụng tới trang web.
Tệp AASA thiết lập kết nối giữa ứng dụng iOS và miền web của bạn, cho phép passkey hoạt động trên cả hai nền tảng.
Vị trí tệp: https://yourdomain.com/.well-known/apple-app-site-association
Yêu cầu cấu hình:
/.well-known/apple-app-site-association trên miền của bạnapplication/json.well-knownVí dụ về Tệp AASA:
{ "webcredentials": { "apps": ["TEAMID123.com.example.app"] } }
Bộ nhớ đệm AASA và Thử nghiệm:
Apple lưu trữ các tệp AASA rất mạnh (lên đến 24-48 giờ) bằng CDN, điều này có thể gây khó chịu cho quá trình phát triển và thử nghiệm. Để bỏ qua bộ nhớ đệm trong quá trình phát triển:
?mode=developer vào miền liên kết của bạn trong Xcode⚠️ Quan trọng: KHÔNG sử dụng ?mode=developer trong các bản phát hành sản xuất. Tham
số này chỉ dành cho mục đích phát triển - việc sử dụng nó trong môi trường sản xuất sẽ
ngăn iOS phát hiện đúng cách tệp AASA của bạn, làm hỏng chức năng passkey.
Xác thực: Sử dụng AASA Validator của Apple để xác minh cấu hình của bạn.
Android sử dụng Digital Asset Links để xác minh mối quan hệ giữa ứng dụng và trang web của bạn.
Vị trí tệp: https://yourdomain.com/.well-known/assetlinks.json
Yêu cầu cấu hình:
/.well-known/assetlinks.json trên miền của bạnapplication/jsonVí dụ về Tệp assetlinks.json:
[ { "relation": [ "delegate_permission/common.handle_all_urls", "delegate_permission/common.get_login_creds" ], "target": { "namespace": "android_app", "package_name": "com.example.app", "sha256_cert_fingerprints": [ "AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99" ] } } ]
Xác thực: Sử dụng Trình tạo Digital Asset Links của Google để tạo và xác minh cấu hình của bạn.
Các ứng dụng iOS yêu cầu các entitlements thích hợp để truy cập chức năng passkey. Các yêu cầu có một chút khác biệt dựa trên cách tiếp cận triển khai của bạn.
Tệp entitlements (thường có tên là Runner.entitlements trong các ứng dụng
Flutter hoặc YourApp.entitlements trong các dự án iOS
gốc) xác định các quyền và khả năng đặc biệt được cấp bởi hệ thống của Apple. Đối với
passkey, tệp này cấu hình Associated Domains.
Vị trí tệp: Thông thường trong dự án Xcode của bạn tại
ios/Runner/Runner.entitlements
Triển khai gốc và Embedded WebView yêu cầu khả năng Associated Domains (Các miền liên kết) để liên kết ứng dụng với miền web của bạn. System WebView (ASWebAuthenticationSession) không yêu cầu điều này vì nó chạy trong bối cảnh Safari.
Thiết lập trong Xcode:
webcredentials:Ví dụ Cấu hình:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.developer.associated-domains</key> <array> <string>webcredentials:yourdomain.com</string> <string>webcredentials:subdomain.yourdomain.com</string> </array> </dict> </plist>
| Cách tiếp cận | Yêu cầu Associated Domains | Cấu hình bổ sung |
|---|---|---|
| Triển khai gốc | Có | Triển khai chuyên dụng |
| System WebView | Không yêu cầu | Thiết lập web mặc định hoạt động |
| Embedded WebView | Có | Yêu cầu cấu hình AndroidX WebKit 1.12.1+ |
Nhiều miền: Nếu ứng dụng của bạn cần làm việc với nhiều miền, bạn có thể cần Related Origin Requests (ROR).
Android Embedded WebViews hỗ trợ passkey thông qua hai cách tiếp cận riêng biệt: cách tiếp cận dựa trên WebKit mới hơn (Phần 5.3.1) và cách tiếp cận cầu nối JavaScript (JavaScript bridge) cũ hơn (Phần 5.3.2). System WebView (Chrome Custom Tabs) không yêu cầu bất kỳ cấu hình nào-thông tin xác thực hoạt động tự động.
Android cung cấp các mẫu passkey WebView chính thức (official WebView passkey samples) trình diễn cả hai cách tiếp cận triển khai.
Tích hợp WebKit hiện đại với khả năng xử lý passkey gốc. Cách tiếp cận này cung cấp hỗ trợ WebAuthn gốc mà không yêu cầu mã cầu nối tùy chỉnh (custom bridge code).
Mẫu chính thức: Webkit WebView MainActivity
Yêu cầu:
Triển khai:
import androidx.webkit.WebSettingsCompat import androidx.webkit.WebViewFeature // Kiểm tra xem Web Authentication có được hỗ trợ hay không if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) { // Bật Web Authentication WebSettingsCompat.setWebAuthenticationSupport( webView.settings, WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP ) // Bật JavaScript webView.settings.javaScriptEnabled = true }
Điểm chính:
WebViewFeature.WEB_AUTHENTICATION lúc
chạy (runtime)mediation:"conditional" (tự động điền passkey trong
các trường nhập liệu) không hoạt động trong Embedded WebViewLưu ý về phiên bản:
Trước AndroidX WebKit 1.12.0, hỗ trợ WebAuthn gốc không tồn tại trong Embedded WebView. Cách tiếp cận cũ hơn này sử dụng cầu nối Web-to-Native (Web-đến-Gốc) để xử lý passkey cho các thiết bị không có hỗ trợ WebAuthn của WebView gốc.
Mẫu chính thức:
Khi nào nên sử dụng: Hỗ trợ các phiên bản Android cũ hơn hoặc các thiết bị có các bản triển khai WebView cũ.
Các nhóm phải:
Để biết chi tiết về cách triển khai, hãy xem Hướng dẫn tích hợp Credential Manager WebView của Android. Tuy nhiên, chúng tôi đặc biệt khuyên bạn nên sử dụng cách tiếp cận WebKit 1.12.1+ gốc cho các ứng dụng hiện đại.
Khuyến nghị: Sử dụng hỗ trợ WebAuthn gốc với AndroidX WebKit 1.12.1+. Nếu không khả dụng lúc chạy, hãy dự phòng về Chrome Custom Tabs, cung cấp hỗ trợ passkey rất tốt với thông tin xác thực dùng chung.
Khi triển khai passkey trong các ứng dụng gốc, bạn cần thiết lập sự tin cậy giữa ứng dụng và miền web của mình. Phần này đề cập đến cách xử lý các miền đơn lẻ, nhiều miền liên quan (ROR) và cách xác minh các tệp liên kết well-known của bạn được cấu hình chính xác.
Đối với các ứng dụng sử dụng miền đơn lẻ (ví dụ: kayak.com), bạn cần:
webcredentials:kayak.comRelated Origins (ROR) là một tính
năng của WebAuthn cho phép một bộ passkey duy nhất hoạt động trên nhiều miền liên quan (ví
dụ: kayak.com, kayak.de, kayak.co.uk).
ROR sử dụng endpoint
/.well-known/webauthn trên mỗi trang web để định nghĩa các nguồn (origins) liên quan,
KHÔNG phải các tệp AASA hoặc assetlinks.
Điểm chính:
/.well-known/webauthn với danh sách các nguồn liên quanVí dụ Cấu hình:
Nếu ứng dụng của bạn hoạt động với kayak.com và kayak.de, cả hai miền phải:
Trước khi đi vào hoạt động thực tế, hãy xác minh rằng các tệp well-known của bạn đã được cấu hình đúng và có thể truy cập được. Apple và Google cung cấp các URL thử nghiệm dựa trên CDN để kiểm tra tính khả dụng của tệp:
| Miền | Xác minh Apple AASA | Xác minh Google Digital Asset Links |
|---|---|---|
| kayak.com | Kiểm tra tệp AASA Kiểm tra xem CDN của Apple có thể truy xuất tệp của bạn không | Kiểm tra assetlinks.json Xác minh Google có thể truy cập asset links của bạn |
| kayak.de | Kiểm tra tệp AASA Kiểm tra xem CDN của Apple có thể truy xuất tệp của bạn không | Kiểm tra assetlinks.json Xác minh Google có thể truy cập asset links của bạn |
Sử dụng Các URL Thử nghiệm này:
?nocache=1 của Apple buộc truy xuất mới, bỏ qua bộ nhớ đệm CDNkayak.com hoặc kayak.de bằng (các) miền của riêng bạn trong các mẫu URL ở
trênLưu ý khi Thử nghiệm: Đảm bảo tất cả các miền đều có các tệp well-known được cấu hình đúng. Một tệp bị thiếu hoặc cấu hình sai trên bất kỳ miền nào đều có thể làm hỏng chức năng passkey cho miền đó.
Thêm Thông tin: Relying Party ID của WebAuthn trong Các ứng dụng Gốc
Việc chọn cách tiếp cận triển khai phù hợp phụ thuộc vào kiến trúc xác thực, yêu cầu OAuth của ứng dụng và nhu cầu kiểm soát phiên. Sử dụng cây quyết định này để xác định hướng đi tốt nhất.
Lưu đồ sau đây hướng dẫn bạn chọn cách tiếp cận triển khai phù hợp dựa trên các yêu cầu của ứng dụng:
Tham khảo nhanh cho từng hướng đi:
Dưới đây là cách mỗi cách tiếp cận thực hiện trên các khía cạnh chính:
| Cách tiếp cận | Tạo Passkey | Sử dụng Passkey | Quản lý Passkey | Độ phức tạp Kỹ thuật | Hỗ trợ OAuth | Thời gian Thiết lập |
|---|---|---|---|---|---|---|
| Triển khai gốc | Mức độ áp dụng cao Sinh trắc học mượt mà, UX tốt nhất | Tức thì, không tiếng ồnpreferImmediatelyAvailableCredentials kích hoạt lớp phủ tự động khi khởi động ứng dụng | Kiểm soát gốc hoàn toàn Tích hợp với cài đặt ứng dụng | Trung bình-Cao API dành riêng cho nền tảng | Yêu cầu triển khai luồng OAuth riêng biệt | Vài tuần đến vài tháng |
| System WebView | Mức độ áp dụng tốt Trải nghiệm giống trình duyệt, quen thuộc | UX trình duyệt chuẩn Conditional UI trong các trường nhập liệu, keychain dùng chung | Dựa trên trình duyệt Người dùng quản lý qua trình duyệt | Thấp Mã gốc tối thiểu | Rất tốt Được xây dựng có mục đích cho OAuth | Vài ngày đến vài tuần |
| Embedded WebView | Mức độ áp dụng thấp hơn Yêu cầu cấu hình | Hỗ trợ WebAuthn gốc WebKit 1.12.1+, không có Conditional UI | Kiểm soát hạn chế Không tích hợp gốc | Trung bình-Cao Cấu hình WebView + quyền | Yêu cầu cấu hình | 1-2 tuần |
Giải thích các khía cạnh:
Khuyến nghị: System WebView
Nếu ứng dụng của bạn xác thực qua OAuth2, OIDC hoặc các nhà cung cấp đăng nhập mạng xã hội (Google, GitHub, Microsoft, v.v.), System WebView là lựa chọn tối ưu:
ASWebAuthenticationSession được xây dựng có mục đích cho các luồng OAuthVí dụ: Các ứng dụng du lịch như kayak.com và kayak.de sử dụng OAuth để xác thực. System WebView cho phép chúng duy trì cơ sở hạ tầng OAuth hiện có trong khi thêm hỗ trợ passkey thông qua các trang xác thực web của chúng.
Khuyến nghị: Cách tiếp cận Lai
Sử dụng System WebView cho xác thực OAuth ban đầu, sau đó là Embedded WebView cho các phiên sau xác thực:
Khi nào nên sử dụng: Các ứng dụng xác thực qua OAuth nhưng sau đó cần hiển thị nội dung web đã xác thực, nơi cần có thao tác phiên trực tiếp.
Khuyến nghị: Triển khai Gốc
Xây dựng từ đầu hoặc có các màn hình gốc? Hãy xây dựng hoàn toàn gốc:
preferImmediatelyAvailableCredentials để hiển thị
lớp phủ passkey tự động khi khởi động ứng dụng -
độc quyền cho các triển khai gốc và cung cấp tỷ lệ chuyển đổi cao nhấtĐối với Các ứng dụng Mới: Đặc biệt khuyến nghị xây dựng đăng nhập gốc ngay từ ngày đầu tiên. Thiết lập cho bạn UX tối ưu và tránh các đợt di chuyển từ WebView sang gốc trong tương lai.
Khuyến nghị: Di chuyển theo Giai đoạn
Biểu đồ sau đây cho thấy lộ trình di chuyển tăng dần:
Mỗi giai đoạn được xây dựng dựa trên giai đoạn trước, cho phép cải thiện dần dần mà không làm gián đoạn người dùng hiện có.
| Yêu cầu | Gốc | System WebView | Embedded WebView |
|---|---|---|---|
| Các tệp well-known (AASA/assetlinks) | Bắt buộc | Không bắt buộc | Bắt buộc |
| iOS Associated Domains | Bắt buộc | Không bắt buộc | Bắt buộc |
| Thư viện WebKit của Android | Không áp dụng | Không bắt buộc | Bắt buộc (1.12.1+) |
| Relying Party ID | Phải khớp với miền | Phải khớp với miền | Phải khớp với miền |
Xem Phần 5 để biết hướng dẫn cấu hình chi tiết.
Việc thử nghiệm passkey trong các ứng dụng gốc yêu cầu một cách tiếp cận có cấu trúc, nhiều lớp. Tuân theo kim tự tháp thử nghiệm: thử nghiệm đơn vị (logic cô lập), thử nghiệm tích hợp (WebAuthn ceremony trên trình mô phỏng/emulator) và thử nghiệm hệ thống (đầu cuối - end-to-end trên thiết bị vật lý).
Các Danh mục Thử nghiệm Thiết yếu:
Để biết hướng dẫn thử nghiệm toàn diện bao gồm các chiến lược tự động hóa, những điều cần chú ý cho từng nền tảng và danh sách kiểm tra đầy đủ trước khi chạy, hãy xem hướng dẫn dành riêng của chúng tôi: Thử nghiệm Luồng Passkey trong Các Ứng dụng Gốc iOS & Android.
Xem xét nhắc người dùng tạo passkey sau khi đăng nhập truyền thống thành công (mật khẩu, OAuth). Cách tiếp cận chuyển đổi dần dần này:
Ví dụ: Sau khi đăng nhập OAuth qua System WebView, hiển thị một lời nhắc gốc: "Bật đăng nhập nhanh hơn với Face ID?" Nếu được chấp nhận, hãy tạo passkey thông qua trang web được tải trong System WebView.
Quyết định cách triển khai passkey - qua Triển khai Gốc, System WebView hay Embedded WebView là một lựa chọn thiết kế quan trọng tác động đến bảo mật, trải nghiệm người dùng và độ phức tạp trong phát triển. Không có câu trả lời nào phù hợp cho tất cả (one-size-fits-all).
Đối với các ứng dụng dựa trên OAuth: System WebView (ASWebAuthenticationSession, Chrome Custom Tabs) là điểm khởi đầu được khuyến nghị. Nó cung cấp hỗ trợ OAuth tuyệt vời, nỗ lực triển khai tối thiểu và tự động chia sẻ thông tin xác thực.
Đối với các ứng dụng ưu tiên gốc: Hãy đi theo hướng gốc càng sớm càng tốt. Đăng nhập
passkey gốc cung cấp UX liền mạch nhất với các khả năng độc quyền như
preferImmediatelyAvailableCredentials, kích hoạt
lớp phủ passkey tự động khi khởi động ứng dụng -
điều mà các triển khai WebView không thể cung cấp. Với việc iOS và Android hiện cung cấp
hỗ trợ hạng nhất cho passkey, những thành công trong thế giới thực chứng tỏ mức độ áp dụng
cao. Các công cụ (bao gồm SDK mã nguồn mở và thư viện nền tảng) đã trưởng thành để làm cho
việc tích hợp gốc có thể đạt được trong khung thời gian hợp lý. Mặc dù bạn phải lưu ý đến
các chính sách quản lý thiết bị, đồng bộ hóa giữa các thiết bị và các nhà cung cấp
bên thứ ba, những thách thức này có thể được quản lý bằng
kỹ thuật và thử nghiệm cẩn thận. Kết quả là một ứng dụng đăng nhập làm hài lòng người dùng
với sự dễ dàng và tốc độ đồng thời cải thiện đáng kể khả năng bảo mật.
Đối với yêu cầu về khung WebView nhúng: Embedded WebView thường được sử dụng trong hai tình huống thực tế. Thứ nhất, các ứng dụng dựa trên OAuth thường sử dụng System WebView cho luồng đăng nhập ban đầu, sau đó chuyển sang Embedded WebView để hiển thị các tùy chọn quản lý passkey trong màn hình cài đặt, nơi cần có sự kiểm soát phiên - mặc dù một số ứng dụng đơn giản hóa điều này bằng cách giữ nguyên System WebView cho cả hai luồng. Thứ hai, các ứng dụng đã nhúng luồng xác thực của họ vào khung WebView trước khi áp dụng passkey tiếp tục mô hình này để đảm bảo tính nhất quán. Embedded WebView với hỗ trợ WebAuthn gốc (AndroidX WebKit 1.12.1+) yêu cầu cấu hình và thiết lập (quyền, entitlements, cài đặt WebView) nhưng không còn cần mã cầu nối JavaScript tùy chỉnh nữa. Lưu ý rằng Conditional UI không được hỗ trợ trong Embedded WebView. Chọn cách tiếp cận này khi duy trì các mẫu xác thực nhúng hiện có hoặc khi bạn cần kiểm soát phiên/cookie cho các màn hình sau xác thực.
Cuối cùng, passkey trong các ứng dụng gốc thể hiện một bước tiến lớn về cả sự tiện lợi cho người dùng và tính bảo mật. Cho dù được triển khai qua Triển khai Gốc, System WebView hay Embedded WebView, chúng đều loại bỏ rủi ro lừa đảo và gánh nặng quản lý mật khẩu đối với người dùng của bạn. Việc triển khai thực tế như tích hợp passkey trong ứng dụng gốc của VicRoads cho thấy rằng các cách tiếp cận ưu tiên gốc mang lại mức độ áp dụng và sự hài lòng cao nhất của người dùng khi được thực hiện đúng cách với các tính năng như lớp phủ passkey tự động. Bằng cách làm theo các phương pháp hay nhất cho xác thực thân thiện với người dùng và chọn cách tiếp cận triển khai phù hợp với kiến trúc của ứng dụng - ưu tiên gốc cho các ứng dụng mới, System WebView cho các luồng OAuth, hoặc Embedded WebView cho các mẫu nhúng hiện có - bạn có thể cung cấp tính năng đăng nhập không cần mật khẩu, sinh trắc học nhằm hiện thực hóa tầm nhìn về passkey: xác thực đơn giản, an toàn và thú vị cho mọi người.
Nếu passkey không hoạt động trong ứng dụng gốc của bạn, hãy kiểm tra các sự cố phổ biến này theo cách tiếp cận triển khai:
application/json.well-knownhttps://your-domain.com (không phải app://)webcredentials:yourdomain.comASWebAuthenticationSession (khuyên dùng) hoặc
SFSafariViewController?mode=developer trong quá trình phát triển (loại bỏ đối với
sản xuất)WebViewFeature.WEB_AUTHENTICATIONsetWebAuthenticationSupport() với
WEB_AUTHENTICATION_SUPPORT_FOR_APP"NotAllowedError: The request is not allowed by the user agent or the platform in the current context"
setWebAuthenticationSupport()Không có lời nhắc passkey xuất hiện
?mode=developer trên iOS để thử nghiệm, xác
minh loại WebViewĐể biết gỡ lỗi chi tiết, hãy xem bài viết của chúng tôi về Relying Party IDs trong các ứng dụng gốc.
Một cạm bẫy phổ biến: môi trường staging có quyền truy cập hạn chế (IP whitelisting, chỉ dùng VPN) sẽ thất bại vì các CDN của Apple và Google phải có thể lấy được các tệp liên kết của bạn.
https://app-site-association.cdn-apple.com/a/v1/your-staging-domain.com?nocache=1https://digitalassetlinks.googleapis.com/v1/statements:list/?source.web.site=https://your-staging-domain.com&relation=delegate_permission/common.handle_all_urlsStaging subdomain với rpID sản xuất:
Nếu môi trường staging của bạn (ví dụ: stg.login.example.com) sử dụng miền sản xuất làm
rpID (ví dụ: example.com), quá trình tra cứu AASA sẽ diễn ra trên miền rpID, chứ
không phải staging subdomain của bạn. Điều này có nghĩa là:
Ví dụ (nhiều môi trường chia sẻ một AASA):
{ "webcredentials": { "apps": [ "TEAMID123.com.example.app", "TEAMID123.com.example.app.dev", "TEAMID123.com.example.app.stg", "TEAMID123.com.example.app.pre" ] } }
Khuyến nghị: Sử dụng một rpID staging riêng khớp với miền staging của bạn để tránh chồng chéo thông tin xác thực giữa các môi trường. Điều này yêu cầu các tệp AASA có thể truy cập công khai trên miền staging.
Làm rõ về ?mode=developer:
Tham số ?mode=developer trong Associated Domains bỏ qua bộ nhớ đệm CDN của Apple nhưng
không bỏ qua yêu cầu về khả năng truy cập. Tệp AASA của bạn vẫn phải có thể truy cập
được từ thiết bị (không thông qua CDN của Apple mà trực tiếp). Điều này giúp trong quá
trình phát triển khi lặp lại các thay đổi AASA, nhưng sẽ không giúp ích nếu máy chủ
staging của bạn nằm trong danh sách IP whitelist.
SDK Gốc của Corbado:
Tài liệu Nền tảng:
Công cụ Xác thực:
Corbado là Passkey Intelligence Platform dành cho các đội CIAM vận hành xác thực consumer ở quy mô lớn. Chúng tôi giúp bạn nhìn thấy điều mà log IDP và các công cụ analytics thông thường không thấy: những thiết bị, phiên bản OS, trình duyệt và trình quản lý credential nào hỗ trợ passkey, tại sao quá trình đăng ký không chuyển thành đăng nhập, luồng WebAuthn fail ở đâu, và khi nào một bản cập nhật OS hay trình duyệt làm hỏng đăng nhập một cách âm thầm — tất cả mà không cần thay thế Okta, Auth0, Ping, Cognito hay IDP nội bộ của bạn. Hai sản phẩm: Corbado Observe bổ sung observability cho passkey và mọi phương thức đăng nhập khác. Corbado Connect mang đến managed passkey với analytics tích hợp (song hành cùng IDP của bạn). VicRoads vận hành passkey cho hơn 5M người dùng với Corbado (kích hoạt passkey +80%). Trao đổi với chuyên gia Passkey →
Sự lựa chọn phụ thuộc vào kiến trúc xác thực của bạn. Nếu ứng dụng của bạn sử dụng OAuth2 hoặc OIDC, System WebView (ASWebAuthenticationSession trên iOS hoặc Chrome Custom Tabs trên Android) yêu cầu nỗ lực triển khai thấp nhất và không cần thiết lập tệp liên kết. Đối với các ứng dụng ưu tiên gốc mới, Triển khai Gốc cung cấp UX vượt trội, trong khi Embedded WebView phù hợp với các ứng dụng đã nhúng xác thực trong khung WebView và cần kiểm soát phiên hoặc cookie sau khi đăng nhập.
SFSafariViewController tận dụng công cụ của Safari, hiển thị thanh URL với các chỉ báo SSL và cung cấp khả năng bảo vệ khỏi lừa đảo, làm cho nó đáng tin cậy hơn đối với các luồng xác thực. WKWebView cung cấp nhiều khả năng tùy chỉnh UI hơn nhưng có kho lưu trữ cookie bị cô lập tách biệt khỏi Safari, yêu cầu entitlements Associated Domains và tệp AASA để bật passkey, và không hiển thị thanh URL, làm giảm các tín hiệu tin cậy của người dùng.
Chrome Custom Tabs chia sẻ cookie và thông tin xác thực đã lưu với trình duyệt Chrome của người dùng, có nghĩa là các passkey được lưu trong Google Password Manager có thể được truy cập trong quá trình xác thực. Android WebView tiêu chuẩn có kho lưu trữ cookie bị cô lập, không hiển thị URL hoặc các chỉ báo SSL và Google đã cấm rõ ràng việc sử dụng nó đối với các lượt đăng nhập tài khoản Google do rủi ro lừa đảo.
Nếu người dùng có trình quản lý thông tin xác thực của bên thứ ba như 1Password được thiết lập làm nhà cung cấp đang hoạt động của họ, nó thường sẽ can thiệp vào việc tạo và lưu trữ passkey, ưu tiên hơn trình quản lý thông tin xác thực gốc của nền tảng (iCloud Keychain hoặc Google Password Manager). Điều này có nghĩa là passkey có thể được lưu trữ trong ứng dụng của bên thứ ba thay vì keychain của nền tảng, ảnh hưởng đến hành vi đồng bộ hóa giữa các thiết bị và quản lý passkey.
Khi các chính sách MDM vô hiệu hóa đồng bộ hóa thông tin xác thực, passkey trở nên bị giới hạn vào thiết bị và không thể chuyển vùng đến thiết bị thay thế, không giống như các tình huống tiêu dùng điển hình. Các ứng dụng nhắm mục tiêu đến môi trường doanh nghiệp nên lập kế hoạch cho các cơ chế xác thực dự phòng như đăng nhập bằng mật khẩu hoặc liên kết ma thuật để xử lý các trường hợp người dùng nhận được thiết bị được quản lý mới.
Xem Corbado phù hợp thế nào với quá trình triển khai passkeys và stack xác thực hiện tại của bạn.
Khám phá Console
Bài viết liên quan
Mục lục