Meet Corbado at Identiverse 2026 - Las Vegas, June 16Las Vegas
Quay lại tổng quan

WebAuthn Relying Party ID (rpID) & Passkeys: Tên miền & Ứng dụng gốc

Bài đăng trên blog này giải thích về WebAuthn Relying Party ID cho xác thực passkey. Nó phác thảo cấu hình chuẩn xác, khớp tên miền và cấu hình ứng dụng gốc.

Vincent Delitz
Vincent Delitz

Đã tạo: 21 tháng 9, 2023

Đã cập nhật: 16 tháng 6, 2026

WebAuthn Relying Party ID (rpID) & Passkeys: Tên miền & Ứng dụng gốc

Trang này được dịch tự động. Đọc phiên bản gốc bằng tiếng Anh tại đây.

Thông tin chính
  • Relying Party ID là một tên miền được nhúng trong mọi passkey. Quá trình xác thực sẽ thất bại nếu nguồn gốc (origin) của trình duyệt không khớp, giúp passkey có khả năng chống lừa đảo mạnh mẽ.
  • RP ID không được nằm trong Public Suffix List (Danh sách Hậu tố Công cộng) và việc thay đổi nó sẽ làm mất hiệu lực tất cả các passkey hiện có. Hãy sử dụng tên miền gốc theo mặc định để đảm bảo khả năng tương thích trong tương lai.
  • Ứng dụng iOS yêu cầu tệp apple-app-site-association tại đường dẫn /.well-known/ dưới RP ID. Android yêu cầu tệp assetlinks.json ở cùng đường dẫn. Các tệp mới có thể mất tới 24 giờ để lưu vào bộ nhớ cache.
  • Nhiều tên miền gốc cần Related Origin Requests (Yêu cầu Nguồn gốc Liên quan) thông qua .well-known/webauthn để chia sẻ passkey. Sử dụng một máy chủ WebAuthn duy nhất với một RP ID cho tất cả các ứng dụng, web và ứng dụng gốc.

1. Giới thiệu#

Xác thực bằng passkey đang nhanh chóng trở thành tiêu chuẩn khi các gã khổng lồ công nghệ như TikTok, GitHub, WhatsApp, X (Twitter), LinkedIn và Amazon đã hoặc đang triển khai chúng. Rõ ràng là thế giới công nghệ đang nhận ra tầm quan trọng của việc xác thực đơn giản và an toàn.

Bên cạnh trải nghiệm người dùng liền mạch khi xác thực bằng Face ID, Touch ID hoặc Windows Hello, passkey mang lại khả năng bảo mật vô song so với các phương pháp xác thực truyền thống như mật khẩu. Một trong những tính năng nổi bật là khả năng chống lừa đảo mạnh mẽ của chúng.

PasskeysCheatsheet Icon

Cheatsheet Passkeys. Hướng dẫn thực tế, mẫu triển khai và KPI cho chương trình passkeys.

Nhận cheat sheet
Demo Icon

Thử passkeys trong demo trực tiếp.

Thử passkeys

Tấn công lừa đảo (phishing attack) là một cuộc tấn công trong đó nạn nhân bị lừa cung cấp thông tin đăng nhập cho một trang web giả mạo bắt chước trang web gốc. Ví dụ: hãy tưởng tượng bạn nhận được một email có vẻ như từ ngân hàng của bạn, yêu cầu bạn đăng nhập. Bạn nhấp vào liên kết, và trang web trông hợp pháp, vì vậy bạn nhập thông tin đăng nhập của mình và kẻ tấn công có thể sử dụng chúng để đăng nhập vào trang web gốc. Đây đang trở thành một vấn đề ngày càng gia tăng trong kỷ nguyên kỹ thuật số và ngay cả các công ty lớn như Okta (một nhà cung cấp xác thực!) hoặc Retool cũng từng là nạn nhân của các cuộc tấn công spear-phishing (một dạng lừa đảo đặc biệt trong đó những nạn nhân đơn lẻ là mục tiêu cụ thể bằng các thủ đoạn lừa đảo rất cá nhân), nhấn mạnh sự cần thiết của các biện pháp bảo mật mạnh mẽ.

Ngược lại, nếu bạn sử dụng passkey và trang web đó là giả mạo, quá trình xác thực của bạn sẽ thất bại. Điều này là do passkey được liên kết chặt chẽ với các tên miền mà chúng được tạo ra thông qua Relying Party ID.

Bạn không thể đăng nhập bằng passkey trên bất kỳ trang web nào khác, làm cho passkey có khả năng chống lừa đảo mạnh mẽ (mặc dù không có hệ thống nào hoàn toàn miễn nhiễm với tất cả các vectơ tấn công).

Cơ chế này được tích hợp vào WebAuthn, tiêu chuẩn web nền tảng của passkey cho xác thực không mật khẩu. WebAuthn được xây dựng trên hai nghi thức cốt lõi: nghi thức đăng ký và xác thực.

Trong nghi thức đăng ký (đăng ký tài khoản), một passkey mới được tạo cho một dịch vụ trực tuyến (Relying Party) thông qua một ứng dụng web hoặc ứng dụng gốc. Trong quá trình này, tên miền (Relying Party ID) mà passkey được tạo ra cho nó sẽ được lưu trữ trong passkey.

Điều này cho phép nghi thức xác thực (đăng nhập) kiểm tra xem dịch vụ trực tuyến (Relying Party), mà ứng dụng web hoặc ứng dụng gốc thuộc về, có khớp với Relying Party ID được lưu trữ trong passkey hay không.

Trong phần sau, chúng ta sẽ xem chi tiết cách quá trình khớp tên miền này hoạt động và cụ thể là cách các ứng dụng gốc được bảo mật.

2. Relying Party ID là gì?#

Relying Party ID về cơ bản là một tên miền được lưu trữ trong passkey, đảm bảo passkey chỉ hoạt động nếu URL trình duyệt hiện tại (nguồn gốc của người dùng được tự động gửi trong mỗi yêu cầu) khớp với nó (xem cách tiếp cận ứng dụng gốc bên dưới). Đây là một thành phần quan trọng của thông số kỹ thuật WebAuthn, mà bạn có thể tìm hiểu sâu hơn tại đây. Relying Party ID có thể là tên miền gốc (ví dụ: corbado.com) hoặc một miền phụ (auth.corbado.com). Bạn không thể lưu trữ tên miền gốc làm Relying Party ID nếu nó nằm trong danh sách hậu tố công cộng (tìm danh sách và thư viện phát hiện hậu tố công cộng tại đây). Việc thay đổi Relying Party ID cho một dịch vụ trực tuyến sẽ làm hỏng các passkey hiện có (ngoại lệ: Relying Party ID mới là một miền phụ của Relying Party ID cũ, hoặc Related Origin Requests được cấu hình thông qua .well-known/webauthn để cho phép tái sử dụng passkey trên các miền liên quan).

Trong quá trình xác thực, Relying Party ID được kiểm tra chéo với URL trình duyệt (nguồn gốc của người dùng) để đảm bảo chúng khớp nhau. Khớp trong ngữ cảnh này có nghĩa là một trong hai trường hợp:

  • URL trình duyệt (nguồn gốc của người dùng) khớp chính xác với Relying Party ID HOẶC
  • URL trình duyệt (nguồn gốc của người dùng) là một miền phụ khớp với Relying Party ID và miền cha có thể đăng ký được (ví dụ: com hoặc bất kỳ miền nào trên Public Suffix List đều không hoạt động)

Dưới đây là phác thảo chi tiết về những originalHost nào (cột thứ hai) được phép truy cập vào tên miền cha của nó:

Trong phần sau, bạn sẽ thấy PublicKeyCredentialCreationOptions đã được phân tích cú pháp:

{ "publicKey": { "attestation": "direct", "authenticatorSelection": { "authenticatorAttachment": "platform", "requireResidentKey": false, "userVerification": "preferred" }, "challenge": "qNqrdXUrk5S7dCM1MAYH3qSVDXznb-6prQoGqiACR10=", "excludeCredentials": [], "pubKeyCredParams": [ { "alg": -7, "type": "public-key" } ], "rp": { "id": "corbado.com", "name": "Corbado" }, "timeout": 30000, "user": { "displayName": "Corbado user", "id": "bz9ZDfHzOBLycqISTAdWwWIZt8VO-6mT3hBNXS5jwmY=" } } }

rp là viết tắt của Relying Party.

Một trong những lợi ích lớn nhất của Relying Party ID là phòng ngừa các cuộc tấn công lừa đảo. Hãy tưởng tượng kịch bản sau:

  1. Kẻ tấn công phát triển một bản sao của PayPal, là một trang web giả mạo cố gắng đánh cắp thông tin đăng nhập PayPal của bạn để đăng nhập dưới danh nghĩa của bạn và gửi tiền vào tài khoản của kẻ tấn công. Trang web PayPal giả mạo này được lưu trữ trên miền paybal.com (vì vậy thoạt nhìn thường không thể nhận ra đó là một tên miền khác).
  2. Bạn đã tạo một passkey trong quá khứ cho trang web PayPal hợp pháp. Passkey này đã lưu trữ Relying Party ID paypal.com.
  3. Bạn truy cập trang web PayPal giả mạo tại paybal.com (khi bạn truy cập trang web này, nguồn gốc yêu cầu của bạn là paybal.com*) và trang web gửi cho thiết bị của bạn (bộ xác thực) một thử thách cho Relying Party ID paypal.com (ở đây nó cố lừa bạn) và yêu cầu bạn ký nó bằng passkey của bạn cho Relying Party ID paypal.com.
  4. Thiết bị của bạn (bộ xác thực) kiểm tra xem nguồn gốc của yêu cầu (paypal.com) và Relying Party ID mà nó lưu trữ trong passkey (paypal.com) có khớp nhau hay không.
  5. Vì chúng rõ ràng không khớp nhau, quá trình xác thực sẽ thất bại và nó cứu bạn khỏi việc cấp quyền truy cập vào tài khoản PayPal của bạn cho kẻ tấn công nào đó.

Sơ đồ sau minh họa cơ chế phòng ngừa lừa đảo này.

