1. 程式人生 > >完全跨域下單點登入的一種解決方案

完全跨域下單點登入的一種解決方案

  根據oums單點登入解決方案介紹 一文我們知道單點登入有兩種模型,一種是共同父域下的單點登入(例如域名都是 xx.a.com),還有就是完全跨域下的單點登入(例如域名是xx.a.com,xx.b.com),本文我們講一下完全跨域下的單點登入該怎麼實現。
  基於安全考慮,想通過cookie來實現這個功能是不太可能的了(也許有其他黑科技可以實現,這裡不做討論)。這裡介紹的方案是參考shiro框架的跨域session共享方案來實現的。我們知道瀏覽器訪問系統的時候會生成一個session,那麼每次請求如何知道是來自同一個瀏覽器呢?是因為瀏覽器為每個域儲存了一個可以稱作為session的cookie

的東西,每次請求該域都會把對應的這個cookie帶上,然後伺服器根據這個cookie值去查詢對應的session。想要達到完全跨域的單點登入要滿足兩個條件:首先要讓session可以被所有系統都訪問到。其次要讓同一個瀏覽器下的想要實現跨域的所有系統都使用同一個session。第一個條件通過使用spring-session框架把session儲存在redis中,可以很容易實現。那麼第二個條件如何實現呢?答案就是想方法為每個域設定相同的session的cookie 。舉個例子,比如有a、b兩個站點域名分別是www.a.com,www.b.com,這兩個域名需要共享session,並且已b域名下的session為主,a登入時跳轉到b域進行登入,成功登入之後重定向到a時把sessionid帶上,a站點拿到sessionid之後回寫到瀏覽器覆蓋原來生成的session的cookie
。這是再次訪問a站點用的就是同一個session了。大概畫一個圖如下:
  這裡寫圖片描述
  上述方案可以實現完全跨域下的單點登入,但是存在一個很大的問題,就是安全問題!假如在第④步操作重定向回a站點時,請求連結被不法分子攔截到了,他拿著這個連結就可以直接訪問a站點了。
  
  安全問題解決方案如下圖:
  這裡寫圖片描述
  其實⑥、⑦兩步主要要解決的問題是,向b(認證伺服器)證明:“我是我,我不是不法分子”。至於SSL如何保證通訊安全性的這裡就不做描述了。