李 強(qiáng)
(中電金信軟件有限公司,浙江 杭州310000)
銀行的應(yīng)用系統(tǒng)越來(lái)越多,每個(gè)系統(tǒng)單獨(dú)管理各自的用戶,容易形成信息孤島,分散的用戶管理模式阻礙了銀行應(yīng)用向平臺(tái)化演進(jìn)。當(dāng)銀行的業(yè)務(wù)發(fā)展到一定規(guī)模,構(gòu)建統(tǒng)一的賬戶管理體系將是必不可少的,因?yàn)樗倾y行未來(lái)互聯(lián)網(wǎng)云平臺(tái)的重要基礎(chǔ)設(shè)施,能夠?yàn)槠脚_(tái)帶來(lái)統(tǒng)一的賬號(hào)管理、身份認(rèn)證和用戶授權(quán),為銀行帶來(lái)諸如跨系統(tǒng)單點(diǎn)登錄、第三方授權(quán)等基礎(chǔ)能力,為構(gòu)建開(kāi)放平臺(tái)和業(yè)務(wù)生態(tài)提供必要的條件。
常見(jiàn)的賬戶管理產(chǎn)品有:CA 公司的SiteMinder,其價(jià)格昂貴;IBM 公司的 Tivoli Access Manager,其需購(gòu)買且和 IBM 其他產(chǎn)品結(jié)合較緊密;Atlassian 公司的 Crowd,其需購(gòu)買且和自家的 Jira、Confluence 結(jié)合較緊密;Oracle 公司的OpenAM,它是一個(gè)率先開(kāi)源的認(rèn)證授權(quán)產(chǎn)品,對(duì)Oracle 的產(chǎn)品支持較好;耶魯太學(xué)發(fā)起的開(kāi)源項(xiàng)目CAS(Central Authentication Service),其簡(jiǎn)單、實(shí)效、安全,支持多種客戶端,支持單點(diǎn)登錄(Single Sign On,SSO)、開(kāi)放授權(quán)(Open Authorization,OAuth)等。
考慮到費(fèi)用、易用性、支持廣泛度等因素,本設(shè)計(jì)選擇了開(kāi)源產(chǎn)品CAS。
CAS 包含服務(wù)端和客戶端兩部分,服務(wù)端是一個(gè)獨(dú)立部署的WAR 包,負(fù)責(zé)用戶認(rèn)證。客戶端負(fù)責(zé)處理對(duì)受保護(hù)資源的訪問(wèn),支持 Java、.NET、PHP 等多種軟件平臺(tái),極太地方便了各種系統(tǒng)的接入[1]。
CAS 支持 SSO, 即用戶登錄一個(gè)系統(tǒng)后, 再訪問(wèn)權(quán)限范圍內(nèi)的其他系統(tǒng)時(shí)不用再次登錄[2-3]。 常見(jiàn)的如:用戶登錄淘寶網(wǎng)頁(yè)后,再訪問(wèn)天貓網(wǎng)頁(yè)時(shí)無(wú)需再次登錄即可使用。
OAuth 是實(shí)現(xiàn)第三方授權(quán)的開(kāi)放框架,在用戶無(wú)需提供賬號(hào)和密碼的情況下,允許第三方應(yīng)用訪問(wèn)用戶存于某服務(wù)商的資源(如個(gè)人信息、照片等)[4]。常見(jiàn)的如: 在微信中點(diǎn)擊某應(yīng)用后, 會(huì)被請(qǐng)求授權(quán),點(diǎn)擊授權(quán)后,可以在這個(gè)被授權(quán)應(yīng)用里看到自己的微信名稱、頭像等信息。 這就是被授權(quán)應(yīng)用訪問(wèn)了自己在微信里的數(shù)據(jù)。
OAuth 框架定義了四種角色[5],以微信授權(quán)為例:(1)資源所有者:指正在使用微信的用戶;(2)資源服務(wù)器:指微信保存用戶數(shù)據(jù)的服務(wù)器;(3)客戶端:指在微信里請(qǐng)求用戶授權(quán)的應(yīng)用;(4)授權(quán)服務(wù)器:用戶點(diǎn)擊授權(quán)后會(huì)轉(zhuǎn)到此服務(wù)器進(jìn)行授權(quán)。
CAS 支持 OAuth,其結(jié)合 OAuth,可簡(jiǎn)化客戶端的開(kāi)發(fā),提供標(biāo)準(zhǔn)的授權(quán)流程,支持 Web 應(yīng)用、桌面應(yīng)用、手機(jī)應(yīng)用。 CAS 使用 HTTP 進(jìn)行對(duì)接,支持各種軟件的接入[6]。
本文采用CAS+OAuth 的方案來(lái)實(shí)現(xiàn)銀行內(nèi)部和外部的統(tǒng)一認(rèn)證授權(quán),可以實(shí)現(xiàn)用戶的單點(diǎn)登錄,也可以為外部的第三方應(yīng)用授權(quán),從而使用外部的服務(wù)。
本設(shè)計(jì)的架構(gòu)圖如圖 1 所示,描述如下:(1)用戶訪問(wèn) Web 應(yīng)用、桌面應(yīng)用或手機(jī)應(yīng)用;(2)應(yīng)用服務(wù)器將用戶轉(zhuǎn)到 CAS 服務(wù)器;(3)CAS 服務(wù)器是獨(dú)立部署的,負(fù)責(zé)認(rèn)證授權(quán),它需要訪問(wèn)目錄服務(wù)器(LDAP)或數(shù)據(jù)庫(kù);(4)用戶在 CAS 服務(wù)器上完成認(rèn)證授權(quán)后,CAS 服務(wù)器將發(fā)放 SSO 票據(jù)或 OAuth 令牌給用戶;(5)用戶的后續(xù)訪問(wèn)會(huì)自動(dòng)攜帶票據(jù)或令牌來(lái)完成,避免了再次登錄授權(quán)。

