單點登入實現原理(SSO)
簡介
單點登入是在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統的保護資源,若使用者在某個應用系統中進行登出登入,所有的應用系統都不能再直接訪問保護資源,像一些知名的大型網站,如:淘寶與天貓、新浪微博與新浪部落格等都用到了這個技術。
原理
單點登入
有一個獨立的認證中心,只有認證中心才能接受使用者的使用者名稱和密碼等資訊進行認證,其他系統不提供登入入口,只接受認證中心的間接授權。間接授權通過令牌實現,當用戶提供的使用者名稱和密碼通過認證中心認證後,認證中心會建立授權令牌,在接下來的跳轉過程中,授權令牌作為引數傳送給各個子系統,子系統拿到令牌即得到了授權,然後建立區域性會話。
示例:
下面對上圖進行解釋:
-
當用戶還沒進行使用者登入的時候
-
使用者去訪問系統1的保護資源 ,系統1檢測到使用者還沒登入,跳轉至SSO認證中心,SSO認證中心也發現使用者沒有登入,就跳轉到使用者至認證中心的登入頁面
-
使用者在登入頁面提交使用者相應資訊後,認證中心會校驗使用者資訊,如果使用者資訊正確的話認證中心就會建立與該使用者的全域性會話(全域性會話過期的時候,使用者就需要重新登入了。全域性會話中存的資訊可能有令牌,使用者資訊,及該在各個系統的一些情況),同時建立授權令牌,然後進行下一步,否則認證中心給出提示(使用者資訊有誤),待使用者再次點選登入的時候,再一次進行校驗使用者資訊
-
認證中心帶著令牌跳轉到使用者最初請求的地址(系統1),系統1拿到令牌後去SSO認證中心校驗令牌是否有效,SSO認證中心校驗令牌,若該令牌有效則進行下一步
-
註冊系統1,然後系統1使用該令牌建立和使用者的區域性會話(若區域性會話過期,跳轉至SSO認證中心,SSO認證中心發現使用者已經登入,然後執行第3步),返回受保護資源
-
-
使用者已經通過認證中心的認證後
- 使用者訪問系統2的保護資源,系統2發現使用者未登入,跳轉至SSO認證中心,SSO認證中心發現使用者已經登入,就會帶著令牌跳轉回系統2,系統2拿到令牌後去SSO認證中心校驗令牌是否有效,SSO認證中心返回有效,註冊系統2,系統2使用該令牌建立與使用者的區域性會話,返回受保護資源。
-
如果系統1的區域性會話存在的話,當用戶去訪問系統1的保護資源時,就直接返回保護資源,不需要去認證中心驗證了
區域性會話存在,全域性會話一定存在;全域性會話存在,區域性會話不一定存在;全域性會話銷燬,區域性會話必須銷燬 如果在校驗令牌過程中發現客戶端令牌和伺服器端令牌不一致或者令牌過期的話,則使用者之前的登入就過期了,使用者需要重新登入
關於令牌可參考:基於跨域單點登入令牌的設計與實現
單點登出
-
在一個子系統中登出,全域性會話也會被登出,所有子系統的會話都會被登出
-
示例:
使用者向系統1發出登出請求,系統1根據使用者與系統1建立的會話id從會話中拿到令牌,向SSO認證中心發起登出請求,認證中心校驗令牌有效,會銷燬全域性會話,同時取出此令牌註冊的系統地址,認證中心向所有註冊系統發出登出請求,各系統收到登出請求後銷燬區域性會話,認證中心引導使用者跳轉值登入頁面。
- 整體陳述
- 單點登入涉及SSO認證中心與多個子系統,子系統與SSO認證中心需要通訊(交換令牌、校驗令牌及發起登出請求等),子系統中包含SSO的客戶端,SSO認證中心是服務端
- 認證中心與客戶端通訊可通過 httpClient、web service、rpc、restful api(url是其中一種) 等實現
- 客戶端與伺服器端的功能
- 客戶端:
- 攔截子系統未登入使用者請求,跳轉至sso認證中心
- 接收並存儲sso認證中心傳送的令牌
- 與伺服器端通訊,校驗令牌的有效性
- 建立區域性會話
- 攔截使用者登出請求,向sso認證中心傳送登出請求
- 接收sso認證中心發出的登出請求,銷燬區域性會話
- 伺服器端:
- 驗證使用者的登入資訊
- 建立全域性會話
- 建立授權令牌
- 與客戶端通訊傳送令牌
- 校驗客戶端令牌有效性
- 系統註冊
- 接收客戶端登出請求,登出所有會話
- 客戶端: