前端需要了解的 SSO 與 CAS 知識
不管是什麼公司,隻要產品數量大於一個,那麼單點登錄勢必是繞不過去的一個問題。作為前端程序員,我們對其雖然接觸不多,但適當的了解還是必要的。本文就來談談單點登錄相關的問題。
前置知識
了解 SSO,最好具備以下知識。當然,如果不是特別熟,也不影響閱讀。
cookie及session
瀏覽器同源策略及跨域
了解登錄係統的構成
什麼是 SSO 與 CAS?
SSO
SSO 是英文 Single Sign On 的縮寫,翻譯過來就是單點登錄。顧名思義,它把兩個及以上個產品中的用戶登錄邏輯抽離出來,達到隻輸入一次用戶名密碼,就能同時登錄多個產品的效果。
使用 SSO 的優點很明顯:
提升用戶體驗。就以我廠為例。我廠有兩個產品,丁香人才網和丁香園論壇,假如你是我廠用戶,肯定無法忍受登錄丁香園論壇的時候輸入一次用戶名密碼,登錄人才網又要輸入一次用戶名密碼吧?
避免重複開發。假如你是我廠後端,每天任務都飽和的不行,肯定無法忍受到人才網開發一套登錄邏輯,到論壇又開發一套登錄邏輯吧?
提升安全係數
假如你是我廠運維,發現了一個安全隱患需要緊急修複。你肯定無法忍受給茫茫多的產品後端都發一封郵件,責令修複吧?萬一漏了一個呢?
如果你想學習前端,可以來這個Q群,首先是291,中間是851,最後是189,裏麵可以學習和交流,也有資料可以下載。
CAS
SSO 僅僅是一種架構,一種設計,而 CAS 則是實現 SSO 的一種手段。兩者是抽象與具體的關係。當然,除了 CAS 之外,實現 SSO 還有其他手段,比如簡單的 cookie。CAS (Central Authentication Service)中心授權服務,本身是一個開源協議,分為 1.0 版本和 2.0 版本。1.0 稱為基礎模式,2.0稱為代理模式,適用於存在非 Web 應用之間的單點登錄。
同域 SSO如圖,同域 SSO 是最簡單的一種情況。此時,兩個產品都是在一個域名下,單點登錄是很自然的選擇。我們來捋一捋步驟,搞清楚這裏的步驟是理解後文的基礎,千萬不要跳過。
用戶訪問產品 a,向 後台服務器發送登錄請求。
登錄認證成功,服務器把用戶的登錄信息寫入 session。
服務器為該用戶生成一個 cookie,並加入到 response header 中,隨著請求返回而寫入瀏覽器。
該 cookie 的域設定為 dxy.cn。
下一次,當用戶訪問同域名的產品 b 時,由於 a 和 b 在同一域名下,也是 dxy.cn,瀏覽器會自動帶上之前的 cookie。此時後台服務器就可以通過該 cookie 來驗證登錄狀態了。
實際上,這種場景就是最簡單最傳統的登錄操作。雖然我們把產品 a 和 b 人為分開了,但由於它們在同域上,就算看成是同一產品的不同類目也未嚐不可。我們沒有設置獨立的 SSO 服務器,因為業務後台服務器本身就足以承擔 SSO 的職能。
同父域 SSO
同父域 SSO 是同域 SSO 的簡單升級,唯一的不同在於,服務器在返回 cookie 的時候,要把cookie 的 domain 設置為其父域。比如兩個產品的地址分別為 a.dxy.cn 和 b.dxy.cn,那麼 cookie 的域設置為 dxy.cn 即可。在訪問 a 和 b 時,這個 cookie 都能發送到服務器,本質上和同域 SSO 沒有區別。
.跨域 SSO
可以看到,在上麵兩種情況下,我們都沒有專門設置 SSO 服務器。但是當兩個產品不同域時,cookie 無法共享,所以我們必須設置獨立的 SSO 服務器了。這個時候,我們就是通過標準的 CAS 方案來實現 SSO 的。
詳解CAS
CAS 1.0 協議定義了一組術語,一組票據,一組接口。
術語:
Client:用戶。
Server:中心服務器,也是 SSO 中負責單點登錄的服務器。
Service:需要使用單點登錄的各個服務,相當於上文中的產品 a/b。
/login:登錄接口,用於登錄到中心服務器。
/logout:登出接口,用於從中心服務器登出。
/validate:用於驗證用戶是否登錄中心服務器。
/serviceValidate:用於讓各個 service 驗證用戶是否登錄中心服務器。
最後更新:2017-11-09 09:33:41