圖1 架構(gòu)圖
TGT(Ticket Granting Ticket),代表了用戶的一次單點(diǎn)登錄會(huì)話[7]。
ST(Service Ticket),代表了 CAS 服務(wù)器對(duì)用戶在某應(yīng)用的一次授權(quán)[7]。
假設(shè)有兩個(gè)被保護(hù)的銀行內(nèi)部應(yīng)用:貸款系統(tǒng)和卡系統(tǒng),下面描述了用戶訪問(wèn)時(shí)是怎樣保護(hù)資源的。
3.1.1 第一次訪問(wèn)貸款系統(tǒng)
用戶第一次訪問(wèn)貸款系統(tǒng)時(shí),被轉(zhuǎn)到CAS 服務(wù)器去認(rèn)證。 用戶在 CAS 的登錄頁(yè)面輸入賬號(hào)和密碼后登錄成功。 CAS 服務(wù)器為用戶創(chuàng)建一個(gè)SSO會(huì)話,并把 TGT、ST 返回給用戶。 瀏覽器會(huì)把 TGT保存起來(lái),并攜帶 ST 去訪問(wèn)貸款系統(tǒng)。 貸款系統(tǒng)轉(zhuǎn)到CAS 服務(wù)器去驗(yàn)證ST,驗(yàn)證通過(guò)后,貸款系統(tǒng)為用戶創(chuàng)建貸款系統(tǒng)會(huì)話。 瀏覽器保存貸款系統(tǒng)會(huì)話,后續(xù)訪問(wèn)都會(huì)攜帶這個(gè)會(huì)話,貸款系統(tǒng)驗(yàn)證會(huì)話通過(guò)后,向用戶顯示訪問(wèn)的資源。 時(shí)序圖如圖2所示[7]。

圖2 第一次訪問(wèn)貸款系統(tǒng)的時(shí)序圖
3.1.2 第二次訪問(wèn)貸款系統(tǒng)
用戶第二次訪問(wèn)貸款系統(tǒng)時(shí),因?yàn)橐殉晒Φ卿涍^(guò), 所以瀏覽器會(huì)自動(dòng)攜帶貸款系統(tǒng)會(huì)話去訪問(wèn),貸款系統(tǒng)驗(yàn)證會(huì)話通過(guò)后,向用戶顯示訪問(wèn)的資源。時(shí)序圖如圖 3 所示[7]。

