Bỏ qua, đến nội dung

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:

  1. Khi redirect đến CAS: gửi service URL để CAS biết redirect về đâu
  2. 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:

  1. Tìm element <cas:user> trong namespace http://www.yale.edu/tp/cas
  2. Nếu không tìm thấy, tìm <sso:user> (một số CAS server dùng namespace khác)
  3. 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áiMô tả
IssuedCAS tạo ticket khi user đăng nhập thành công
ValidTicket chưa được validate và chưa hết hạn
ConsumedTicket đã được validate — không thể dùng lại
ExpiredTicket 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ướcCASOIDC
Redirect đến IdPGET /login?service=GET /authorize?client_id=&redirect_uri=
IdP trả vềTicket qua query stringCode qua query string
ValidationGET /serviceValidate?ticket=POST /token (code exchange)
User infoTrong XML responseGET /userinfo (riêng)
FormatXMLJSON

Xử lý lỗi

LỗiCAS error codeNguyên nhân
INVALID_TICKETTicket không tồn tại hoặc đã expiredUser quay lại trang cũ có ticket đã dùng
INVALID_SERVICEService URL không khớpURL callback khác với URL đăng ký
INTERNAL_ERRORLỗi phía CAS serverKiểm tra log CAS server