最強SSO單點登入教程(三)單點登出流程分析

weixin_34146805發表於2018-04-21

作者:藍雄威,叩丁狼教育高階講師。原創文章,轉載請註明出處。

一、前言

單點登入自然也要單點登出,在一個子系統中登出,所有子系統的會話都將被銷燬,用下面的圖來說明:


5815733-827fea6934257777.png
單點登出流程

步驟分析:
1.使用者在CRM系統中點選登出按鈕.會重定向到統一認證中心的登出方法
2.統一認證中心接受到登出請求之後,會銷燬全域性的會話.
3.統一認證中心會拿到之前在該系統中註冊的子系統集合.
4.依次的呼叫子系統的登出方法,銷燬區域性會話.
5.每個系統中的會話都已經銷燬之後,跳轉到登陸頁面.

二、系統中的Cookie和Session儲存圖解

以下圖解是基於單點登入圖解,在之前的基礎上,新增一些資訊來幫我們更好的完成單點登出的功能.

圖01:我們在統一認證中心登入成功後.除了需要做這幾件事情.
1.建立令牌,後續操作中得發給子系統,相當於間接授權.
2.建立全域性會話,並把令牌儲存到全域性會話中.
3.把令牌資訊儲存到資料庫中的t_token表中.主要是後續客戶端校驗token的有效性需要查詢這種表.
4.重定向到之前使用者請求的地址redirectUrl.並把令牌發給該子系統.http://www.crm.com/employee?token=VcnVMguCDWJX5zHa

還需要建立一張t_client_info資訊
這張表儲存的是究竟有哪些子系統在統一認證中心註冊了.
在單點登入的時候拿到註冊子系統的集合,依次呼叫子系統的登出方法.

5815733-96e4946fa0eba450.jpg
單點登出01

圖02:我們在CRM系統給統一認證中心傳送一個校驗令牌token有效性的請求的時候.
除了帶上令牌token資訊之外.還需要帶上如下資訊:
1.客戶端的登出地址:http://www.crm.com/logout
2.客戶端的JSESSIONID(目的是在呼叫客戶端銷燬方法的時候能找到對應的會話並銷燬)

所以此時請求的地址為:
http://www.sso.com/verify?token=VcnVMguCDWJX5zHa&clientUrl=http://www.crm.com/logout&JSESSIONID=F4C441B40D00A03DD8DDEBF751F2BF01

5815733-5b3a771db5b695f1.jpg
單點登出02

圖03:當兩個系統都已經在統一認證中心註冊好之後,資料庫表t_token中儲存的資訊如下圖所示.

5815733-90342990ea485d48.jpg
單點登出03

圖04:我們在CRM系統中點選登出按鈕,這個登出按鈕的地址其實指向
http://www.sso.com/logout,訪問的是統一認證中心的登出方法.

5815733-ae8d395edcc90ac7.jpg
單點登出04

圖05:瀏覽器發出請求http://www.sso.com/logout,瀏覽器會根據請求的域名找到本地的sso.com目錄cookie,並把cookie裡面的資訊一併帶到伺服器.d
通過cookie中的JSESSION可以找到統一認證中心的會話物件.

5815733-ffda864df212cdfc.jpg
單點登出05

圖06:拿到統一認證中心的會話物件之後
1.取出會話中的令牌資訊token,通過令牌資訊在表t_clinet_info中找到之前註冊的子系統集合.
2.遍歷子系統集合,依次呼叫子系統的登出方法,並把JSESSIONID帶上.

5815733-66130cbf4cbb139a.jpg
單點登出06

圖07:子系統接受到請求之後,根據JSESSIONID找到對應的會話物件進行銷燬.

5815733-9162c2f62c0028d9.jpg
單點登出07

圖08:需要把令牌資訊從資料庫中刪除.

5815733-fca64be5867dc82b.jpg
單點登出08

圖09:清除全域性會話物件.

5815733-2c5fb6a0a4fcd2ca.jpg
單點登出09

圖10:響應統一認證中心的登陸頁面

5815733-43090f84f85710a0.jpg
單點登出10

統一認證中心與客戶端通訊方式有多種,這裡以簡單好用的HttpURLConnection為例,WebService、rpc、restful api都可以.

807144-a604848f81d1fbc3.jpeg
WechatIMG7.jpeg

相關文章