圖3 第二次訪問(wèn)貸款系統(tǒng)的時(shí)序圖
3.1.3 第一次訪問(wèn)卡系統(tǒng)
用戶第一次訪問(wèn)卡系統(tǒng),因?yàn)闆](méi)有登錄過(guò),所以瀏覽器自動(dòng)攜帶TGT 去CAS 做認(rèn)證,認(rèn)證通過(guò)后,CAS 服務(wù)器把 ST 返回給用戶。 瀏覽器會(huì)攜帶 ST 去訪問(wèn)卡系統(tǒng)。 卡系統(tǒng)轉(zhuǎn)到 CAS 服務(wù)器去驗(yàn)證 ST,驗(yàn)證通過(guò)后,卡系統(tǒng)為用戶創(chuàng)建卡系統(tǒng)會(huì)話。 瀏覽器保存卡系統(tǒng)會(huì)話,后續(xù)訪問(wèn)都會(huì)攜帶這個(gè)會(huì)話,卡系統(tǒng)驗(yàn)證會(huì)話通過(guò)后,向用戶顯示訪問(wèn)的資源,整個(gè)流程不會(huì)要求用戶再次登錄。 時(shí)序圖如圖4 所示[7]。
OAuth 框架里的安全機(jī)制是令牌。 應(yīng)用可以通過(guò)一個(gè)令牌在特定的時(shí)間段內(nèi)訪問(wèn)特定的資源[8]。
假設(shè)有個(gè)銀行外部的第三方交易系統(tǒng),它需要用戶在銀行的授權(quán)系統(tǒng)里登錄并對(duì)它授權(quán)后才能使用。
3.2.1 交易系統(tǒng)令牌訪問(wèn)
第三方交易系統(tǒng)首先向用戶請(qǐng)求授權(quán),用戶登錄銀行的授權(quán)系統(tǒng)并進(jìn)行授權(quán)后會(huì)發(fā)放授權(quán)許可,交易系統(tǒng)向CAS 服務(wù)器出示授權(quán)許可,并請(qǐng)求訪問(wèn)令牌。CAS 服務(wù)器校驗(yàn)授權(quán)許可通過(guò)后,發(fā)放訪問(wèn)令牌,交易系統(tǒng)憑令牌訪問(wèn)資源。 時(shí)序圖如圖5 所示[9]。
3.2.2 交易系統(tǒng)刷新令牌
令牌是有時(shí)效性的,當(dāng)其失效后,第三方交易系統(tǒng)需憑刷新令牌再次請(qǐng)求一個(gè)新的訪問(wèn)令牌。 時(shí)序圖如圖 6 所示[9]。

圖4 第一次訪問(wèn)卡系統(tǒng)的時(shí)序圖

圖5 第三方交易系統(tǒng)令牌訪問(wèn)的時(shí)序圖
4.1.1 運(yùn)行環(huán)境
為了完成單點(diǎn)登錄的驗(yàn)證,規(guī)劃了3 臺(tái)服務(wù)器,如圖 7 所示。 服務(wù)器全部預(yù)裝 CentOS 7[10],每臺(tái)安裝的軟件如表 1 所示[11-15]。

圖6 第三方交易系統(tǒng)刷新令牌的時(shí)序圖

圖7 單點(diǎn)登錄驗(yàn)證服務(wù)器設(shè)計(jì)

表1 單點(diǎn)登錄驗(yàn)證軟件清單
4.1.2 驗(yàn)證
(1)瀏覽器訪問(wèn) https://www.app1.com,因沒(méi)有登錄過(guò),所以會(huì)跳轉(zhuǎn)到圖8 所示的登錄頁(yè)面,并且地址變?yōu)?https://www.sso.com/cas/login?service=https-%3A%2F%2Fwww.app1.com%2F,從地址可知,這是由CAS 提供的登錄頁(yè)面。
(2)輸入用戶名和密碼登錄后,分析CAS 的日志可以看出它首先對(duì)用戶名和密碼進(jìn)行了認(rèn)證。
WHO:liqiang
WHAT:Supplied credentials:
[UsernamePasswordCredential(username=liqiang)]
ACTION:AUTHENTICATION_SUCCESS

