Thử nghiệm Giao thức xác minh email bằng một bản dùng thử ban đầu

Xuất bản: ngày 8 tháng 7 năm 2026, Lần cập nhật gần đây nhất: ngày 5 tháng 10 năm 2026

Khi thu thập địa chỉ email trong quá trình đăng ký, đăng nhập, đăng ký nhận thông tin, thanh toán, khôi phục tài khoản hoặc quy trình khác, bạn nên xác nhận rằng địa chỉ email đó là của người nhập. Các phương thức xác minh hiện có, chẳng hạn như mật khẩu một lần (OTP) hoặc đường liên kết xác minh qua email (đường liên kết đặc biệt), yêu cầu người dùng rời khỏi trang web của bạn. Quá trình gây gián đoạn này có thể làm tăng nguy cơ người dùng (dù là người hay tác nhân) bỏ hoàn toàn phiên và không bao giờ hoàn tất quy trình xác thực.

Email Verification API là một đề xuất cho phép trình duyệt giao tiếp trực tiếp với nhà cung cấp dịch vụ email để xác minh rằng người dùng sở hữu địa chỉ email đó. Người dùng chọn một email trong đề xuất tự động điền hoặc tự động hoàn thành của trình duyệt, gửi biểu mẫu và trang web sẽ xác minh địa chỉ email với nhà cung cấp mà không gửi email hoặc làm gián đoạn quy trình của người dùng.

Bản minh hoạ lời nhắc cho người dùng Email Verification API
Bản minh hoạ lời nhắc người dùng của API Xác minh email

Thu thập email là một điểm chuyển đổi quan trọng trong hành trình của người dùng và Chrome muốn nhận được ý kiến phản hồi về đề xuất này từ những trang web muốn xác minh email, nhà cung cấp dịch vụ email có thể thực hiện quy trình xác minh và người dùng trải qua quy trình này. Bạn có thể đăng ký bản dùng thử theo nguyên gốc ngay hôm nay và làm theo hướng dẫn triển khai tại đây. Để biết cấu hình chung về bản dùng thử theo nguyên gốc, hãy tham khảo bài viết Bắt đầu sử dụng bản dùng thử theo nguyên gốc.

Bạn có thể thử quy trình này bằng tài khoản minh hoạ:

Quy trình xác minh email

Các phần sau đây giải thích những việc bạn và người dùng cần làm để bắt đầu quy trình xác minh email, cũng như toàn bộ quy trình khi sử dụng Giao thức xác minh email.

Từ khóa

Sau đây là các thuật ngữ chính cho Email Verification API:

  • Bên xác minh: Trang web thu thập địa chỉ email và muốn xác minh địa chỉ email đó. Trình xác minh còn được gọi là Bên phụ thuộc.
  • Nhà cung cấp email: Dịch vụ cung cấp địa chỉ email của người dùng, ví dụ: gmail.com.
  • Đơn vị phát hành: Dịch vụ quản lý tài khoản cho email của người dùng, ví dụ: accounts.google.com. Đơn vị phát hành còn được gọi là Nhà cung cấp dịch vụ danh tính.

Trong một số trường hợp, nhà cung cấp dịch vụ email và đơn vị phát hành có thể hoạt động trên cùng một miền. Tuy nhiên, bạn cần phân biệt giữa việc có địa chỉ email và việc có một phiên hoạt động cho tài khoản được liên kết.

Cấu trúc quy trình Xác minh email
Cấu trúc quy trình xác minh email