Trong trường hợp của một ứng dụng gốc, việc xử lý nguồn gốc khác nhau tùy theo nền tảng: Trên Android, nguồn gốc được định dạng là android:apk-key-hash:<SHA256_fingerprint>. Trên iOS, nguồn gốc WebAuthn là web-origin của RP (ví dụ: https://paypal.com). Trong cả hai trường hợp, sự tin cậy giữa ứng dụng gốc của bạn và máy chủ được xác minh thông qua tệp liên kết (association file) tương ứng (xem bên dưới). Để biết thông tin chi tiết về cách hoạt động xác minh nguồn gốc cho ứng dụng gốc, hãy xem hướng dẫn chuyên dụng của chúng tôi về xác minh nguồn gốc WebAuthn cho ứng dụng gốc.

Slack Icon

Tham gia Passkeys Community để nhận cập nhật và hỗ trợ.

Tham gia

3. Hai Tùy chọn Tích hợp Khác nhau cho Ứng dụng Gốc#

Để triển khai passkey trong một ứng dụng gốc, nhà phát triển có thể quyết định giữa việc thêm chúng qua WebView hoặc theo cách gốc (native). Hãy cùng xem xét những lợi ích và hạn chế của cả hai cách tiếp cận sau đây.

3.1 Tích hợp Passkey qua WebView#

Sử dụng WebView* để tích hợp passkey có nghĩa là nhúng một trình duyệt web vào trong ứng dụng gốc để xử lý quy trình xác thực. Cách tiếp cận này về cơ bản là hiển thị một trang web bên trong ứng dụng, giúp việc tái sử dụng các quy trình xác thực dựa trên web dễ dàng hơn mà không cần phải viết lại chúng cho nền tảng gốc. Tuy nhiên, có một số nhược điểm. WebView có thể không hỗ trợ tất cả các tính năng của passkey, và có nguy cơ tiềm ẩn về các cuộc tấn công "man-in-the-middle" nếu không được triển khai an toàn. Ngoài ra, trải nghiệm người dùng có thể không mượt mà như tích hợp gốc và có thể có những thách thức trong việc duy trì hành vi nhất quán trên các thiết bị và phiên bản HĐH khác nhau.

*Có nhiều loại WebView: Trên iOS (WKWebView, SFSafariViewController hoặc SFAuthenticationSession / ASWebAuthenticationSession cho các quy trình xác thực dựa trên OAuth/OpenID Connect) và Android (WebView, CCT-Chrome Custom Tabs). Xem bài đăng trên blog này để biết thêm chi tiết. Chúng tôi khuyên bạn nên sử dụng SFSafariViewController/ ASWebAuthenticationSession và Chrome Custom Tabs trong ngữ cảnh của passkey nếu bạn không muốn tích hợp gốc.

StateOfPasskeys Icon

Xem có bao nhiêu người thực sự dùng passkeys.

Xem dữ liệu adoption

3.2 Tích hợp Passkey Gốc#

Tích hợp gốc liên quan đến việc xây dựng chức năng passkey trực tiếp vào ứng dụng iOS hoặc Android sử dụng các API và thư viện dành riêng cho nền tảng. Phương pháp này mang lại trải nghiệm người dùng liền mạch hơn, vì không cần chuyển đổi giữa ứng dụng gốc và WebView. Nó cũng cho phép hiệu suất tốt hơn và giao diện nhất quán hơn. Từ góc độ bảo mật, tích hợp gốc có thể cung cấp khả năng bảo vệ tăng cường chống lại một số loại hình tấn công nhất định, đặc biệt là khi kết hợp với các tính năng bảo mật của từng nền tảng. Tuy nhiên, công sức triển khai có thể cao hơn, vì các nhà phát triển cần viết và bảo trì mã riêng cho mỗi nền tảng (Android và iOS). Hơn nữa, việc cập nhật các thông số kỹ thuật passkey / WebAuthn mới nhất có thể yêu cầu các bản cập nhật ứng dụng thường xuyên hơn.

Trong phần sau, chúng tôi sẽ tập trung vào tích hợp passkey gốc.

StateOfPasskeys Icon

Xem có bao nhiêu người thực sự dùng passkeys.

Xem dữ liệu adoption

4. Cấu hình Relying Party cho Ứng dụng Gốc#

Các ứng dụng gốc (ví dụ: ứng dụng iOS hoặc Android) đặt ra một thách thức so với các ứng dụng web. Không giống như các ứng dụng web, không có URL trình duyệt nào để khớp với Relying Party ID. Tuy nhiên, để đảm bảo cùng một mức độ bảo mật, các tên miền được kết nối với các ứng dụng gốc thông qua các tệp liên kết (association files), để thiết lập sự tin cậy giữa một tên miền và một ứng dụng gốc.

Điều này đặc biệt quan trọng nếu một passkey được tạo trên một ứng dụng web và nên được sử dụng cho cùng một Relying Party ID trên một ứng dụng gốc (và ngược lại).

4.1 Các tệp liên kết trên iOS: apple-app-site-association#

iOS sử dụng tệp apple-app-site-association. Tệp này chứa nhiều quyền (entitlements) khác nhau, nhưng đối với WebAuthn và passkey, quyền webcredentials rất quan trọng.

{ "webcredentials": { "apps": ["9RF9KY88B2.com.corbado.passkeys"] } }

Trong webcredentials.apps, bạn cần lưu trữ Tiền tố Định danh Ứng dụng (ví dụ: 9RF9KY77B2) và Định danh Gói (Bundle Identifier) của bạn (ví dụ: com.corbado.passkeys).

Để các ứng dụng gốc iOS hoạt động, tệp apple-app-site-association phải được lưu trữ trong thư mục /.well-known của Relying Party ID (https://<Relying Party ID>/.well-known/apple-app-site-association).

Xem ví dụ trực tiếp tại đây.

4.2 Các tệp liên kết trên Android: assetlinks.json#

Android sử dụng tệp assetlinks.json, giống như đối tác iOS của nó, yêu cầu các cấu hình đặc biệt cho WebAuthn và passkey.

[ { "relation": [ "delegate_permission/common.handle_all_urls", "delegate_permission/common.get_login_creds" ], "target": { "namespace": "android_app", "package_name": "com.corbado.passkeys.pub", "sha256_cert_fingerprints": [ "F8:90:4E:9A:99:01:71:75:25:38:D5:36:16:2D:B3:65:EB:41:51:D4:53:9A:72:BC:4B:56:C5:16:43:62:E2:C0" ] } } ]

Bạn cần thiết lập các giá trị relation là delegate_permission/common.handle_all_urlsdelegate_permission/common.get_login_creds. Bên cạnh đó, bạn cần thêm tên gói của mình và dấu vân tay SHA-256 của chứng chỉ ký của bạn.

Để cho phép chia sẻ passkey giữa ứng dụng gốc và ứng dụng web, bạn cần thêm hai mục. Một cho namespace web và một cho namespace android_app.

Xem ví dụ trực tiếp tại đây.

Để các ứng dụng Android hoạt động, tệp assetlinks.json phải được lưu trữ trong thư mục /.well-known của Relying Party ID https://<Relying Party ID>/.well- known/assetlinks.json - gần giống như trên iOS).

Hãy xem bài đăng blog này để thấy một triển khai mẫu chia sẻ passkey giữa một ứng dụng Android / iOS gốc và một ứng dụng web.

Debugger Icon

Thử nghiệm các luồng passkey trong Passkeys Debugger.

Thử miễn phí

5. Thiết lập Sự Tin cậy giữa một Ứng dụng Gốc và Ứng dụng Web#

5.1 iOS#

Quá trình thiết lập sự tin cậy giữa ứng dụng iOS và ứng dụng web diễn ra như sau:

  1. Nhà phát triển ứng dụng iOS phải chỉ định danh sách các tên miền mà họ muốn liên kết với ứng dụng gốc. Các tên miền này được mã hóa cứng trong các quyền (entitlements) của ứng dụng iOS, ví dụ:
  • webcredentials:auth.Corbado.com
  • webcredentials:*.Corbado.com
  1. Mỗi khi ứng dụng iOS được cài đặt hoặc cập nhật, iOS sẽ tải xuống tệp apple-app-site-association cho từng mục trong danh sách quyền của ứng dụng iOS.

  2. Khi thông tin xác thực (ví dụ: passkey) được tạo bên trong một ứng dụng iOS, ứng dụng iOS xác minh xem tên miền của máy chủ relying party có được liên kết với ứng dụng iOS hay không bằng cách kiểm tra hai khía cạnh sau:

  • Có tệp apple-app-site-association cho tên miền máy chủ relying party này tồn tại trên thiết bị không?
  • Ứng dụng iOS có được liệt kê trong tệp apple-app-site-association đó không?

Nếu và chỉ nếu, cả hai câu hỏi đều có thể được trả lời là có, thì passkey có thể được tạo trong ứng dụng iOS.

Igor Gjorgjioski Testimonial

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 study

5.2 Android#

Quá trình thiết lập sự tin cậy giữa ứng dụng Android và ứng dụng web diễn ra như sau:

  1. Nhà phát triển ứng dụng Android phải chỉ định danh sách các tên miền mà họ muốn liên kết với ứng dụng Android. Các tên miền này được lưu trữ dưới dạng các mục tiêu (targets) với namespace web trong tệp assetlinks.json. Để khai báo rằng các ứng dụng Android và ứng dụng web chia sẻ thông tin xác thực, cần phải chỉ định delegate_permission/common.get_login_creds. Tìm chi tiết tại đây.

  2. Nếu passkey được tạo bên trong ứng dụng Android, ứng dụng Android xác minh xem Relying Party ID có được liên kết với ứng dụng Android hay không bằng cách kiểm tra assetlinks.json:

  • Có tệp assetlinks.json nào cho Relying Party ID này tại https://<Relying Party ID>./well-known/assetlinks.json không?
  • Ứng dụng Android có được xác định chính xác như một target không.
  1. Nếu và chỉ nếu, cả hai câu hỏi đều có thể được trả lời là có, thì passkey có thể được tạo trong ứng dụng Android.

Sơ đồ dưới đây so sánh song song các quy trình thiết lập sự tin cậy này.

Substack Icon

Đăng ký Passkeys Substack để nhận tin mới nhất.

Đăng ký

6. Tổng quan về Cài đặt cho Android, iOS & Flutter#

Trong phần sau, chúng tôi cung cấp cái nhìn tổng quan chi tiết về các cài đặt khác nhau cần thiết để thiết lập đúng quy trình xác thực passkey cho các ứng dụng gốc.

Tính năngiOSAndroid
Hướng dẫn triển khai chính thức cho xác thực passkey gốcApple DeveloperGoogle Developer
Cho phép chia sẻ passkey với các ứng dụng webCó, thông qua tệp apple-app-site-associationCó, thông qua assetlinks.json
Vị trí của tệp liên kếthttps://acme.com/.well-known/apple-app-site-associationhttps://acme.com/.well-known/assetlinks.json
Tệp được lưu vào bộ nhớ cache (cached)Có (kể từ iOS 14), quá trình đồng bộ hóa ban đầu có thể mất tới 24 giờCó (bởi Play Services)
Có thể vượt qua (By-pass)Có, với phần alternate modeKhông
Có thể kiểm tra bằngkiểm tra apple-app-site-associationkiểm tra assetlinks.json
Định danh ứng dụng với mẫu<Application Identifier Prefix>.<Bundle Identifier>, ví dụ: T84QZS65DQ.com.facebook.MessengerDấu vân tay SHA256, ví dụ: E3:F9:E1:E0:CF:99:D0:E5:6A:05:5B:A6: 5E:24:1B:33:99: 7F:CE:A5:24:32: 6B:0C:DD:6E:C1:32: 7E:D0:FD:C1
Nơi tìm định danh ứng dụngTeam Application Identifier Prefix có thể được tìm thấy trong tài khoản nhà phát triển trên developer.apple.com và Bundle Identifier là tên chính xác từ bên trong dự án XCodeKhi đã tải lên: Google Play Console > Quản lý phát hành (Release management) > Chữ ký ứng dụng (App signing) Cục bộ: keytool -list -v -keystore <keystore path> -alias <key alias> -storepass <store password> -keypass <key password>
Tên phần liên kết ứng dụng với webapplinks (không bắt buộc đối với passkey)delegate_permission/common.handle_all_urls (bắt buộc đối với passkey)
Tên phần cho phép chia sẻ thông tin xác thực giữa ứng dụng / webwebcredentialsdelegate_permission/common.get_login_creds
Đăng ký tất cả các tệp liên kếtBật và thêm miền được liên kết trong môi trường phát triển XCode (cài đặt thuộc tính để tạo tệp entitlements)Khi sử dụng Credential Manager API, việc đăng ký assetlinks.json trong manifest không bắt buộc đối với passkey (tuy nhiên lại bắt buộc đối với mật khẩu). Khi không sử dụng Credential Manager API, bạn cần liệt kê các tên máy chủ bằng mục <data> trong AndroidManifest.xml ở hoạt động cụ thể (một phần của Mã nguồn Ứng dụng Android). Phần <intent-filter android:autoVerify="true"> cần phải là autoVerify=true.

Đối với Flutter, quy tắc tương ứng của Android hoặc iOS sẽ được áp dụng. Cài đặt dành riêng cho Flutter duy nhất là đăng ký các tệp liên kết, nơi bạn nên thêm:

7. Các Ví dụ về Relying Party ID & Tệp Liên kết Hợp lệ & Không Hợp lệ#

Vì bản thân chúng tôi đã trải nghiệm, việc làm việc với Relying Party IDs, các cấp độ khác nhau của (sub-)domains và CNAMEs có thể là một nhiệm vụ khá thách thức, chúng tôi trình bày bốn ví dụ riêng biệt và giải thích lý do cũng như cách chúng hoạt động.

Lưu ý rằng, hàng bảng CNAME không bắt buộc đối với xác thực passkey và chỉ là kết quả nghiên cứu mà chúng tôi muốn thêm vào.

7.1 Ví dụ 1: Relying Party là Tên miền Gốc#

Relying Party IDcorbado.com
Quyền - Entitlements (chỉ trên iOS)webcredentials:corbado.com
Vị trí tệp apple-app-site-associationhttps://corbado.com/.well-known/apple-app-site-association
Vị trí tệp assetlinks.jsonhttps://corbado.com/.well-known/assetlinks.json
CNAMEkhông có

Trong ví dụ này, tệp apple-app-site-association / assetlinks.json cho Corbado.com có thể được tải xuống mà không gặp bất kỳ vấn đề gì khi ứng dụng gốc được cài đặt / cập nhật, vì tệp nằm ở cùng vị trí với Relying Party ID.

Một passkey cho Relying Party ID có thể được tạo.

7.2 Ví dụ 2: Relying Party là Miền phụ và CNAME được đặt#

Relying Party IDauth.corbado.com
Quyền - Entitlements (chỉ trên iOS)webcredentials:auth.corbado.com
Vị trí tệp apple-app-site-associationhttps://pro-123.passkeys.eu/.well-known/apple-app-site-association
Vị trí tệp assetlinks.jsonhttps://pro-123.passkeys.eu/.well-known/assetlinks.json
CNAMEauth.corbado.com => pro-123.passkeys.eu

Trong ví dụ này, tệp apple-app-site-association / assetlinks.json cho auth.corbado.com có thể được tải xuống mà không gặp bất kỳ sự cố nào khi ứng dụng gốc được cài đặt / cập nhật, vì tệp nằm trên vị trí tương ứng với Relying Party ID, do CNAME trỏ từ Relying Party ID đến vị trí được lưu trữ.

Một passkey cho Relying Party ID có thể được tạo.

7.3 Ví dụ 3: Relying Party là Tên miền Gốc và CNAME được đặt#

Relying Party IDcorbado.com
Quyền - Entitlements (chỉ trên iOS)webcredentials:corbado.com; webcredentials:auth.corbado.com
Vị trí tệp apple-app-site-associationhttps://pro-123.passkeys.eu/.well-known/apple-app-site-association
Vị trí tệp assetlinks.jsonhttps://pro-123.passkeys.eu/.well-known/assetlinks.json
CNAMEauth.corbado.com => pro-123.passkeys.eu

Trong ví dụ này, tệp apple-app-site-association / assetlinks.json cho auth.corbado.com có thể được tải xuống mà không gặp sự cố khi ứng dụng gốc được cài đặt / cập nhật, vì tệp ở đó, do CNAME, tại vị trí nơi mà auth.corbado.com mong đợi nó.

NHƯNG: Tệp apple-site-association-file / assetlinks.json cho corbado.com không thể được tải xuống, khi ứng dụng gốc được cài đặt / cập nhật, vì tệp không nằm ở https://corbado.com/.well-known/apple-app-site-association / https://corbado.com/.well-known/assetlinks.json, nơi nó được mong đợi và không có CNAME nào trỏ đến đó.

Một passkey cho Relying Party ID KHÔNG thể được tạo.

7.4 Ví dụ 4: Relying Party là một Miền phụ & Quyền dạng Wildcard được đặt#

Relying Party IDauth.corbado.com
Quyền - Entitlements (chỉ trên iOS)webcredentials:*.corbado.com
Vị trí tệp apple-app-site-associationhttps://corbado.com/.well-known/apple-app-site-association
Vị trí tệp assetlinks.jsonhttps://corbado.com/.well-known/assetlinks.json
CNAMEkhông có

Trong ví dụ này, tệp apple-app-site-association cho corbado.com có thể được tải xuống mà không gặp vấn đề gì khi ứng dụng gốc được cài đặt / cập nhật, vì tệp nằm ở nơi mà nó được mong đợi và quyền webcredentials (*.corbado.com) khớp với Relying Party ID (auth.corbado.com). Lưu ý rằng ví dụ này không hoạt động đối với Android, vì Android không hoạt động với những thứ như quyền wildcard. Nói chung, cách định nghĩa Relying Party IDs này không được khuyến khích.

Một passkey cho Relying Party ID có thể được tạo.

Slack Icon

Tham gia Passkeys Community để nhận cập nhật và hỗ trợ.

Tham gia

8. Những Lỗi Thường gặp về Relying Party ID & Cách Phòng tránh Chúng#

8.1 Thay đổi Relying Party ID từ Miền phụ sang Tên miền Gốc#

Lỗi:

Bạn bắt đầu phát triển và định nghĩa một miền phụ (ví dụ: login.acme.com) là Relying Party ID của bạn. Những người dùng đầu tiên đã tạo một passkey cho Relying Party ID này. Sau đó, bạn nhận thấy rằng bạn cũng cần các passkey này để xác thực trên một miền phụ khác (ví dụ: app.acme.com). Vì nguồn gốc của người dùng và Relying Party ID cho miền phụ mới không khớp nhau, người dùng không thể đăng nhập bằng passkey. Việc thay đổi Relying Party ID trong cài đặt WebAuthn của bạn thành acme.com sẽ làm mất hiệu lực tất cả các passkey hiện có, vì nguồn gốc mới và Relying Party ID được lưu trữ trong các passkey hiện tại không khớp nhau.

Giải pháp:

Hãy kiểm tra kỹ lưỡng ngay từ ban đầu khi định nghĩa Relying Party ID của bạn vì điều này phần nhiều là quyết định cuối cùng. Nếu bạn không chắc chắn và muốn sẵn sàng cho tương lai, nghĩa là các miền phụ khác trong tương lai có thể cần passkey để xác thực, chúng tôi khuyên bạn nên sử dụng tên miền gốc (ví dụ: acme.com) làm Relying Party ID trừ khi nó nằm trên Public Suffix List.

8.2 Relying Party ID Khác nhau cho Ứng dụng Gốc và Ứng dụng Web#

Lỗi:

Bạn đang phát triển đồng thời một ứng dụng gốc và một ứng dụng web. Để đẩy nhanh tiến độ, bạn sử dụng hai máy chủ WebAuthn khác nhau (với Relying Party ID khác nhau cho ứng dụng gốc và web). Khi người dùng của bạn tạo những passkey đầu tiên, Relying Party ID tương ứng sẽ được lưu trữ trong passkey. Việc cho phép đăng nhập chéo thiết bị / chéo nền tảng bằng cùng một passkey, ví dụ như với một passkey được tạo trong ứng dụng web và cố gắng đăng nhập trong ứng dụng gốc, sẽ không còn khả thi nữa. Việc hợp nhất hai máy chủ WebAuthn sẽ hủy bỏ các passkey đã được đăng ký với máy chủ WebAuthn cũ (Relying Party ID cũ) và người dùng của bạn không thể đăng nhập bằng các passkey này.

Giải pháp:

Nếu bạn có nhiều ứng dụng (ví dụ: một ứng dụng web và một ứng dụng gốc), hãy luôn chỉ có một máy chủ WebAuthn duy nhất và chỉ định nghĩa một Relying Party ID cho tất cả các ứng dụng của bạn. Việc liên kết giữa các ứng dụng này có thể được thực hiện thông qua các bước được mô tả ở trên.

8.3 Các Tệp Liên kết Không Hợp lệ và Không thể Truy cập#

Lỗi:

Bạn bắt đầu phát triển ứng dụng của mình, đã định cấu hình các tệp liên kết và triển khai chúng lên máy chủ của bạn. Vì một lý do nào đó, bạn vẫn nhận được thông báo lỗi và không tìm ra nguyên nhân gốc rễ.

Giải pháp:

Một nguyên nhân tiềm ẩn gây ra thông báo lỗi có thể là một tệp liên kết bị sai định dạng hoặc không thể truy cập được. Trước khi triển khai bất kỳ tệp liên kết nào lên máy chủ, chúng tôi thực sự khuyên bạn nên kiểm tra tính hợp lệ và khả năng truy cập (thường các tệp này có thể nằm sau một VPN mạnh mẽ hoặc tường lửa ngăn chặn quyền truy cập thích hợp cho các crawler của Apple và Google) của một tệp liên kết thông qua các công cụ được cung cấp cho iOS và Android.

8.4 Tệp apple-app-site-association Chưa Được Cache Bởi Apple CDN#

Lỗi:

Bạn đã triển khai tệp apple-app-site-association của mình lên máy chủ và muốn bắt đầu ngay việc tạo passkey trên thiết bị thử nghiệm của mình. Tuy nhiên, vì một lý do nào đó, bạn không thể tạo passkey và nhận được thông báo lỗi.

Giải pháp:

Lý do đằng sau các thông báo lỗi này là do các thiết bị iOS tải xuống tệp apple- app-site-association để xác thực Relying Party. Để làm điều này, các thiết bị iOS không gửi yêu cầu trực tiếp đến máy chủ của bạn mà sử dụng CDN thay thế. Cả thiết bị và CDN đều lưu trữ tệp apple-app-site- association vào bộ nhớ đệm (cache) sau khi nó được truy xuất thành công. Do chức năng bộ nhớ đệm này, các thay đổi mới trong tệp apple-app-site-association của bạn không được phản ánh trực tiếp trong ứng dụng của bạn. Có thể mất tới 24 giờ cho đến khi CDN lưu tệp apple-app-site-association vào bộ nhớ đệm. Để vượt qua hạn chế này trong quá trình phát triển, bạn có thể nối thêm ?mode=developer vào Relying Party ID và vô hiệu hóa bộ nhớ đệm hoàn toàn (ví dụ: Relying Party ID sẽ là acme.com?mode=developer).

8.5 Trình giả lập Android và Tính không Tương thích của Phiên bản API#

Lỗi:

Bạn bắt đầu phát triển một ứng dụng Android và muốn kiểm tra nó trên một trình giả lập Android. Vì một lý do nào đó, bạn nhận được các thông báo lỗi, mặc dù bạn đã thiết lập đúng trình giả lập Android và các ứng dụng khác dường như hoạt động trơn tru trên đó.

Giải pháp:

Các phiên bản Android, sự hỗ trợ của Play Store và các phiên bản API đóng vai trò chính khi thử nghiệm một ứng dụng passkey. Bên cạnh đó, bạn cần phải đăng nhập vào một tài khoản Google. Vui lòng tham khảo phần khắc phục sự cố của chúng tôi để biết chi tiết.

9. Khuyến nghị#

9.1 Khuyến nghị Chung#

Khuyến nghị tổng thể của chúng tôi là chọn Relying Party ID một cách cẩn thận dựa trên bối cảnh ứng dụng và yêu cầu của bạn. Dưới đây, chúng tôi đã tổng hợp các trường hợp sử dụng phổ biến nhất, nhưng khuyến nghị chung của chúng tôi là bạn nên hướng tới việc chọn tên miền gốc của mình làm Relying Party ID và định cấu hình quá trình xác thực của bạn theo cách này. Với Corbado, chúng tôi cũng đã cấu hình sẵn theo cách này cho bạn (vì đây là một phần trong phương pháp của chúng tôi nhằm cung cấp tính năng xác thực passkey liền mạch cho tất cả các thiết lập kỹ thuật. Các thành phần UI và SDK của chúng tôi được chuẩn bị để sử dụng cùng với tên miền gốc của bạn làm Relying Party ID).

Trường hợpKhuyến nghị
A) Bạn có một tên miền gốc:

Ví dụ: acme.com

Tất cả các ứng dụng và quy trình xác thực đều chạy trên tên miền gốc này hoặc các miền phụ của nó.
✔️ Chọn tên miền gốc làm Relying Party ID của bạn vì điều này sẽ không gây ra bất kỳ vấn đề nào cho ứng dụng web hoặc ứng dụng gốc.
B) Bạn có nhiều tên miền gốc:

Ví dụ: kayak.com, kayak.co.uk, kayak.de

Bạn phục vụ người dùng của mình từ các tên miền cấp cao nhất quốc tế khác nhau. Kayak.com cho Hoa Kỳ và kayak.co.uk cho Vương quốc Anh hoặc bạn có các tên miền gốc hoàn toàn khác nhau nhưng vẫn muốn cho phép cùng những người dùng đó đăng nhập bằng cùng các passkey.
⚠️ Trên ứng dụng web của bạn, việc chia sẻ passkey yêu cầu cấu hình Related Origin Requests thông qua .well-known/webauthn để cho phép các nguồn gốc được chỉ định sử dụng một RP ID chung (sự hỗ trợ của trình duyệt thay đổi; hãy xác minh tính tương thích). Hoặc chọn một tên miền gốc chung cho xác thực.

✔️ Bạn có thể kết nối các ứng dụng gốc của mình với bất kỳ số lượng tên miền gốc nào miễn là bạn có quyền kiểm soát đối với các tệp liên kết ở mức độ gốc.

❌ Trong trường hợp sau này bạn muốn chuyển sang một tên miền gốc khác để lưu trữ trang web của mình, bạn sẽ không thể sử dụng các passkey đã được tạo của mình, vì bạn sẽ phải đổi thương hiệu và thay đổi tên miền (Relying Party ID).
C) Bạn CHƯA có tên miền gốc, bạn chỉ đang chạy trên backend hoặc trên một miền phụ công cộng. Có một số trường hợp mà điều này có thể xảy ra:

1. Bạn làm việc trên một miền phụ có sẵn miễn phí, nơi tên miền gốc không nằm dưới sự kiểm soát của bạn (tên miền gốc được liệt kê trong https://publicsuffix.org/) ví dụ như các URL CDN.

2. Bạn làm việc trên một ứng dụng gốc.
❌ Trên các miền phụ công cộng, bạn không thể kiểm soát các tệp liên kết ở cấp độ gốc của tên miền gốc. Do đó, passkey sẽ không hoạt động một cách native (bản địa).

⚠️ Cách duy nhất để sửa lỗi này đối với một số dịch vụ là chuyển sang gói trả phí, nơi bạn có thể định nghĩa một CNAME hoặc tự lấy một tên miền gốc tùy chỉnh.

9.2 Khuyến nghị Khi Sử dụng Corbado#

Trong phần sau, chúng tôi cung cấp một cây quyết định rất cụ thể giúp bạn xác định đúng Relying Party ID và cách bạn nên xử lý / lưu trữ các tệp liên kết khi sử dụng Corbado làm giải pháp passkey cho mình.

Quyết định đầu tiên là liệu bạn đang ở trong môi trường phát triển hay sản xuất. Mức độ quyết định tiếp theo mà bạn phải đưa ra dựa trên bối cảnh ứng dụng của bạn: bạn chỉ có ứng dụng gốc hay có cả ứng dụng gốc và ứng dụng web.

A) Phát triển#

