前端需要了解的SSO與CAS知識

茶花盛開發表於2017-11-09

不管是什麼公司,只要產品數量大於一個,那麼單點登入勢必是繞不過去的一個問題。作為前端程式設計師,我們對其雖然接觸不多,但適當的瞭解還是必要的。本文就來談談單點登入相關的問題。 
前置知識 
瞭解 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 驗證使用者是否登入中心伺服器。 


相關文章