打個比方,sso 和我們去迪士尼玩時購買的通票很像。
我們只要買一次通票,就可以玩所有遊樂場內的設施,而不需要在過山車或者摩天輪那裡重新買一次票。在這裡,買票就相當於登入認證,遊樂場就相當於使用一套 sso 的公司,各種遊樂設施就相當於公司的各個產品。
使用 sso 的優點很明顯:
就以我廠為例。我廠有兩個產品,丁香人才網和丁香園論壇,假如你是我廠使用者,肯定無法忍受登入丁香園論壇的時候輸入一次使用者名稱密碼,登入人才網又要輸入一次使用者名稱密碼吧?
假如你是我廠後端,每天任務都飽和的不行,肯定無法忍受到人才網開發一套登入邏輯,到論壇又開發一套登入邏輯吧?
假如你是我廠運維,發現了乙個安全隱患需要緊急修復。你肯定無法忍受給茫茫多的產品後端都發一封郵件,責令修復吧?萬一漏了乙個呢?
綜合看來,sso 不僅是有用的,而且是必要的。
cas (central authentication service)中心授權服務,本身是乙個開源協議,分為 1.0 版本和 2.0 版本。1.0 稱為基礎模式,2.0稱為**模式,適用於存在非 web 應用之間的單點登入。本文只涉及 cas 1.0,下文中將詳細介紹。
sso 的演進與分類
1.同域 sso
此時,兩個產品都是在乙個網域名稱下,單點登入是很自然的選擇。我們來捋一捋步驟,搞清楚這裡的步驟是理解後文的基礎,千萬不要跳過。
使用者訪問產品 a,向 後台伺服器傳送登入請求。
登入認證成功,伺服器把使用者的登入資訊寫入 session。
伺服器為該使用者生成乙個 cookie,並加入到 response header 中,隨著請求返回而寫入瀏覽器。該 cookie 的域設定為
。下一次,當使用者訪問同網域名稱的產品 b 時,由於 a 和 b 在同一網域名稱下,也是
,瀏覽器會自動帶上之前的 cookie。此時後台伺服器就可以通過該 cookie 來驗證登入狀態了。
實際上,這種場景就是最簡單最傳統的登入操作。雖然我們把產品 a 和 b 人為分開了,但由於它們在同域上,就算看成是同一產品的不同類目也未嘗不可。我們沒有設定獨立的 sso 伺服器,因為業務後台伺服器本身就足以承擔 sso 的職能。
2.同父域 sso
比如兩個產品的位址分別為
和 ,那麼 cookie 的域設定為
即可。在訪問 a 和 b 時,這個 cookie 都能傳送到伺服器,本質上和同域 sso 沒有區別。
3.跨域 sso
詳解cas
cas 1.0 協議定義了一組術語,一組票據,一組介面。
術語:介面:
票據tgt 是 cas 為使用者簽發的登入票據,擁有了 tgt,使用者就可以證明自己在 cas 成功登入過。tgt 封裝了 cookie 值以及此 cookie 值對應的使用者資訊。當 http 請求到來時,cas 以此 cookie 值(tgc)為 key 查詢快取中有無 tgt ,如果有的話,則相信使用者已登入過。
cas server 生成tgt放入自己的 session 中,而 tgc 就是這個 session 的唯一標識(sessionid),以 cookie 形式放到瀏覽器端,是 cas server 用來明確使用者身份的憑證。
st 是 cas 為使用者簽發的訪問某一 service 的票據。使用者訪問 service 時,service 發現使用者沒有 st,則要求使用者去 cas 獲取 st。使用者向 cas 發出獲取 st 的請求,cas 發現使用者有 tgt,則簽發乙個 st,返回給使用者。使用者拿著 st 去訪問 service,service 拿 st 去 cas 驗證,驗證通過後,允許使用者訪問資源。
票據之間的關係如下圖。注意,pgtiou, pgt, pt 是 cas 2.0 中的內容,感興趣的同學可以自行了解。
詳細步驟
開始!使用者訪問產品 a,網域名稱是
。由於使用者沒有攜帶在 a 伺服器上登入的 a cookie,所以 a 伺服器返回 http 重定向,重定向的 url 是 sso 伺服器的位址,同時 url 的 query 中通過引數指明登入成功後,回跳到 a 頁面。重定向的url 形如
。由於使用者沒有攜帶在 sso 伺服器上登入的 tgc(看上面,票據之一),所以 sso 伺服器判斷使用者未登入,給使用者顯示統一登入介面。使用者在 sso 的頁面上進行登入操作。
登入成功後,sso 伺服器構建使用者在 sso 登入的 tgt(又乙個票據),同時返回乙個 http 重定向。這裡注意:
如圖所示,至此,整個登入流程結束。之後當使用者訪問 a 或者 b 後,直接會攜帶 a cookie/b cookie,就不用再向 sso 確認了。
實際開發時,可以根據 cas 增加更多的判斷邏輯,比如,在收到cas server簽發的st後,如果 st 被 hacker 竊取,並且 client 本身沒來得及去驗證 st,被 hacker 搶先一步驗證 st,怎麼解決。此時就可以在申請 st 時新增額外驗證因子(如ip、sessionid等)
什麼是 SSO 與 CAS
打個比方,sso 和我們去迪士尼玩時購買的通票很像。我們只要買一次通票,就可以玩所有遊樂場內的設施,而不需要在過山車或者摩天輪那裡重新買一次票。在這裡,買票就相當於登入認證,遊樂場就相當於使用一套 sso 的公司,各種遊樂設施就相當於公司的各個產品。使用 sso 的優點很明顯 就以我廠為例。我廠有兩...
什麼是CAS機制
參考 cas是英文單詞compare and swap的縮寫,翻譯過來就是比較並替換。更新乙個變數的時候,只有當變數的預期值a和記憶體位址v當中的實際值相同時,才會將記憶體位址v對應的值修改為b。這樣說或許有些抽象,我們來看乙個例子 cas的缺點 1.cpu開銷較大 在併發量比較高的情況下,如果許多...
什麼是CAS單點登入
早上遇到別人說的cas單點登入問題,俺在一旁一頭霧水,就看了一下什麼是cas單點登入,由於度娘上基本沒有關於什麼cas單點登入,都是說怎麼部署的,所以寫一下這篇東西記錄一下個人理解。實現原理 我的理解,就是例如乙個使用者先進入乙個應用a,會先訪問cas伺服器,cas發現其沒登入就要求其登入,登入後,...