OAuth
認證是爲了作到第三方應用在未獲取到用戶敏感信息(如:帳號密碼、用戶PIN等)的狀況下,能讓用戶受權予他來訪問開放平臺(主要訪問平臺中的資源服務器Resource Server
)中的資源接口。
其流程主要是:html
用戶首先要保持登陸,即已認證經過的狀態瀏覽器
第三方應用請求用戶受權(我理解是彈出一個顯示的操做界面讓用戶確認給第三方受權)服務器
用戶受權成功以後會向Authorization Server
(認證服務器)請求「受權碼」(指authorization_code
而不是最終的access_token
),請求中還會攜帶redirect_uri
(跳轉至第三方應用的連接)session
得到「受權碼」以後用戶所在的瀏覽器網頁將跳轉到redirect_uri
(即第三方應用)加密
第三方應用攜帶「受權碼」和應用認證信息(client_id
& client_secret
)到Authorization Server
換取access_token
url
第三方應用就能夠在訪問開放平臺時帶上access_token
code
單點登陸是指用戶在某個應用系統上登陸以後,進入其子應用或相關應用系統能夠免去登陸步驟,從而實現一次登陸,處處操做。此次項目我所負責的正好是單點登陸功能模塊,因此來更新下實際項目中SSO
的實現流程,咱們要實現的效果是,如今有業務服務器a.com
和b.com
,還有SSO
服務器sso.com
,在a.com
上完成登陸操做以後訪問b.com
時是已登陸狀態。htm
用戶首次訪問a.com/user
時,到a.com
服務器獲取不到session
token
給用戶彈出一個SSO
的登陸頁面sso.com/login.html
,這個頁面會帶上兩個參數,分別是開發者平臺映射值key
(即某個業務服務器在SSO
所映射的key
)和回調地址redirect
(即登陸成功以後跳轉到的url
,通常是所發起業務服務器開放的路由)接口
用戶輸入帳號密碼以後到SSO
服務器上進行身份校驗,若校驗成功則給用戶生成一個ticket
,並將該ticket
值及用戶基本信息一塊兒建立SSO
服務器session
選擇某種加密方式對該請求的session
進行加密以後生成一個token
值,而後在回調地址redirect
裏帶上token
參數並跳轉回去a.com
服務器
a.com
對toke
n參數進行解析後拿到用戶基本信息和ticket
值,相應地初始化本地session
並將ticket
值也記錄下來
用戶再次訪問a.com/user
或其餘頁面的時候,到a.com
上獲取session
併到sso.com
上校驗ticket
值得有效性,兩個操做都成功以後才返回用戶信息;若校驗ticket
值失敗,則從新要求用戶進行登陸操做,即從步驟1開始
如今用戶在a.com
上的登陸和訪問流程已完成,那這時用戶訪問b.com/user
,到b.com
上獲取不到session
,則會重定向到sso.com/session
,由於以前a.com
已在sso.com
上登陸過,故請求sso.com/session
的時候SSO
服務器能將session
中用戶信息和ticket
值返回給b.com
b.com
獲取到用戶信息和ticket
值以後和a.com
作相同的事情便可,這樣就完成了單點登陸的整個流程
單點登出則是指用戶只要在a.com
服務器上進行登出操做,則在其餘業務服務器如b.com
上也應處於未登陸狀態,單點登陸流程的步驟6中提到每次用戶訪問業務服務器路由檢驗用戶當前狀態時不單單查找本地有沒有session
,還要到SSO
服務器上校驗ticket
值的有效性,因此只要有一個業務服務器登出時令ticket
失效便可。
如今用戶是登陸狀態,他從a.com
進行了退出操做,則天然a.com
已將其session
清除
a.com
服務器同時還要攜帶ticket
值發請求到sso.com
將對應的記錄清除
當訪問某個b.com
某個頁面時,雖然在b.com
服務器上獲取到session
,此外還須要到SSO
服務器上校驗一遍ticket
值,而發現ticket
值校驗失敗,則會提示用戶當前處於未登陸狀態
這樣至關於b.com
也已是退出登陸,完成了單點登出的整個流程