微信公衆號:[前端一鍋煮]
一點技術、一點思考。問題或建議,請公衆號留言。
單點登陸(Single Sign On, SSO)是指在同一賬號平臺下的多個應用系統中,用戶只需登陸一次,便可訪問全部相互信任的應用系統。舉例來講,百度貼吧和百度地圖是百度公司旗下的兩個不一樣的應用系統,若是用戶在百度貼吧登陸過以後,當他訪問百度地圖時無需再次登陸,那麼就說明百度貼吧和百度地圖之間實現了單點登陸。前端
單點登陸的本質就是在多個應用系統中共享登陸狀態。先後端分離項目中前端第一次登錄後會把登陸憑證 Token 保存在本地瀏覽器,如今就要實現一個瀏覽器同時打開三個網站,一個網站登陸了,另外兩個也同時有登陸狀態。後端
Cookie 有一個特色,即父域中的 Cookie 被子域所共享,換言之,子域會自動繼承父域中的 Cookie。跨域
利用 Cookie 的這個特色,咱們將 Cookie 的 domain 屬性設置爲父域的域名(主域名),同時將 Cookie 的 path 屬性設置爲根路徑,這樣全部的子域應用就均可以訪問到這個 Cookie 了。不過這要求應用系統的域名需創建在一個共同的主域名之下,如 tieba.baidu.com 和 map.baidu.com,它們都創建在 baidu.com 這個主域名之下,那麼它們就能夠經過這種方式來實現單點登陸。瀏覽器
總結:此種實現方式比較簡單,但不支持跨主域名。微信
咱們能夠部署一個認證中心,認證中心就是一個專門負責處理登陸請求的獨立 Web 服務。cookie
用戶統一在認證中心進行登陸,登陸成功後,認證中心記錄用戶的登陸狀態,並將 Token 寫入 Cookie。(注意這個 Cookie 是認證中心的,應用系統是訪問不到的。)前後端分離
應用系統檢查當前請求有沒有 Token,若是沒有,說明用戶在當前系統中還沒有登陸,那麼就將頁面跳轉至認證中心。因爲這個操做會將認證中心的 Cookie 自動帶過去,所以,認證中心可以根據 Cookie 知道用戶是否已經登陸過了。若是認證中心發現用戶還沒有登陸,則返回登陸頁面,等待用戶登陸,若是發現用戶已經登陸過了,就不會讓用戶再次登陸了,而是會跳轉回目標 URL ,並在跳轉前生成一個 Token,拼接在目標 URL 的後面,回傳給目標應用系統。dom
應用系統拿到 Token 以後,還須要向認證中心確認下 Token 的合法性,防止用戶僞造。確認無誤後,應用系統記錄用戶的登陸狀態,並將 Token 寫入 Cookie,而後給本次訪問放行。(注意這個 Cookie 是當前應用系統的,其餘應用系統是訪問不到的。)當用戶再次訪問當前應用系統時,就會自動帶上這個 Token,應用系統驗證 Token 發現用戶已登陸,因而就不會有認證中心什麼事了。網站
實現過程:繼承
總結:此種實現方式相對複雜,支持跨域,擴展性好,是單點登陸的標準作法。