Đối với môi trường phát triển, chúng tôi cho rằng bạn muốn bắt đầu phát triển và thử nghiệm nhanh chóng. Relying Party ID có thể được thay đổi sau nếu bạn muốn đưa vào hoạt động chính thức (go live).

A1) Chỉ Ứng dụng Gốc (Native-Only)#
  • Đặt Relying Party ID = pro-XXX.frontendapi.cloud.corbado.io (giá trị mặc định)
  • Corbado lưu trữ tệp liên kết giúp bạn
  • Không có tác vụ DNS nào dành cho bạn
A2) Ứng dụng Gốc & Ứng dụng Web#

Thường thì không dễ dàng để kiểm tra cả ứng dụng web và ứng dụng gốc cùng một lúc.

Tùy chọn 1:

Bạn đặt Relying Party ID = pro-XXX.frontendapi.cloud.corbado.io (ứng dụng gốc hoạt động) HOẶC đặt Relying Party ID = localhost (ứng dụng web hoạt động).

Tùy chọn 2:

Giải pháp duy nhất để ứng dụng gốc và web hoạt động cùng lúc là sử dụng một proxy ngược cục bộ (đây là một giải pháp khá thủ thuật):

  • Đặt Relying Party ID = acme-dev.com
  • Đặt CNAME từ acme-dev.com => pro-XXX.frontendapi.cloud.corbado.io
  • Thêm mục cấu hình /etc/hosts cục bộ: localhost acme-dev.com
  • Thêm reverse proxy (nginx) với quy tắc cho acme-dev.com => localhost:3000 (như một ví dụ)

