做者:anmalerhtml
本文轉自:http://blog.zhaojunling.me/p/24git
CAS中文文檔甚少,這篇文章對CAS接口參數有比較清楚的說明,排版也不錯查閱溫馨github
在當前互聯網產品中使用單點登陸的狀況很是的常見,好比Google、百度、阿里雲、京東、淘寶等。在用戶中心登錄後再訪問其餘子系統時系統自動檢測已登陸狀態,而不用從新登陸。web
提及單點登陸就不得不說CAS,這個已經成爲了單點登陸的代名詞。後端
CAS是爲了解決單點登陸問題所設計的一套協議。協議地址http://jasig.github.io/cas/development/protocol/CAS-Protocol-Specification.html瀏覽器
借用官網的圖片:安全
上面是一般使用的單點登陸邏輯圖,代理模式的邏輯圖點這裏查看。服務器
/login | 負責憑證管理,即用戶統一登陸入口,1.0版本提供 |
/logout | 退出的統一入口,1.0版本提供 |
/validate | 服務憑證驗證,1.0版本提供,不支持proxy,返回文本字符串yes or no |
/serviceValidate | 同/validate,2.0版本提供,proxy tickets不能返回驗證成功的結果,返回xml字符串 |
/proxyValidate | 同/serviceValidate,2.0版本提供,並提供對proxy tickets的驗證,返回xml字符串 |
/proxy | 2.0版本提供,負責提供proxy tickets |
/p3/serviceValidate | 同/serviceValidate,3.0版本提供,返回的xml結果添加了用戶屬性字段 |
/p3/proxyValidate | 同/p3/serviceValidate,3.0版本提供,增長對proxy tickets的驗證 |
能夠看出,從2.0開始驗證結果改爲了xml的格式方便擴展,在3.0中增長了用戶屬性。cookie
功能描述: 負責顯示登陸頁、處理用戶登陸、生成登陸憑據。post
參數說明:
service :可選,訪問受保護地址的標識符,基本都是一個web的URL,須要作URLEncode編碼。若是不提供則登陸成功後CAS服務器應該顯示一個信息告訴用戶已登陸。
renew :可選,忽略已經存在的已登陸憑證,要求用戶進行登陸。不能和gateway同時使用。
gateway :可選,若是未登陸,則不顯示登陸頁面,直接跳轉到service的地址,並添加noticket參數在URL的末尾。不能和renew同時使用。
method :可選,3.0新增,使用POST的方式發送相應的請求,默認使用302跳轉。
請求例子
https://cas.example.org/cas/login?service=http%3A%2F%2Fwww.example.org%2Fservice
Don’t prompt for username/password:
https://cas.example.org/cas/login?service=http%3A%2F%2Fwww.example.org%2Fservice&gateway=true
Always prompt for username/password:
https://cas.example.org/cas/login?service=http%3A%2F%2Fwww.example.org%2Fservice&renew=true
Use POST responses instead of redirects:
https://cas.example.org/cas/login?method=POST&service=http%3A%2F%2Fwww.example.org%2Fservice
後臺邏輯
登陸成功:重定向用戶到service所提供的URL,並添加參數名爲ticket的的service ticket。
登陸失敗:在登陸頁顯示登陸失敗的緣由。
功能描述: 銷燬以保存的已登陸憑據。
參數說明:
service :可選,登出成功後跳轉的URL地址。
後臺邏輯
若是cas server支持SLO,則發送一個POST請求的logout格式xml到全部的cas client,若是cas client不支持則直接忽略這個請求。cas server應該忽略全部發送給cas client的異常狀況,以保證cas server的穩定性和可用性。若是cas client支持基於service ticket的SLO,則應該返回一個success的HTTP狀態碼。
功能描述:驗證service ticket的有效性,返回文本格式。
參數說明:
service :必選,驗證成功後跳轉的URL地址。
ticket :必選,已獲取到的service ticket值。
renew :可選,若是設置則只有當service ticket是用戶直接登陸獲取時才返回成功,對以前已經存在的憑據無效。
接口響應內容
驗證成功:yes
驗證結果:no
功能描述:驗證service ticket的有效性,返回xml格式的結果。
參數說明:
service :必選,驗證成功後跳轉的URL地址。
ticket :必選,已獲取到的service ticket值。
renew :可選,若是設置則只有當service ticket是用戶直接登陸獲取時才返回成功,對以前已經存在的憑據無效。
pgtUrl :可選,proxy callback時的URL,在代理流程時候使用。
接口響應內容
驗證成功:
<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
<cas:authenticationSuccess>
<cas:user>username</cas:user>
<cas:proxyGrantingTicket>PGTIOU-84678-8a9d...</cas:proxyGrantingTicket>
</cas:authenticationSuccess>
</cas:serviceResponse>
驗證失敗:
<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
<cas:authenticationFailure code="INVALID_TICKET">
Ticket ST-1856339-aA5Yuvrxzpv8Tau1cYQ7 not recognized`
</cas:authenticationFailure>
</cas:serviceResponse>
錯誤代碼:
INVALID_REQUEST | 缺乏必須參數。 |
INVALID_TICKET_SPEC | 不知足驗證規範的要求。 |
UNAUTHORIZED_SERVICE_PROXY | 未被受權的service。 |
INVALID_PROXY_CALLBACK | 無效的proxy callback。 |
INVALID_TICKET | 無效的ticket,若是設置了renew且ticket不是來自初始登陸則也會被標識爲無效。 |
INVALID_SERVICE | ticket有效,可是相關聯的service和當前提供的不匹配,CAS Server須要是銷燬當前的ticket並保證一個ticket只會使用一次。 |
INTERNAL_ERROR | CAS server的內部服務器錯誤。 |
另:若是此接口收到的ticket是一個proxy ticket,則不能返回成功的驗證結果,應該在驗證失敗的文本消息中明確提示,如「驗證失敗,收到的是proxy ticket」。
功能描述: 參考/serviceValidate,添加了對proxy tickets的驗證支持。
接口相應內容
<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
<cas:authenticationSuccess>
<cas:user>username</cas:user>
<cas:proxyGrantingTicket>PGTIOU-84678-8a9d...</cas:proxyGrantingTicket>
<cas:proxies>
<cas:proxy>https://proxy2/pgtUrl</cas:proxy>
<cas:proxy>https://proxy1/pgtUrl</cas:proxy>
</cas:proxies>
</cas:authenticationSuccess>
</cas:serviceResponse>
功能描述: 根據以前產生的PGT,獲取prox service ticker供/proxyValidate接口交互使用。
參數說明:
pgt :必選,在/serviceValidate接口中cas server生成的PGT。
targetService :必選,後端server的地址,須要和下一步驗證的/proxyValidate中service相同。
接口相應內容
<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
<cas:proxySuccess>
<cas:proxyTicket>PT-1856392-b98xZrQN4p90ASrw96c8</cas:proxyTicket>
</cas:proxySuccess>
</cas:serviceResponse>
功能描述: 同/serviceValidate,返回xml中增長了user信息的屬性。
功能描述: 同/p3/serviceValidate,增長了對proxy tickets驗證的支持。
service ticket:一個不易被預測的字符串,可做爲用戶訪問service的憑證。
相關要注意的地方
在登陸的接口邏輯中生成,提供的service值不要出如今ticket中。
使用一次後應該當即失效不論是否驗證成功,再此使用相同的ticket驗證時必須返回驗證失敗。
應該設置一個合理的有效期,使用過時的ticket驗證必須返回驗證失敗。
建議驗證失敗時返回驗證失敗的具體緣由信息。
建議設置的有效期時間不超過5分鐘。
必須包含一段隨機字符串,以保證不會被猜想到。
必須使用ST-爲字符串開頭。
必須支持保護32個以上的字符,建議支持到256個字符串的長度。
proxy ticket:一個不易被預測的字符串,可做爲訪問後端service的憑證。
相關要注意的地方
在/proxy接口中生成,提供的service值不要出如今proxy ticket中。
使用一次後應該當即失效不論是否驗證成功,再此使用相同的ticket驗證時必須返回驗證失敗。
應該設置一個合理的有效期,使用過時的ticket驗證必須返回驗證失敗。
建議驗證失敗時返回驗證失敗的具體緣由信息。
建議設置的有效期時間不超過5分鐘。
必須包含一段隨機字符串,以保證不會被猜想到。
必須使用PT-爲字符串開頭。
後臺service必須能接收至少32位長度的字符串的ticket。
建議支持到256個長度字符串的ticket。
proxy-granting ticket:一個不易被預測的字符串,驗證service ticket後生成,可用於獲取proxy ticket。
相關要注意的地方
可用於獲取多個proxy ticket,可屢次數使用而不失效。
當用戶從CAS退出時,此ticket必須失效。
必須包含一段隨機字符串,以保證在一段時間不會被窮舉法所破解。
應該使用PGT-爲字符串開頭。
須要能夠處理超過64位長度的數據。
建議支持到256個長度字符串的數據。
proxy-granting ticket IOU:在/serviceValidate和/proxyValidate接口中返回的一段字符串,用來關聯service ticket (或proxy ticket)和proxy-granting ticket。
相關要注意的地方
不該該包含任何與之有關聯的PGT信息,必須確認不能從給定的PGTIOU字符串推算出PGT。
必須包含一段隨機字符串,以保證在一段時間不會被窮舉法所破解。
應該使用PGTIOU-爲字符串開頭。
必須支持保護32個以上的字符,建議支持到256個字符串的長度。
login ticket:和用戶名密碼一塊兒提交到後臺,爲了防止瀏覽器重複提交而形成的重複生成已登陸憑證。
相關要注意的地方
必須儘量的惟一
必須是一次性有效的,無論登陸成功或者失敗。
應該使用LT-爲字符串開頭。
ticket-granting cookie: 用於確認已登陸狀態的標識,保存在用戶的瀏覽器cookie中。
相關要注意的地方
若是未設置Long-Term支持,則過時時間應該設置爲當前瀏覽器的回話時間。
最好設置儘量嚴格的路徑,好比cas server部署到/cas則cookie的path應最好設置爲/cas。
儘可能包含一段隨機字符串,以保證在一段時間不會被窮舉法所破解。
應該使用TGC-做爲cookie名稱開頭。
cookie的值應該和ticket-granting ticket使用相同的規則生成,一般直接使用ticket-granting ticket的值。
ticket and ticket-granting cookie 內容格式
全部的ticket以及ticket-granting cookie僅能包含以下字符:a-z、A-Z、0-九、-(連字符號)。
ticket-granting ticket: 在cas server成功登錄後生成的字符串,能夠和標識單點登陸狀態的ticket-granting cookie綁定,在必定時間內做爲基礎生成service tickets, proxy-granting tickets 等。
相關要注意的地方
能夠用於獲取多個service tickets,不是一次性失效的,有過時時間和安全策略。
登出cas的時候必須過時失效。
必須包含一段隨機字符串,以保證在一段時間不會被窮舉法所破解。
應該使用TGT-做爲字符串開頭。
當分享給外部資源使用時推薦進行加密,以減小安全漏洞避免泄漏與之關聯了的身份認證回話。