跨域實現統一登入

2021-09-02 21:16:02 字數 1098 閱讀 1982

很多時候,如果沒有理解原理,做起事來會感覺無從下手、困難重重,一旦把原理想清楚了,做起來就會從容不迫。

切入正題:在相同網域名稱下實現統一認證單點登入比較簡單,基於cookie結合共享redis就可以輕鬆實現。在同乙個網域名稱下,不同的系統共享相同的cookie,認證中心可以將會話id(伺服器的sessionid或者自己頒發的token)存入cookie中,應用系統獲取到會話id後請求redis校驗登陸態即可。當然為了安全起見,一般應用系統不能直接訪問redis,由認證中心提供**介面**用系統呼叫獲取登入資訊,**介面可以完成安全檢查和白名單准入。

在跨域時,不同網域名稱之間不能共享cookie,造成了登陸態無法共享。為了解決cookie不能共享的問題,必須要想辦法將認證中心的會話id傳給跨域的第三方應用系統。假設認證中心所在網域名稱為a域,第三方應用系統所在網域名稱為b域,最好能直接把認證中心完成登陸認證的會話id寫在b網域名稱下的cookie中,這樣b網域名稱下的所有應用系統都可以共享登陸態。為了實現此目標,我們在a網域名稱的認證中心系統(或者另外提供乙個**系統)中提供乙個可以跨域訪問的url位址,b域下的系統使用ajax通過jsonp訪問此url位址,在訪問請求頭中refer會記錄b域資訊,url介面首先校驗訪問**是否合法,然後判斷a域下是否存在已登入的認證中心的伺服器會話id,如果使用者在認證中心完成登入認證,此url在返回資訊中提供認證中心的會話id,否則返回空值。ajax拿到會話id不為空時(為空就跳去認證中心做登入認證),傳遞給b域下的應用系統,系統後台通過認證中心提供的**介面獲取與會話id相關的登入資訊,如果拿到則認為使用者已登入,將使用者資訊返回給前端頁面並在b域下的cookie中寫入認證中心的會話id,如果拿不到則頁面跳轉至認證中心登入。此時b網域名稱下的cookie中已寫入認證中心的會話id,b域下的所有應用系統都可以實現單點登入會話共享了。以此類推,如果有c域、d域,都可以按此方式接入統一認證中心。

所以跨域實現統一登入態的核心在於:1、認證中心要提供乙個可跨域訪問的url介面;2、b域要能在自己的cookie中寫入已登入使用者的會話id;3、b域下的系統能通過後台訪問到a網域名稱下redis的**介面,即網路策略要通,否則無法校驗使用者是否真的登入了。

附圖如下:

匯入 跨域登入(一)

摘要 跨域登入是乙個比較煩人的事情,往往我們需要寫文章記錄下來,或者 或者拋磚引玉的問題,都是令人頭疼的。上次簡單得寫了一篇關於跨域登入的文章,只講了大體的實現過程。但是現在碰到了更大的問題,這篇文章將會介紹這個成敗,並 實現新方案的可行性。跨域登入需要一張通行證,也可以稱之為票據。就老衲現在知道和...

跨域視窗通訊,可實現跨域單點登入

目前比較主流的專案都是前後端分離的專案,此時會使用token來驗證使用者資訊。這時要想實現單點登入無非就是不同的 能擁有已經登入過 的token和一些使用者資訊,就可以實現不用再登入就能訪問頁面的功能。還是以a b和c 來舉例吧。c 作為 訊息的 需要實現監聽訊息,並且將訪問localstorage...

跨域 Cookie 實現單點登入

單點登入 sso single sign on 對於同乙個客戶端 例如 chrome 瀏覽器 只要登入了乙個子站 例如 a.com 則所有子站 b.com c.com 都認為已經登入。比如使用者在登入 後,跳轉到天貓時就已經登入了。未登入使用者訪問子站 a.com 進行登入,自動跳轉到賬戶中心的統一...