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