Điều kiện tiên quyết

  • Người dùng phải đăng nhập vào nhà cung cấp dịch vụ email hoặc tổ chức phát hành của họ trên cùng một hồ sơ trình duyệt. Ví dụ: Nếu dùng Gmail, trẻ phải đăng nhập vào Tài khoản Google của mình.
  • Là một trang web xác minh tham gia, bạn phải đăng ký dùng thử nguồn gốc và cung cấp mã thông báo trên cùng trang với biểu mẫu email của bạn.
  • Người dùng phải chọn địa chỉ email của họ trong trình đơn thả xuống tự động điền hoặc tự động hoàn thành.

    • Nếu trước đây người dùng đã nhập địa chỉ email vào trường này, thì địa chỉ đó sẽ được cung cấp bằng tính năng tự động hoàn thành.
    • Nếu người dùng đã thêm địa chỉ email của họ bằng chế độ cài đặt "Tự động điền và mật khẩu" (chrome://settings/autofill) của Chrome, thì địa chỉ email đó sẽ được cung cấp bằng tính năng tự động điền.

  • Lần đầu tiên cung cấp địa chỉ email để xác minh, người dùng sẽ thấy lời nhắc cấp quyền. Việc này chỉ xảy ra một lần cho mỗi địa chỉ email.

Sau khi có phiên hoạt động đó trong trình duyệt, người dùng có thể bắt đầu quy trình:

  1. Trên biểu mẫu có trường email, người dùng chọn địa chỉ email của họ trong trình đơn thả xuống tự động hoàn thành. Trang xác minh cung cấp một trường ẩn trong biểu mẫu có số chỉ dùng một lần cho mỗi phiên bản để xác thực yêu cầu này.
  2. Sau đó, trình duyệt sẽ truy xuất bản ghi DNS xác minh email cho miền email. Thao tác này sẽ chuyển trình duyệt đến nhà phát hành. Sau đó, tổ chức phát hành sẽ xác nhận rằng họ có một phiên hoạt động cho địa chỉ email đó.

  3. Sau đó, tổ chức phát hành sẽ cung cấp Mã xác minh email (EVT) cho địa chỉ này. Trình duyệt kết hợp thông tin đó thành một JWT liên kết khoá với EVT, nguồn gốc trang web và số chỉ dùng một lần từ biểu mẫu đầu vào.

  4. Khi biểu mẫu được gửi, gói EVT sẽ được thêm vào trường ẩn và gửi đến trang web.

  5. Sau đó, trang web xác minh sẽ xác minh từng thông tin chi tiết đó: địa chỉ email dự kiến, số chỉ dùng một lần và chữ ký của trình duyệt và tổ chức phát hành.

  6. Người dùng sẽ thấy một thông báo nhỏ cho biết nhà cung cấp email của họ đã xác minh địa chỉ của họ.

Quy trình này cung cấp cho trang web xác minh thông tin xác nhận rằng địa chỉ email hợp lệ và thuộc về người dùng hiện tại, tức là trang web có thể bỏ qua bước gửi email xác minh.

Người dùng có thể quản lý email đã xác minh trong phần Cài đặt > Tự động điền và mật khẩu > Thông tin liên hệ > Email đã xác minh (hoặc mở chrome://settings/contactInfo).

Những điểm cần cân nhắc về trường hợp sử dụng

Xác minh email là một tính năng cải tiến từng bước cho quy trình hiện tại của bạn, giúp người dùng không cần rời khỏi trang web của bạn để truy xuất OTP hoặc nhấp vào một đường liên kết. Các trang web có thể thêm trường xác minh email vào tất cả các biểu mẫu có liên quan, chẳng hạn như đăng nhập, đăng ký nhận bản tin, tạo tài khoản và khôi phục mật khẩu. EVP chỉ kích hoạt nếu trình duyệt hỗ trợ. Nếu không nhận được mã khi gửi hoặc bất kỳ bước xác thực nào không thành công, bạn có thể quay lại quy trình xác nhận email mặc định. Điều này cũng có nghĩa là không có tính năng phát hiện cho API; trang web xác minh coi EVT là không bắt buộc, xử lý EVT nếu có trong yêu cầu.

Xác minh email để xác nhận rằng người dùng có một phiên hoạt động với nhà cung cấp địa chỉ email của họ. Thao tác này không xác minh rằng email của bạn đã đến được người dùng. Bạn vẫn có thể muốn gửi email chào mừng hoặc email hướng dẫn cho người dùng hiện tại và có thể muốn hoặc cần nhắc người dùng kiểm tra chế độ cài đặt thư rác.

Triển khai trang web xác minh

Để biết thêm thông tin chi tiết, bạn có thể xem mã minh hoạ toàn diện và tham khảo các bước xác thực trong đề xuất Email Verification API và Email Verification Protocol.

Định cấu hình các trường trong biểu mẫu

Đảm bảo các trường trong biểu mẫu có thuộc tính chính xác:

<input
  name="email-address"
  type="email"
  autocomplete="email">
<input
  type="hidden"
  name="token"
  nonce="rAnD0m-VaLuE"
  autocomplete="email-verification-token">

Đặt thuộc tính type và autocomplete của đầu vào email thành email để trình duyệt có thể tự động hoàn thành địa chỉ email.

Trường hidden mới sẽ được điền mã thông báo xác minh email khi bạn gửi biểu mẫu. Các thuộc tính cần thiết là:

  • Đặt type="hidden" vì trường này không yêu cầu hoạt động đầu vào của người dùng.
  • Đặt nonce="rAnD0m-VaLuE". Trang web phải cung cấp một số chỉ dùng một lần duy nhất theo phiên để xác minh lượt gửi biểu mẫu.
  • Đặt autocomplete="email-verification-token". Trình duyệt sử dụng thuộc tính này để xác định trường cần điền.

Xác thực các phần tử biểu mẫu bằng cách kiểm tra bảng điều khiển Mạng trong Công cụ cho nhà phát triển. Khi bạn chọn một địa chỉ email, bạn sẽ thấy trình duyệt kích hoạt DNS và các truy vấn tra cứu tài khoản tiếp theo cho nhà cung cấp dịch vụ email và tổ chức phát hành. Đây là các yêu cầu nội bộ của trình duyệt; trang web của bạn sẽ không nhận được gì cho đến khi người dùng gửi biểu mẫu.

Xác thực EVT

Có 5 bước để xác thực từng thành phần của gói EVT.

  1. Phân tích cú pháp mã thông báo.
  2. Xác thực các giá trị dự kiến.
  3. Xác thực liên kết khoá.
  4. Xác thực bản ghi DNS.
  5. khám phá nhà phát hành và xác minh chữ ký EVT.

1. Phân tích cú pháp mã thông báo

Dữ liệu thô từ biểu mẫu gửi chứa EVT và các thông tin xác nhận đã ký trong Mã thông báo web JSON tiết lộ có chọn lọc (SD-JWT+KB) được phân tách bằng dấu ngã (ký tự ~). Bạn sẽ cần tách các phần này và giải mã tiêu đề cũng như tải trọng Ký và mã hoá đối tượng JavaScript (JOSE) (ví dụ: bằng cách sử dụng jose cho Node.js).

Nếu example.com xác minh demo@gmail.com, thì tải trọng đã giải mã sẽ có dạng như trong ví dụ sau:

{
  "evtJwtDecodedPayload": {
    "cnf": {
      "jwk": {
        "crv": "Ed25519",
        "kty": "OKP",
        "x": "pUbLiCkEy123pUbLiCkEy123pUbLiCkEy123"
      }
    },
    "email": "demo@gmail.com",
    "email_verified": true,
    "iat": 1782911685,
    "iss": "https://accounts.google.com"
  },
  "kbJwtDecodedPayload": {
    "aud": "https://example.com",
    "iat": 1782911685,
    "nonce": "rAnDoM123rAnDoM123rAnDoM123rAnDoM123",
    "sd_hash": "hAsH456hAsH456hAsH456hAsH456hAsH456"
  }
}

2. Xác thực các giá trị dự kiến

Kiểm tra để đảm bảo rằng các giá trị cơ bản trong tải trọng khớp với các giá trị bạn cung cấp:

  • Xác minh rằng bạn đã đặt email_verified thành true.
  • Xác minh rằng email khớp với địa chỉ email mà bạn cung cấp trong biểu mẫu.
  • Xác minh rằng nonce khớp với số chỉ dùng một lần được cung cấp trong biểu mẫu của bạn.
  • Xác minh rằng aud khớp với nguồn gốc của trang web.
  • Xác minh rằng iat có dấu thời gian tương đối gần đây, chẳng hạn như sau khi biểu mẫu được hiển thị.

3. Xác thực liên kết khoá

Trình duyệt tạo một khoá tạm thời, ngắn hạn cho giao dịch để xác nhận rằng giao dịch đã ký mã thông báo. Trích xuất khoá này từ yêu cầu cnf (xác nhận) trong EVT, sau đó dùng khoá này để xác minh JWT liên kết với khoá.

Sau đó, hãy tính toán hàm băm dự kiến và so sánh với yêu cầu sd_hash. Ví dụ sau đây về Node.js cho thấy cách thực hiện phép tính này:

const calculatedHash = createHash("sha256")
        .update(evtJwt + "~")
        .digest("base64url");

4. Xác thực bản ghi DNS

Xác minh bản ghi DNS _email-verification cho miền của địa chỉ email. Ví dụ: đối với demo@gmail.com, hãy truy vấn bản ghi _email-verification.gmail.com TXT. Đối với nhà cung cấp này, truy vấn sẽ trả về vị trí của nhà cung cấp tài khoản, tức là accounts.google.com.

$ dig +short TXT _email-verification.gmail.com
"iss=accounts.google.com"

5. Khám phá tổ chức phát hành và xác minh chữ ký EVT

Đảm bảo rằng đơn vị phát hành phân phát tài nguyên /.well-known/email-verification. Tài nguyên này cung cấp các điểm cuối để phát hành mã thông báo, Khoá web JSON (JWK) cho trang web và các thuật toán ký được hỗ trợ.

$ curl https://accounts.google.com/.well-known/email-verification
{
  "issuance_endpoint": "https://accounts.google.com/gsi/email-verification/issue",
  "jwks_uri": "https://verifiablecredentials-pa.googleapis.com/.well-known/vc-public-jwks",
  "signing_alg_values_supported": ["EdDSA"]
}

Sử dụng JWK để xác minh JWT EVT mà bạn đã trích xuất từ mã thông báo. Hầu hết các thư viện JOSE đều cung cấp các hàm để xử lý quy trình xác minh này.

Nếu cả 5 bước đều thành công, tức là bạn đã xác minh địa chỉ email với nhà cung cấp. Nếu không, hãy quay lại việc gửi email xác nhận cho người dùng theo quy trình thông thường của bạn.

Triển khai dịch vụ nhà cung cấp email và tổ chức phát hành

Để biết thêm thông tin chi tiết, bạn có thể xem mã minh hoạ nhà cung cấp email mô phỏng và tham khảo các bước của tổ chức phát hành trong đề xuất API Xác minh email và Giao thức Xác minh email.

Là một đơn vị phát hành, bạn không cần đăng ký dùng thử nguồn gốc hoặc cung cấp mã thông báo vì hành vi của trình duyệt được kích hoạt bởi trang web của bên phụ thuộc. Bạn chỉ cần đảm bảo rằng các điểm cuối dự kiến đã được thiết lập để phản hồi những yêu cầu đó.

Định cấu hình tính năng khám phá tổ chức phát hành

Để cho phép trình duyệt tự động phát hiện các điểm cuối xác minh khi một địa chỉ email thuộc miền của bạn được chọn, hãy hiển thị cấu hình của bạn bằng cách sử dụng DNS và điểm cuối HTTP .well-known.

Định cấu hình bản ghi uỷ quyền DNS

Định cấu hình bản ghi DNS TXT trên miền email của bạn để uỷ quyền xác minh cho mã nhận dạng của tổ chức phát hành. Các giá trị nhận dạng này có thể sử dụng cùng một miền, tuỳ thuộc vào cơ sở hạ tầng của bạn.

Định dạng bản ghi: _email-verification.<email-domain>

Ví dụ về tệp vùng:

_email-verification.example.com IN TXT "iss=accounts.issuer.example"

Lưu trữ một điểm cuối .well-known/email-verification

Lưu trữ tệp siêu dữ liệu JSON trên miền của đơn vị phát hành theo đường dẫn /.well-known/. Tệp này trình bày các chức năng phát hành và thuật toán ký mã hoá mà cơ sở hạ tầng của bạn hỗ trợ.

Điểm cuối: https://<issuer-domain>/.well-known/email-verification

Ví dụ về câu trả lời:

{
  "issuance_endpoint": "https://accounts.issuer.example/email-verification/issuance",
  "jwks_uri": "https://accounts.issuer.example/.well-known/vc-public-jwks",
  "signing_alg_values_supported": ["EdDSA", "ES256"]
}

Lưu trữ một điểm cuối .well-known/web-identity

Một tài nguyên JSON .well-known khác mà bạn có thể đã triển khai trong Federated Credentials (FedCM) API. Thao tác này cung cấp các đường liên kết đến điểm cuối tài khoản và URL đăng nhập của bạn.

Điểm cuối: https://<domain>/.well-known/web-identity

Ví dụ về câu trả lời:

{
  "accounts_endpoint": "https://accounts.issuer.example/accounts",
  "login_url": "https://accounts.issuer.example/login"
}

Sử dụng điểm cuối tài khoản

Điểm cuối tài khoản của FedCM API hiện cung cấp danh sách các tài khoản đã đăng nhập. Ví dụ sau đây cho thấy một phản hồi tối thiểu. Để biết thêm thông tin chi tiết, hãy tham khảo hướng dẫn triển khai trình nhận dạng.

Điểm cuối: như được chỉ định trong .well-known/web-identity

Sau đây là một ví dụ về phản hồi:

{
  "accounts": [
    {
      "id": "demo-example",
      "name": "Demo User",
      "email": "demo@example.com",
      "given_name": "Demo"
    }
  ]
}

Tích hợp với Login Status API

Người dùng cần có một phiên hoạt động với nhà cung cấp và bạn phải báo hiệu điều đó cho trình duyệt bằng Login Status API (API Trạng thái đăng nhập).

Khi người dùng đăng nhập hoặc đăng xuất thành công, hãy phân phát tiêu đề phản hồi HTTP phù hợp:

Set-Login: logged-in
Set-Login: logged-out

Ngoài ra, hãy cập nhật trạng thái bằng JavaScript trong ngữ cảnh ứng dụng web của bạn:

navigator.login.setStatus("logged-in");
navigator.login.setStatus("logged-out");

Xử lý yêu cầu phát hành

issuance_endpoint của bạn sẽ nhận được một yêu cầu application/x-www-form-urlencoded POST có chứa request_token.

Các phần sau đây trình bày quy trình đầy đủ để xử lý các yêu cầu phát hành.

1. Xác thực yêu cầu phát hành

Phân tích cú pháp và xác thực tải trọng trình duyệt đến:

  • Phương thức: POST
  • Xác minh phiên: Xác thực cookie của bên thứ nhất session/authentication do người dùng truyền cùng với yêu cầu để đảm bảo có một bối cảnh nhận dạng đang hoạt động và được uỷ quyền.
  • Xác minh tham số: Trích xuất tham số request_token (một JWT đã ký do trình duyệt tạo). Xác minh rằng thông báo này chứa khoá công khai tạm thời dự kiến, email mục tiêu, đúng đối tượng và dấu thời gian hợp lệ.

Mã thông báo đã giải mã sẽ có dạng như sau:

{
  "decodedHeader": {
    "alg": "ES256",
    "typ": "JWT",
    "jwk": {
      "kty": "EC",
      "crv": "P-256",
      "x": "pUbLiCKeY123pUbLiCKeY123pUbLiCKeY123",
      "y": "pUbLiCKeY456pUbLiCKeY456pUbLiCKeY456"
    }
  },
  "decodedPayload": {
    "iss": "https://accounts.issuer.example",
    "sub": "demo@example.com",
    "email": "demo@example.com",
    "iat": 1780272000,
    "exp": 1780272300
  },
  "signature": "SIGnatURE-123_SIGnatURE-123_SIGnatURE-123"
}

2. Phản hồi bằng mã thông báo

Sau khi xác thực thành công mã thông báo phiên và yêu cầu, hãy tạo một JWT tiết lộ có chọn lọc (SD-JWT) đã ký bằng tải trọng:

{
  "iss": "https://accounts.issuer.example",
  "iat": 1780272000,
  "exp": 1780272300,
  "cnf": {
    "jwk": {
      "kty": "EC",
      "crv": "P-256",
      "x": "pUbLiCKeY123pUbLiCKeY123pUbLiCKeY123",
      "y": "pUbLiCKeY456pUbLiCKeY456pUbLiCKeY456"
    }
  },
  "email": "demo@example.com",
  "email_verified": true
}

Ký tải trọng bằng khoá riêng tư và thuật toán được hỗ trợ. Ví dụ: sử dụng jose trong Node.js:

const evtJwt = await new SignJWT(evtPayload)
   .setProtectedHeader({
     alg: "EdDSA",
     kid: PRIVATE_KEY_JWK.kid, // Key ID corresponding to our JWKS keys
     typ: "evt+jwt", // Standard Token Type for EVTs
   })
   .sign(privateKey);

 // Standard SD-JWT compatibility requires appending a trailing tilde "~"
 // to separate the signed token from the key binding section.
 const issuanceToken = `${evtJwt}~`;

Ví dụ về phản hồi thành công (HTTP 200):

{
  "issuance_token": "tOkEn123tOkEn123tOkEn123...~"
}

Những điểm cần lưu ý về bản dùng thử theo nguyên gốc

Bản dùng thử theo nguyên gốc là các thử nghiệm nhằm thu thập ý kiến phản hồi, vì vậy, ý kiến của bạn rất quan trọng nếu bạn tham gia với tư cách là bên phụ thuộc hoặc nhà cung cấp danh tính. Để báo cáo vấn đề, hãy sử dụng các kho lưu trữ GitHub sau:

Nếu bạn gặp lỗi trong quá trình triển khai Chrome, hãy báo cáo lỗi đối với thành phần:

Việc bật chức năng bản dùng thử theo nguyên gốc được kiểm soát theo từng phản hồi bằng cách bạn đưa mã thông báo bản dùng thử theo nguyên gốc vào. Điều này có nghĩa là bạn có thể kiểm soát chi tiết nếu muốn hạn chế chức năng này đối với một nhóm người dùng. Ví dụ: nếu đã có một khung thử nghiệm A/B, bạn có thể tích hợp bản dùng thử theo nguyên gốc vào đó cho một nhóm thử nghiệm có kiểm soát. Ngoài ra, nếu có một nhóm người dùng thử nghiệm beta hoặc xem trước sớm, thì bạn có thể muốn hoặc cần bật tính năng này cho họ. Trong trường hợp này, hãy kiểm tra địa chỉ email được cung cấp trước khi phát hành hoặc xác thực mã thông báo.

Bản dùng thử theo nguyên gốc cũng có giới hạn về lưu lượng truy cập để giảm thiểu số lượng trang web dựa vào tính năng này trước khi ra mắt. API của tổ chức phát hành đang trong quá trình phát triển và bạn nên dự kiến sẽ có những thay đổi không tương thích ngược cùng với các bản cập nhật cho trải nghiệm người dùng Chrome.

Chúng tôi sẽ đăng thêm thông tin cập nhật trên blog này và trên danh sách gửi thư evp-announce@chromium.org khi quá trình phát triển tiến triển.