Luồng xác thực
Mọi xác thực đều bắt đầu giống nhau: Directory Server gửi cho ACS một yêu cầu xác thực, và ACS đánh giá rủi ro. Điều xảy ra tiếp theo rơi vào một trong ba trường hợp.
Frictionless
ACS phê duyệt mà không cần chủ thẻ thao tác gì. Nền tảng của bạn không bao giờ được gọi — không có /step_up, và không có gì để bạn triển khai.
Đây là phần lớn traffic trong một portfolio khỏe mạnh, và là kết quả nên hướng tới để tối ưu.
Challenge bằng OTP
Chủ thẻ nhập một mã dùng một lần (one-time code). ACS sinh và kiểm tra mã; nền tảng của bạn chỉ có nhiệm vụ gửi mã đó đi.
sequenceDiagram
participant DS as Directory Server
participant ACS as Cake ACS
participant You as Nền tảng của bạn
participant CH as Chủ thẻ
DS->>ACS: AReq
ACS->>You: POST /step_up
You-->>ACS: SUCCESS, StepupType OTP
ACS-->>DS: ARes — challenge
DS->>ACS: CReq (mở cửa sổ challenge)
ACS->>You: POST /initiate_action (VerificationToken)
You->>CH: Gửi mã
CH->>ACS: Nhập mã
ACS->>DS: RReq — đã xác thực
Mã đến trong /initiate_action dưới dạng VerificationToken. Hãy gửi đúng giá trị đó. Nếu nền tảng của bạn tự sinh mã riêng, chủ thẻ sẽ nhận một mã trong khi ACS lại đang kiểm tra một mã khác, và mọi lần thử đều thất bại.
Challenge out-of-band
Chủ thẻ phê duyệt ngay trong app của bạn. ACS hiển thị trang chờ và biết kết quả theo một trong hai cách.
sequenceDiagram
participant ACS as Cake ACS
participant You as Nền tảng của bạn
participant CH as Chủ thẻ
ACS->>You: POST /initiate_action (OOBCallbackUrl)
You->>CH: Push notification
CH->>You: Phê duyệt trong app
You->>ACS: OOB callback — SUCCESS
Note over ACS,You: Hoặc, nếu không có callback nào đến:
ACS->>You: POST /validate
You-->>ACS: SUCCESS / RETRY / REJECTED
Callback là một đường tắt (fast path), không phải một yêu cầu bắt buộc. Nếu nó không bao giờ đến, ACS sẽ poll /validate khi chủ thẻ nhấn Continue. Việc triển khai callback vẫn đáng làm — nếu không có nó, chủ thẻ phải tự nhấn để kích hoạt việc kiểm tra, thay vì trang tự động hoàn tất ngay khi họ phê duyệt.
Gửi lại (Resend)
Nếu chủ thẻ yêu cầu một mã mới, ACS sẽ gọi lại /initiate_action với cùng StepupRequestId và StepupCounter được tăng lên. Hãy xử lý đây như việc gửi lại của cùng một phiên xác thực, không phải một phiên mới.
Giới hạn
Cả bốn trường hợp đều kết thúc xác thực với transStatus là N; chúng chỉ khác nhau ở chỉ báo hủy challenge (cancellation indicator) được báo cáo cho tổ chức thẻ.
| Giới hạn | Mặc định | Chỉ báo hủy |
|---|---|---|
| Số lần thử thất bại | 3 | 08 |
| Cửa sổ challenge được mở (phản hồi xác thực → yêu cầu challenge đầu tiên) | 30 giây | 05, với transStatusReason là 14 |
| Thời gian giữa các vòng challenge | 600 giây | 04 |
| Tổng thời gian sống của challenge, tính từ lúc tạo | 30 phút | 04 |
Các bộ đếm thời gian theo từng vòng đến từ chuẩn EMV 3-D Secure. Tổng thời gian sống thì không — nó tồn tại vì mỗi bộ đếm theo vòng sẽ được reset ở mỗi response tiếp theo, nên nếu không có giới hạn tổng, một client cứ liên tục poll có thể giữ một challenge mở vô thời hạn, tồn tại lâu hơn cả phiên xác thực ở phía bạn.
Nền tảng của bạn không cần tự thực thi bất kỳ giới hạn nào ở trên; ACS đã lo việc đó. Nhưng thời gian sống của session ở phía bạn nên tối thiểu là 30 phút, nếu không session của bạn có thể hết hạn trong khi ACS vẫn còn coi chủ thẻ là trong giới hạn cho phép.