一家公司有多個產品線,就可能要有多個子域名,下頭以baidu域名為例,a.baidu.com, b.baidu.com。com 是頂級域名,baidu 就是一個二級域名,a和b就是子域名。
當用戶在a產品線上登錄了系統,此時切換到b產品,為了增加用戶體驗,不必再讓用戶登錄一次b。所以單點登錄就出來了。
一般的實現就是增加一個passport.baidu.com,專門搞登錄的中控服務。
當用戶第一次登錄 baidu域下,比如a產品。此時先跳轉到passport下進行登錄,登錄成功以后,passport生成一個token,在session服務中插入登錄信息,同時也將其種在cookie里,就放在 .baidu.com域下,當然這個token會和session中的登錄信息有聯系。
當用戶登錄b產品線時,檢測cookie下這個token在passport的session服務中是否存在,如果存在就認為該用戶已經登錄過在線狀態。
還有一種需要面對的情況,比如公司還有一個二級域名,舉例 hao123.com,這下二級域名不一樣了。跨域了,cookie就不能被passport直接拿到了。這怎么辦呢?
可以這樣處理,當用戶第一次在passport下登錄時,生成的這個token, 在passport下跨域去請求 hao123.com,讓 hao123.com服務去把這個token種在自己域下cookie里。當用戶登錄成功 a產品以后,隨后去訪問了 hao123.com, hao123.com 域下的token被passport的session服務檢測,發現ok,就返回給 hao123.com帳號信息。
以上的實現很容易當然也很粗糙,比如某一個產品線下用戶的cookie被盜了,這個token被人用了,這個人就可以隨意使用你的帳號在xxx下所有產品線瀏覽。
這就需要更安全的機制。各個產品線也有各自的token生成。
可以用瀏覽器觀察下登錄百度passport的現象:
chrome瀏覽器登錄(在登錄passport時,勾選保存log,避免請求日志刷新沒了。搜索hao123關鍵字)。
發現這個跨域請求是利用圖片的src屬性,請求hao123站點。把加密的token發到hao123,hao123響應,setcookie把token放到hao123域下。(這里說的token即是百度的bduss)。