圖8 單點(diǎn)登錄的登錄頁(yè)面
APPLICATION:CAS
(3)認(rèn)證通過(guò)后,CAS 服務(wù)器自動(dòng)創(chuàng)建了 Ticket Granting Ticket(TGT)。
WHO:liqiang
WHAT:
TGT-2-************************bo-47opiGacsso
ACTION:TICKET_GRANTING_TICKET_CREATED
APPLICATION:CAS
(4)緊接著 CAS 服務(wù)器又為 APP1 創(chuàng)建了 Service Ticket(ST)。
WHO:liqiang
WHAT:ST-3-BP9pvxb0-i-rwvrxQFQ8mn5py-wsso for
https://www.app1.com/
ACTION:SERVICE_TICKET_CREATED
APPLICATION:CAS
(5)CAS 服務(wù)器把 TGT 和 ST 返回給 APP1 服務(wù)器,APP1 服務(wù)器再次攜帶ST 到 CAS 服務(wù)器進(jìn)行校驗(yàn)。
WHO:liqiang
WHAT:ST-3-BP9pvxb0-i-rwvrxQFQ8mn5py-wsso
for https://www.app1.com/
ACTION:SERVICE_TICKET_VALIDATED
APPLICATION:CAS
(6)ST 校 驗(yàn) 通 過(guò) ,APP1 服務(wù)器顯示APP1 的歡迎頁(yè)面,如圖 9 所示。

圖9 單點(diǎn)登錄成功轉(zhuǎn)到APP1
(7)瀏覽器訪問(wèn) https://www.app2.com,因已登錄過(guò)APP1,TGT 已經(jīng)保存在瀏覽器緩存了,所以去CAS 認(rèn)證時(shí)會(huì)攜帶 TGT,又因?yàn)樵?TGT 是有效的,所以 CAS 會(huì)自動(dòng)為 APP2 創(chuàng)建 ST。
WHO:liqiang
WHAT:ST-4--1a-tB2GwHoxrcZwLGlKQ-46ET0sso
for https://www.app2.com/
ACTION:SERVICE_TICKET_CREATED
APPLICATION:CAS
(8)CAS 服務(wù)器把 ST 返回給 APP2 服務(wù)器后,APP2 服務(wù)器再次攜帶 ST 到 CAS 服務(wù)器進(jìn)行校驗(yàn)。
WHO:liqiang
WHAT:ST-4--1a-tB2GwHoxrcZwLGlKQ-46ET0sso
for https://www.app2.com/
ACTION:SERVICE_TICKET_VALIDATED
APPLICATION:CAS
(9)ST 校 驗(yàn) 通 過(guò) ,APP2 服務(wù)器顯示APP2 的歡迎頁(yè)面,如 圖 10 所 示 。 訪 問(wèn) APP2 的整個(gè)過(guò)程并沒(méi)有再要求用戶登錄。

圖10 直接進(jìn)入APP2
4.2.1 運(yùn)行環(huán)境
為了完成第三方授權(quán)的驗(yàn)證, 規(guī)劃了 2 臺(tái)服務(wù)器,如 圖 11 所 示。 服務(wù)器全部預(yù)裝 CentOS 7[10],每臺(tái)安裝的軟件如表2 所示[11-15]。

圖11 第三方授權(quán)驗(yàn)證服務(wù)器設(shè)計(jì)

表2 第三方授權(quán)驗(yàn)證軟件清單
4.2.2 驗(yàn)證
(1)瀏覽器訪問(wèn) https://www.app3.com,會(huì)顯示圖 12 所示頁(yè)面。