B) Sản xuất#

Trong môi trường sản xuất, bạn phải quyết định xem liệu bạn hài lòng với một miền phụ làm Relying Party ID (ví dụ: auth.acme.com) hay bạn muốn một tên miền gốc làm Relying Party ID (ví dụ: acme.com).

B1) Miền phụ làm Relying Party ID#
B1.1) Chỉ Ứng dụng Gốc (Native-Only)#
  • Đặt Relying Party ID = auth.acme.com
  • Corbado lưu trữ tệp liên kết giúp bạn
  • Đặt CNAME từ auth.acme.com => pro-XXX.frontendapi.cloud.corbado.io
B1.2) Ứng dụng Gốc & Ứng dụng Web#
  • Đặt Relying Party ID = auth.acme.com
  • Corbado lưu trữ tệp liên kết giúp bạn
  • Đặt CNAME từ auth.acme.com => pro-XXX.frontendapi.cloud.corbado.io (cũng cần thiết để cookie hoạt động nếu bạn sử dụng tính năng quản lý phiên của Corbado)
B2) Tên miền Gốc làm Relying Party ID#
B2.1) Chỉ Ứng dụng Gốc (Native-Only)#
  • Đặt Relying Party ID = acme.com
  • Tự lưu trữ tệp liên kết trên máy chủ riêng của bạn tại acme.com/.well-known/<association file>
  • Không có tác vụ DNS nào dành cho bạn
