SSO登陸
一.SSO登陸流程(前後端不分離)
在sso登陸中有幾個重要的角色 : SSO伺服器 ,瀏覽器 , A伺服器(我們自己的伺服器)
前後端不分離的流程:
1.用戶請求目標頁面 ,伺服器校驗自己域下的cookie中是否有登陸憑證。
(在登陸中,各個域名下的cookie中存儲的token作為登陸憑證)
2.如果沒有登陸憑證,那麼用戶是未登錄的,這時伺服器需要記錄下當前的url(登陸回調後需要回到當前頁面)。記錄之前伺服器將鏈接重定向到sso登陸伺服器,並傳入回調地址
(回調地址是由伺服器提供的一個處理登陸之後流程的鏈接,在登陸之後一般需要將登陸憑證存在自己域名下的cookie中)。
3.SSO伺服器校驗當前用戶是否登陸,如果用戶已經登陸則直接跳轉到回調鏈接,否則讓用戶登陸
4.伺服器接受回調,在當前域下種入登陸憑證,並重定向一開始記錄的當前url
二.前後端分離的SSO
2.1 分離不分離的區別
前後端是否分離的區別在於,不分離的情況下後端可以控制瀏覽器的重定向操作,分離的情況下由於是ajax非同步請求後端無法控制瀏覽器的重定向。
2.2 如何解決差異帶來的問題
由於後端無法進行跳轉,那麼就需要將登陸的鏈接以數據的形式傳到前端,讓前端控制跳轉。
三.前後端分離SSO的跨域問題
由於前後端分離,可能前端和後端的處於不同的域下。默認情況下cookie是不共享的,也就說登陸回調後寫入cookie並不能再返回瀏覽器,因此這樣的登陸就是無效的。
如果解決跨域問題呢?
後端設置這些參數,具體每個參數的含義可以自己查詢前端在ajax調用的時候設置withcredentails true
四.更加複雜的情況
在這次的實際項目中,同一個頁面需要請求兩個域名,並且要在這兩個域名下保持賬戶的一致性。這裡暫且以A,B命名,在已經解決了跨域的情況下A/B只要在一個域名下進行了登陸操作,那麼登陸憑證會被帶入另一個域名下。
一切看起來很美好,但是由於實際場景中存在賬戶切換的問題,在A/B域名下都存在同名的cookie值(domain不一樣),一處的修改並不會覆蓋另一處 ,也就造成了賬戶不一致的情況。
最後我將B系統中的登陸憑證依賴全部清除,前端從A系統中獲取登陸憑證,並通過request param的形式 傳入登陸信息,從而避免了賬戶不一致的問題
推薦閱讀:
※前後端分離的情況下, 跨域問題有沒有好的解決方案?
※跨域的那些事兒
※iframe 完全跨域,就是不同域名不同伺服器之間的跨域?JS 如何做到