圖12 提示使用第三方賬號(hào)登錄
(2)點(diǎn)擊下方的“使用第三方賬號(hào)登錄”鏈接,會(huì)跳轉(zhuǎn)到如圖13 所示的登錄頁(yè)面,并且地址欄變?yōu)閔ttps://www.sso.com/cas/login?service=https%3A%2F%2Fwww.sso.com%2Fcas%2Foauth2.0%2Fcallback-Authorize%3Fclient_id%3Dots%26redirect_uri%3Dhttps-%253A%252F%252Fwww.app3.com%252Fauth%26response_type%3Dcode%26client_name%3DCasOAuthClient,從地址可知,這是由CAS 提供的登錄頁(yè)面,客戶 ID是ots,代表了驗(yàn)證用的交易系統(tǒng)。

圖13 轉(zhuǎn)到第三方應(yīng)用去登錄
(3)輸入用戶名和密碼,登錄成功后會(huì)顯示授權(quán)頁(yè)面,如圖 14 所示。
(4)點(diǎn)擊 Allow 按鈕,同意授權(quán)給第三方交易系統(tǒng)后, 分析日志可以看出 CAS 服務(wù)器給 APP3 服務(wù)器返回了一個(gè)授權(quán)碼。
OC-1-NrqJTop-h7IYyOtxCmYGUS0mKFVGaII3
(5)APP3 服務(wù)器收到授權(quán)碼后,攜帶授權(quán)碼向CAS 服務(wù)器發(fā)出以下請(qǐng)求去獲取訪問(wèn)令牌:
https://www.sso.com/cas/oauth2.0/accessToken?grant_type=authorization_code&client_id=ots&client_secret=12345-6&code=OC-1-NrqJTop-h7IYyOtxCmYGUS0mKFVGaII3-&redirect_uri=https://www.app3.com/auth
(6)CAS 服務(wù)器校驗(yàn)授權(quán)碼通過(guò),生成訪問(wèn)令牌,并把令牌返回給APP3 服務(wù)器。
access_token =AT -1 -AjYYAXSxR2M8EQuDqvHL3V -QwKN871hSN&expires_in=28800
(7)APP3 服務(wù)器得到訪問(wèn)令牌后,攜帶令牌去CAS 服務(wù)器獲取用戶信息。
https://www.sso.com/cas/oauth2.0/profile?access_token=AT-1-AjYYAXSxR2M8EQuDqvHL3VQwKN871hSN
(8)CAS 服務(wù)器校驗(yàn)令牌通過(guò), 向 APP3 服務(wù)器返回用戶信息。
{"service":"https://www.app3.com/auth","attributes":{"credentialType":"UsernamePasswordCredential"},"id":"liqiang","client_id":"ots"}
(9)APP3 服務(wù)器轉(zhuǎn)到登錄成功頁(yè)面,并顯示獲取到的用戶名,如圖15 所示。

圖15 獲取授權(quán)成功轉(zhuǎn)到第三方交易系統(tǒng)
本文對(duì) CAS 協(xié)議和OAuth 框架進(jìn)行了簡(jiǎn)單介紹, 并基于此給出了統(tǒng)一認(rèn)證授權(quán)系統(tǒng)的設(shè)計(jì),隨后結(jié)合實(shí)戰(zhàn)對(duì)每一步進(jìn)行了驗(yàn)證與分析。 以此為技術(shù)基礎(chǔ)可以逐步整合銀行內(nèi)部現(xiàn)有應(yīng)用系統(tǒng)的用戶登錄認(rèn)證,規(guī)范新應(yīng)用系統(tǒng)的開(kāi)發(fā),為銀行帶來(lái)跨系統(tǒng)單點(diǎn)登錄、第三方授權(quán)等基礎(chǔ)能力,為進(jìn)一步構(gòu)建開(kāi)放平臺(tái)和業(yè)務(wù)生態(tài)提供了必要的條件。 此外, 若能通過(guò)域賬號(hào)與統(tǒng)一認(rèn)證授權(quán)系統(tǒng)進(jìn)行集成,將更加有助于簡(jiǎn)化用戶的管理,進(jìn)一步提高系統(tǒng)集成度和用戶的使用體驗(yàn)。