周末沒出門,熬了兩個夜整理代碼、打磨圖示,給大家奉上本文。敢說最準確,因為:1. 我嚴格對照所畫時序圖的每個步驟,開發了完整的跨域單點登錄範例;2. 所有服務端步驟,都在代碼中逐一標註,跟蹤代碼就能兩相對照,實際的深入理解流程;3. SSO核心在寫Cookie、URL傳參策略,其參與對象多、邏輯分支... ...
寫第一篇博客《手把手教做單點登錄(SSO)系列之一:概述與示例》,就獲得了園子里朋友們熱情的評論和推薦,感謝各位。
我那篇文章同時發了CSDN和博客園。對比一下,更感受到博客園童鞋們的技術交流熱情:這篇文章在CSDN也有幾百閱讀量了,但評論區還靜悄悄的。博客園才幾天就有四十多個回覆、二十多位童鞋推薦了。
深受鼓舞,周末沒出門,熬了兩個夜打磨圖示、整理代碼,給大家奉上本文。
完整的代碼範例已完成,因和本文時序圖嚴格對照,註釋整理還需要一些工作,完成後將在下一篇放出。大家下載配置後,本地跑起來會是圖一動畫所示的運行效果,敬請期待。
敢說最準確,因為:
我嚴格對照所畫時序圖的每個步驟,開發了完整的跨域單點登錄範例;
時序圖繪出的所有服務端步驟,都在代碼中逐一標註對應,跟蹤調試代碼就能兩相對照,深入理解流程;
跨域Web SSO的核心在於寫cookie、URL傳參策略。其參與對象多、邏輯分支繁雜也難倒很多人。所見的其它教程圖示往往對cookie和傳參語焉不詳,讓人初看簡單明瞭、細想很困惑。我做的時序圖詳細展現了這些關鍵細節。
話不多說,先上圖吧。
1. 示例運行效果圖:
圖一 百寶門跨域Web SSO方案演示
2. 跨域Web SSO時序圖。會比其它教程暴露更多比較重要的細節,沒基礎初看可能會暈。請先讀完下麵的知識點講解,再回頭理解本圖,尤其是註意各個URL傳參、以及寫cookie的動作。
該圖也將作為跨域Web SSO原理的核心,在後繼相關文章中反覆引用到。
圖二 跨域Web SSO時序圖。包含cookie、URL具體跳轉策略。是透徹理解和掌握跨域Web SSO的核心。
3. 代碼截圖。代碼邏輯嚴格和時序圖對應,在註釋中標明瞭對應的步驟編號:
圖三 範例代碼。和時序圖逐一對應標註
4 幾個基本概念
4.1 什麼是跨域Web SSO。
功能變數名稱通過“.”號切分後,從右往左看,不包含“.”的是頂級功能變數名稱,包含一個“.”的是一級功能變數名稱,包含兩個“.”的是二級功能變數名稱,以此類推。
例如對網址http://www.cnblogs.com/baibaomen,功能變數名稱部分是www.cnblogs.com。用“.”拆分後從右往左看:
”com”不包含“.”,是頂級功能變數名稱; “cnblogs.com”包含一個“.”,是一級功能變數名稱;www.cnblogs.com包含兩個“.”,是二級功能變數名稱。
跨域Web SSO指的是針對Web站點,各級功能變數名稱不同都能處理的SSO方案。
4.2 瀏覽器讀寫cookie的安全性限制:一級或頂級功能變數名稱不同的網站,無法讀到彼此寫的cookie。
所以baidu.com無法讀到cnblogs.com寫的cookie。
一級功能變數名稱相同,只是二級或更高級功能變數名稱不同的站點,可以通過設置domain參數共用cookie讀寫。這種場景可以選擇不跨域的SSO方案。
功能變數名稱相同,只是https和http協議不同的URL,預設cookie可以共用。知道這一點對處理SSO服務中心要登出
4.3 http協議是無狀態協議。瀏覽器訪問伺服器時,要讓伺服器知道你是誰,只有兩種方式:
方式一:把“你是誰”寫入cookie。它會隨每次HTTP請求帶到服務端;
方式二:在URL、表單數據中帶上你的用戶信息(也可能在HTTP頭部)。這種方式依賴於從特定的網頁入口進入,因為只有走特定的入口,才有機會拼裝出相應的信息,提交到服務端。
大部分SSO需求都希望不依賴特定的網頁入口(集成門戶除外),所以後一種方式有局限性。適應性強的方式是第一種,即在瀏覽器通過cookie保存用戶信息相關憑據,隨每次請求傳遞到服務端。本文的方案是第一種。
5 本單點登錄的應用場景涉及的站點和頁面
5.1 SSO服務站點,圖中是sso.baibaomen.com;
5.2 集成SSO的子站點一。圖中是java-client.net;
5.3 集成SSO的子站點二。圖中是php-client.cn;
5.4 SSO服務站點有登錄/註銷頁面login.html,以及基於.NET的幾個handler:sso/login/validate/logout。
為了說清楚在各子站點首次訪問和後繼訪問的單點登錄流程,分別做了兩個需登錄訪問的頁面:
java-client.net的兩個頁面是auth-required.jsp和auth-required2.jsp;php-client.cn的兩個頁面是auth-required.php和auth-required2.php。
6 重點理解:單點登錄的核心步驟描述
本節是幫助各位速掌握單點登錄的核心步驟。為避免過多信息干擾理解,略去了非主幹的細節。為透徹把握細節,請在理解本節後,再仔細對照學習SSO時序圖。
6.1 用戶未登錄時訪問子站一,子站一伺服器檢測到用戶沒登錄(沒有本站session,因為沒傳過來session對應cookie),於是通知瀏覽器跳轉到SSO服務站點,併在跳轉的URL參數中帶上當前頁面地址,以便登錄後自動跳轉回本頁。
6.2 SSO服務站點檢測到用戶沒有登錄,於是顯示登錄界面。
用戶提交登錄請求到服務端,服務端驗證通過,創建和賬號對應的用戶登錄憑據(token)。
然後,服務端通知瀏覽器把該token作為SSO服務站點的cookie存儲起來,並跳轉回子站一,跳回子站一的URL參數中會帶上這個token。
6.3 瀏覽器在寫SSO服務站點cookie後,跳轉回子站一。
子站一服務端檢測到瀏覽器請求的URL中帶了單點登錄的token,於是把這個token發到SSO服務站點驗證。
SSO服務端站點拿token解密出用戶賬號,把賬號信息中允許子站一訪問的部分返回給子站一。
子站一根據返回的信息生成用戶在本站的會話,把會話對應cookie寫入瀏覽器,從而完成在本站的登入以及會話保持。之後用戶訪問再子站一時,都會帶上這個cookie,從而保持在本站的登錄狀態。
6.4 用戶再訪問子站二。子站二伺服器檢測到用戶沒登錄,於是通知瀏覽器跳轉到SSO服務站點。
6.5 瀏覽器訪問SSO服務站點時會帶上上述6.2環節創建的token這個cookie。SSO服務站點根據該token能找到對應用戶,於是通知瀏覽器跳轉回子站二,併在跳轉回去的URL參數中帶上這個token。
6.6 子站二服務端檢測到瀏覽器請求的URL中帶上了單點登錄的token,於是又會走上述6.3對應步驟,完成用戶在本站的自動登錄。
單點登出的流程,將在下篇完整代碼實例中,一併講解。
為方便大家討論交流,除了時序圖,本文各章節也作了詳細編號。有疑問的童鞋,請儘可能在回覆中包含有疑問部分的編號,這樣可以快速定位。
外站轉載,請註明原文地址:http://www.cnblogs.com/baibaomen/p/sso-sequence-chart.html