B2.2) Ứng dụng Gốc & Ứng dụng Web#
  • Đặt Relying Party ID = acme.com
  • Tự lưu trữ tệp liên kết trên máy chủ riêng của bạn tại acme.com/.well-known/<association file>
  • Nếu bạn sử dụng tính năng quản lý phiên của Corbado, bạn cần đặt CNAME từ auth.acme.com => pro-XXX.frontendapi.cloud.corbado.io để làm cho cookie hoạt động (CNAME này không cần thiết cho Relying Party ID mà chỉ dành cho việc quản lý phiên)

Cây quyết định sau đây tóm tắt tất cả các đường dẫn cấu hình.

10. Kết luận#

Relying Party ID là nền tảng của WebAuthn và xác thực dựa trên passkey, đồng thời cung cấp khả năng chống lừa đảo mạnh mẽ. Việc định cấu hình đúng đắn, hiểu được những sự phức tạp trong việc khớp tên miền, và đảm bảo triển khai chính xác cho các ứng dụng gốc là rất quan trọng. Bài đăng blog này đã cho bạn thấy cách thiết lập chúng đúng cách và cách xử lý các lỗi khác nhau. Một khi cấu hình rpID của bạn đã vững chắc, hãy tập trung vào việc tối ưu hóa các quy trình tạo passkey và quy trình đăng nhập passkey để thúc đẩy sự đón nhận thực tế. Để hiểu rõ hơn về cách thiết lập passkey cho ứng dụng gốc, chúng tôi khuyên bạn nên đọc về passkey trong Flutter.

Nếu bạn có thêm câu hỏi hoặc cần hỗ trợ, đừng ngần ngại liên hệ.

Corbado

Về Corbado

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

Câu hỏi Thường gặp (FAQ)#

Relying Party ID ngăn chặn lừa đảo trong xác thực passkey như thế nào?#

Bộ xác thực so sánh nguồn gốc thực tế của trình duyệt với Relying Party ID được lưu trữ trong passkey. Nếu kẻ tấn công lưu trữ một trang web giả mạo tại một tên miền khác, sự không khớp nguồn gốc sẽ tự động khiến quá trình xác thực thất bại, ngay cả khi thử thách bị làm giả tuyên bố đó là RP ID hợp pháp. Sự liên kết này có nghĩa là một passkey được đăng ký tại paypal.com không thể được sử dụng trên một tên miền có bề ngoài giống hệt như paybal.com.

Điều gì xảy ra nếu tôi thay đổi WebAuthn Relying Party ID sau khi người dùng đã đăng ký passkey?#

Thay đổi RP ID làm vô hiệu hóa tất cả các passkey hiện có vì RP ID được lưu trữ trong mỗi thông tin xác thực sẽ không còn khớp với giá trị mới. Các ngoại lệ duy nhất là khi RP ID mới là một miền phụ của RP ID cũ hoặc khi Related Origin Requests được định cấu hình qua .well-known/webauthn. Hãy chọn tên miền gốc làm RP ID ngay từ đầu để tránh vấn đề không thể đảo ngược này.

Tại sao passkey iOS của tôi không hoạt động ngay sau khi tôi triển khai tệp apple-app-site-association?#

iOS không tải tệp apple-app-site-association trực tiếp từ máy chủ của bạn. Hệ điều hành này sử dụng CDN của Apple, CDN này có thể mất tới 24 giờ để đưa một tệp mới triển khai hoặc vừa cập nhật vào bộ nhớ đệm. Trong quá trình phát triển, hãy thêm ?mode=developer vào Relying Party ID để hoàn toàn bỏ qua quá trình lưu vào bộ nhớ đệm.

Tôi nên sử dụng miền phụ hay tên miền gốc làm Relying Party ID của mình cho các passkey?#

Bạn nên sử dụng tên miền gốc (ví dụ: acme.com) vì passkey được tạo trên bất kỳ miền phụ nào cũng có thể xác thực trên tất cả các miền phụ của tên miền gốc đó. Một RP ID thuộc miền phụ sẽ hạn chế việc sử dụng passkey trong miền phụ đó và các miền phụ con của nó, điều này sau này có thể làm hỏng các quy trình xác thực chéo miền phụ. Nếu bạn có nhiều tên miền gốc, ví dụ như acme.com và acme.co.uk, hãy cấu hình Related Origin Requests qua .well-known/webauthn để cho phép tái sử dụng passkey trên chúng.

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

Chia sẻ bài viết này


LinkedInTwitterFacebook