Giao diện
Chi tiết luồng xác thực CAS
Mô tả luồng ticket-based SSO của CAS 2.0, bao gồm redirect, ticket validation qua XML và xử lý user.
Tổng quan luồng
CAS sử dụng mô hình ticket-based: user đăng nhập tại CAS server, CAS cấp service ticket dùng một lần, Digiforce gọi serviceValidate để xác minh ticket và lấy thông tin user từ XML response.
Sequence diagram chi tiết
Chi tiết Service URL
Service URL đóng vai trò quan trọng trong CAS:
- Khi redirect đến CAS: gửi service URL để CAS biết redirect về đâu
- Khi validate ticket: gửi lại cùng service URL — CAS so sánh service trong ticket với service trong request validate
WARNING
Service URL phải khớp chính xác giữa hai bước. Nếu khác nhau (kể cả trailing slash), CAS sẽ reject ticket.
Chi tiết XML Response
Success response
xml
<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
<cas:authenticationSuccess>
<cas:user>john.doe</cas:user>
<cas:attributes>
<cas:email>john@example.com</cas:email>
<cas:displayName>John Doe</cas:displayName>
</cas:attributes>
</cas:authenticationSuccess>
</cas:serviceResponse>Failure response
xml
<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
<cas:authenticationFailure code="INVALID_TICKET">
Ticket ST-xxxx not recognized
</cas:authenticationFailure>
</cas:serviceResponse>XML parsing
Plugin parse XML response để tìm username:
- Tìm element
<cas:user>trong namespacehttp://www.yale.edu/tp/cas - Nếu không tìm thấy, tìm
<sso:user>(một số CAS server dùng namespace khác) - Lấy text content làm username
cas:user vs sso:user
Hầu hết CAS server sử dụng namespace cas:. Tuy nhiên một số implementation tùy chỉnh có thể dùng prefix khác như sso:. Plugin hỗ trợ cả hai.
Ticket lifecycle
| Trạng thái | Mô tả |
|---|---|
| Issued | CAS tạo ticket khi user đăng nhập thành công |
| Valid | Ticket chưa được validate và chưa hết hạn |
| Consumed | Ticket đã được validate — không thể dùng lại |
| Expired | Ticket hết hạn (thường 5-10 giây) |
Service ticket chỉ dùng được một lần — sau khi Digiforce gọi serviceValidate, ticket bị consumed bất kể kết quả.
So sánh với OIDC flow
| Bước | CAS | OIDC |
|---|---|---|
| Redirect đến IdP | GET /login?service= | GET /authorize?client_id=&redirect_uri= |
| IdP trả về | Ticket qua query string | Code qua query string |
| Validation | GET /serviceValidate?ticket= | POST /token (code exchange) |
| User info | Trong XML response | GET /userinfo (riêng) |
| Format | XML | JSON |
Xử lý lỗi
| Lỗi | CAS error code | Nguyên nhân |
|---|---|---|
| INVALID_TICKET | Ticket không tồn tại hoặc đã expired | User quay lại trang cũ có ticket đã dùng |
| INVALID_SERVICE | Service URL không khớp | URL callback khác với URL đăng ký |
| INTERNAL_ERROR | Lỗi phía CAS server | Kiểm tra log CAS server |