SSO系統

一、什麼是SSO系統?

單點登陸(SingleSignOn,SSO),就是經過用戶的一次性鑑別登陸。當用戶在身份認證服務器上登陸一次之後,便可得到訪問單點登陸系統中其餘關聯繫統和應用軟件的權限,同時這種實現是不須要管理員對用戶的登陸狀態或其餘信息進行修改的,這意味着在多個應用系統中,用戶只需一次登陸就能夠訪問全部相互信任的應用系統。前端

二、SSO系統實現原理?

這裏用一張圖說明sso流程
sso.pnggit

三、SSO系統實現?

假設zss系統前端域名爲zsstest.zuel.com:8081,後端域名爲zsstest.zuel.com:8887;sso系統前端域名爲sso.zuel.com:8082,後端域名爲sso.zuel.com:8888。咱們跟着原理流程圖來說解如何實現單點登陸。github

假設zss系統首頁zsstest.zuel.com:8081/index有一個/api/getUserinfo請求獲取用戶信息,當第一次用瀏覽器打開首頁時就發送了該請求,zss-os後端接收到該請求,發現請求沒有攜帶cookie身份(也就是token),返回401zss-fe前端,前端響應攔截器攔截到返回數據,發現返回數據爲401,因而重定向到sso的登陸頁(sso.zuel.com:8082/login),並把zss系統首頁做爲參數拼接到重定向地址的後面(window.location.href=http://sso.zuel.com:8082/login?service=http://zsstest.zuel.com:8081/index)。當登陸成功時,sso-os後端根據帳戶和時間生成token(使用jwt包),經過設置響應頭Set-Cookie屬性種下cookie,並把token存到redis集羣中,最後重定向到service參數urlredis

重定向到service參數url又會再次發送/api/getUserinfo請求,後端zss-os就會去校驗cookie身份(redis集羣中去找是否有該身份的token存在),若校驗合法,則返回請求結果,不然返回401又再次重定向到sso登陸頁。chrome

這裏使用redis集羣的目的是zss系統和sso系統均可以訪問到redis存儲的數據。後端

上面還有許多坑,在設置cookie時須要注意:api

  • 當前端配置withCredentials=true時, 後端配置Access-Control-Allow-Origin不能爲*, 必須是相應地址
  • 當配置withCredentials=true時, 後端需配置Access-Control-Allow-Credentials
  • 當前端配置請求頭時, 後端須要配置Access-Control-Allow-Headers爲對應的請求頭集合
  • 後端設置的set-cookie若想在瀏覽器cookie中顯示而且在前端請求頭自動攜帶,那麼設置cookiedomian就必須與前端當前頁域名、請求域名同樣。好比,上述domain設置爲.zuel.com,那麼zsstest.zuel.com:8081/index頁面的cookie將會顯示,zsstest.zuel.com:8887/api/getUserInfo請求頭也會自動攜帶domain域名的cookie
  • 只有name、path、domain相同的cookie纔是同一個cookie

參考:
https://juejin.im/post/5c2490...
https://juejin.im/post/5c0f2a...
https://juejin.im/post/59d1f5...瀏覽器

單點登陸的實現:
上面生成token使用了時間,也就是每次登陸成功生成的token都會不一樣,當用戶A使用chrome登入系統生成的tokent1redis存儲t1,瀏覽器cookie存儲t1,而後用戶A換個Firefox登陸,生成tokent2redis存儲t2,瀏覽器cookie存儲t2。當用戶Achrome刷新頁面,請求攜帶的cookie仍是t1,但redis存儲的cookie已經變成t2,因此身份驗證不會經過,頁面會重定向到sso登陸頁服務器

統一登錄實現效果:
sso (1).gifcookie

項目git地址

相關文章
相關標籤/搜索