上海網(wǎng)站制作公司的排名免費seo教程分享
關(guān)于其他前端常見登錄實現(xiàn)+單點登錄方案,請見「前端常見登錄實現(xiàn)方案 + 單點登錄方案
」
前沿
單點登錄(SSO),英文全稱為 Single Sign On。 SSO 是指在多個應(yīng)用系統(tǒng)中,用戶只需要登錄一次,就可以訪問所有相互信任的應(yīng)用系統(tǒng)。
一般同域的SSO,用共享session就可以實現(xiàn)了,常見于各微服務(wù)都是自己開發(fā)的情況。更普遍的場景是跨域集成的SSO,這時候一般采用標(biāo)準(zhǔn)的CAS方案。
IDP SSO 服務(wù)用于解決同一公司不同業(yè)務(wù)應(yīng)用之間的身份認(rèn)證問題,只需要登錄一次,即可訪問所有添加的應(yīng)用。此服務(wù)可以涵蓋用戶在公有云和私有云中的雙重需求。
幾個名詞
-
TGT: (Ticket Granting Ticket)這是CAS Server里保存的,用于認(rèn)證用戶已經(jīng)在CAS登錄過
-
TGC: (Ticket Granting Cookie)跟上面的TGT對應(yīng),是已經(jīng)認(rèn)證過的用戶在瀏覽器里保存的cookie
-
ST: (Service Ticket)這是CAS Server發(fā)給應(yīng)用服務(wù)器的憑證,應(yīng)用服務(wù)器再用ST到CAS Server認(rèn)證
-
Authentication: 【認(rèn)證】即確認(rèn)該用戶的身份是他所聲明的那個人
-
Authorization:【授權(quán)】即根據(jù)用戶身份授予他訪問特定資源的權(quán)限
CAS認(rèn)證
Central Authentication Service簡稱CAS,是一種常見的B/S架構(gòu)的SSO協(xié)議。和其他任何SSO協(xié)議一樣,用戶僅需登陸一次,訪問其他應(yīng)用則無需再次登陸。
CAS是一種僅用于Authentication【認(rèn)證】的服務(wù),它和OAuth/OIDC協(xié)議不一樣,并不能作為一種Authorization【授權(quán)】的協(xié)議。
當(dāng)前CAS協(xié)議包括CAS 1.0、CAS2.0、CAS3.0版本,這三個版本的認(rèn)證流程基本類似。
👇 下面一個標(biāo)準(zhǔn)的CAS認(rèn)證流程圖:
大致流程:
當(dāng)用戶請求應(yīng)用服務(wù)器提供的某個服務(wù)abc,如果沒有登錄過,那么會返回一個302,跳轉(zhuǎn)到 cas/login?service=abc,在CAS登錄后,又會302到abc?ticket=STxxxxx(這里abc就是前面service填的地址),應(yīng)用服務(wù)器用這個ticket到CAS Server認(rèn)證,如果OK的話,再一次302到abc,完成整個認(rèn)證過程
IDP 全流程(前后端分離的場景)
現(xiàn)在web應(yīng)用一般采用前后端分離的架構(gòu),通過ajax請求后端服務(wù),這樣會無法跳轉(zhuǎn)回原來的靜態(tài)頁面,需要對原有的CAS流程的稍加改造,下面是一個基于CAS實現(xiàn)的IDP系統(tǒng)的完整流程。
👇 應(yīng)用A 通過 IDP登錄
👆 闡述 IDP 發(fā)起的單點登錄流程:
- 用戶訪問應(yīng)用A頁面,如:http://a.com/item
- 應(yīng)用A向A后端請求接口,如:http://a.com/api/item
- A后端檢測登錄狀態(tài),若該用戶已登錄直接跳至步驟(15. 正常訪問),未登錄則返回狀態(tài)碼403&跳轉(zhuǎn)鏈接,如:http://idp.com
- 應(yīng)用A攜帶 target_url 重定向到 IDP 登錄頁面,如:http://idp.com?callback=a.com/item
- 用戶在IDP中輸入 IDP 的登錄手機(jī)號并請求驗證碼
- IDP前端向IDP后端服務(wù)請求驗證碼接口,如:http://idp.com/api/code
- IDP后端別用戶手機(jī)發(fā)送驗證碼
- 用戶填寫驗證碼,并登錄
- IDP前端向IDP后端服務(wù)請求登錄接口,如:http://idp.com/api/session
- IDP后端認(rèn)證通過后,會生成 TGC&ST,返回給IDP前端
- IDP前端 302 跳轉(zhuǎn)到應(yīng)用A頁面到 SSO URL 地址 redirect_uri并攜帶ST,如:http://a.com/item?st=xxx
- 應(yīng)用A頁面通過url中的st向應(yīng)用A后端去認(rèn)證登錄
- 應(yīng)用A后端再去IDP后端認(rèn)證登錄狀態(tài),如:http://idp.com/profile?st
- IDP后端認(rèn)證通過后,向應(yīng)用A后端返回用戶的信息
- 應(yīng)用A后端拿到用戶信息生成 Token并返回給應(yīng)用A前端保存
- 最終,用戶查看到之前訪問的應(yīng)用A前端,如:http://a.com/item
👇 IDP登錄成功,應(yīng)用B 通過 IDP直接登錄
👆 闡述IDP登錄成功,應(yīng)用B 通過 IDP直接單點登錄流程:
【大致步驟同應(yīng)用A 通過 IDP登錄,只是少了IDP登錄認(rèn)證的幾步】
- 用戶訪問應(yīng)用B頁面,如:http://b.com/item
- 應(yīng)用B向B后端請求接口,如:http://b.com/api/item
- B后端檢測登錄狀態(tài),若該用戶已登錄直接正常訪問,未登錄則返回狀態(tài)碼403&跳轉(zhuǎn)鏈接,如:http://idp.com
- 應(yīng)用B攜帶 target_url 重定向到 IDP 登錄頁面,如:http://idp.com?callback=b.com/item
- IDP前端通過session獲取TGC向IDP后端服務(wù)換取ST,IDP后端認(rèn)證通過后向IDP前端返回ST
- IDP前端 302 跳轉(zhuǎn)到應(yīng)用B頁面到 SSO URL 地址 redirect_uri并攜帶ST,如:http://b.com/item?st=xxx
- 應(yīng)用B頁面通過url中的st向應(yīng)用B后端去認(rèn)證登錄
- 應(yīng)用B后端再去IDP后端認(rèn)證登錄狀態(tài),如:http://idp.com/profile?st
- IDP后端認(rèn)證通過后,向應(yīng)用B后端返回用戶的信息
- 應(yīng)用B后端拿到用戶信息生成 Token并返回給應(yīng)用B前端保存
- 最終,用戶查看到之前訪問的應(yīng)用B前端,如:http://b.com/item
👇 應(yīng)用退出登錄,IDP退出,所有平臺都退出登錄
👆 闡述應(yīng)用退出登錄,IDP單點退出登錄流程:
- 用戶訪問應(yīng)用A頁面,點擊退出登錄,如:http://a.com/logout
- 應(yīng)用A向A后端請求退出登錄接口,如:http://a.com/api/logout
- A后端向IDP后端發(fā)送退出登錄請求,注銷全部TGC&ST
- IDP后端向所有應(yīng)用后端告知退出事件,如:http://a.com/callback、http://b.com/callback
小結(jié)
注意:我們需要對redirect_uri做部分定制并encoding
至此,基于CAS實現(xiàn)的前后端分離的SSO系統(tǒng)開發(fā)完畢。如果對流程有問題,歡迎大家討論