劉 姚
(南京郵電大學(xué) 通信與信息工程學(xué)院,江蘇 南京 210000)
基于Spring和OAuth2.0的第三方授權(quán)框架
劉 姚
(南京郵電大學(xué) 通信與信息工程學(xué)院,江蘇 南京 210000)
OAuth2.0是一個(gè)開(kāi)放標(biāo)準(zhǔn)的第三方授權(quán)協(xié)議,允許用戶(hù)授權(quán)第三方平臺(tái)獲取在某一網(wǎng)站上存儲(chǔ)的用戶(hù)個(gè)人資源,而無(wú)需將用戶(hù)名和密碼提供給第三方平臺(tái)。這個(gè)協(xié)議的主要作用就是定義了一個(gè)標(biāo)準(zhǔn)協(xié)議,允許一個(gè)Web或APP在用戶(hù)授權(quán)下訪問(wèn)用戶(hù)的隱私數(shù)據(jù)而無(wú)須了解用戶(hù)的賬號(hào)信息,這些數(shù)據(jù)可以存儲(chǔ)在諸如微信、支付寶中。Spring Security For OAuth 2.0為OAuth2.0的軟件實(shí)現(xiàn)提供了一個(gè)開(kāi)源Java庫(kù),廣泛用于基于Spring框架的Web站點(diǎn)上,與Spring Security框架無(wú)縫銜接,易于Web后端服務(wù)器的升級(jí),簡(jiǎn)化了基于Web的OAuth2.0協(xié)議的開(kāi)發(fā)。文中分析了OAuth2.0協(xié)議細(xì)則以及關(guān)鍵流程,重點(diǎn)闡述了Spring Security For OAuth 2.0的優(yōu)點(diǎn)、應(yīng)用以及服務(wù)器配置,并以此為基礎(chǔ)快速構(gòu)建OAuth2.0服務(wù)器軟件平臺(tái)。該協(xié)議庫(kù)具有易于使用、易于維護(hù)與使用安全等特點(diǎn),目前已經(jīng)廣泛應(yīng)用在互聯(lián)網(wǎng)以及金融等領(lǐng)域。
Web安全;Spring Security;OAuth2.0;開(kāi)放平臺(tái)認(rèn)證
早期的互聯(lián)網(wǎng)平臺(tái)與應(yīng)用系統(tǒng)是相互獨(dú)立的,各個(gè)平臺(tái)與系統(tǒng)之間不具有數(shù)據(jù)共享功能[1]。一個(gè)平臺(tái)或者一個(gè)系統(tǒng)只能使用自己的系統(tǒng)資源,同時(shí)也不可以訪問(wèn)其他平臺(tái)的資源。隨著互聯(lián)網(wǎng)的迅速發(fā)展,各個(gè)平臺(tái)之間的聯(lián)系日益密切,互聯(lián)網(wǎng)平臺(tái)之間的數(shù)據(jù)共享亟待解決。
OAuth協(xié)議為資源服務(wù)器,第三方平臺(tái)與用戶(hù)之間提供了一個(gè)安全、開(kāi)放并且簡(jiǎn)易的協(xié)議標(biāo)準(zhǔn)[2]。任何第三方平臺(tái)均可以使用OAuth認(rèn)證服務(wù)在用戶(hù)的許可下獲取用戶(hù)所允許的用戶(hù)所屬互聯(lián)網(wǎng)資源。
Spring是一個(gè)輕量級(jí)的JAVAEE框架,提供了一個(gè)標(biāo)準(zhǔn)的IOC容器[3],全面支持AOP開(kāi)發(fā)等特點(diǎn),在企業(yè)應(yīng)用開(kāi)發(fā)與Web網(wǎng)站開(kāi)發(fā)中占有重要地位。Spring Security是Spring的一個(gè)子項(xiàng)目,在Web安全方面應(yīng)用廣泛。Spring Security對(duì)OAuth協(xié)議提供了完整的支持與整合[4]??紤]到OAuth2.0協(xié)議開(kāi)發(fā)的復(fù)雜性,文中以Spring Security開(kāi)源框架為基礎(chǔ)開(kāi)發(fā)第三方授權(quán)軟件平臺(tái),具有開(kāi)發(fā)周期短、代碼量少、實(shí)用性強(qiáng)等特點(diǎn)。
OAuth2.0是OAuth的下一代開(kāi)放平臺(tái)授權(quán)協(xié)議,OAuth旨在增加為開(kāi)發(fā)Web應(yīng)用程序、桌面應(yīng)用程序、移動(dòng)電話和客廳設(shè)備的簡(jiǎn)易性。并且作為標(biāo)準(zhǔn)協(xié)議入駐IETF[5]。
OAuth為客戶(hù)端提供了一種代表資源擁有者訪問(wèn)受保護(hù)資源的方法。在客戶(hù)端訪問(wèn)受保護(hù)資源之前,它必須先從資源擁有者獲取授權(quán)(訪問(wèn)許可),然后用訪問(wèn)許可交換訪問(wèn)令牌(Access Token,包含許可的作用域、持續(xù)時(shí)間和其他屬性等信息)。客戶(hù)端通過(guò)向資源服務(wù)器出示訪問(wèn)令牌來(lái)訪問(wèn)受保護(hù)資源[6]。
在OAuth2.0協(xié)議流的定義下,第三方獲取資源必須按照獲取認(rèn)證、獲取訪問(wèn)資源令牌、通過(guò)令牌獲取指定資源的順序。其工作流順序如圖1所示[7]。
圖1 OAuth抽象協(xié)議流
(A)客戶(hù)端向資源服務(wù)器(可以是OAuth服務(wù)器)請(qǐng)求用戶(hù)(資源所有者)授權(quán)。
(B)客戶(hù)端獲得授權(quán),表現(xiàn)為資源所有者的授權(quán)憑據(jù),可以是OAuth2.0所描述的返回類(lèi)型,也可以是擴(kuò)展類(lèi)型。
(C)客戶(hù)端通過(guò)使用授權(quán)服務(wù)器進(jìn)行身份驗(yàn)證和提交授權(quán)授予請(qǐng)求訪問(wèn)令牌。
(D)授權(quán)服務(wù)器對(duì)客戶(hù)端進(jìn)行身份驗(yàn)證和驗(yàn)證授權(quán)授予,如果有效,會(huì)發(fā)出一個(gè)訪問(wèn)令牌。
(E)客戶(hù)端從資源服務(wù)器請(qǐng)求受保護(hù)的資源,并使用訪問(wèn)令牌進(jìn)行身份驗(yàn)證。
(F)資源服務(wù)器驗(yàn)證訪問(wèn)令牌,如果有效,則對(duì)請(qǐng)求進(jìn)行服務(wù)。
OAuth2.0中的資源所有者負(fù)責(zé)給客戶(hù)端授權(quán)??蛻?hù)端應(yīng)用代表資源所有者獲取受保護(hù)的資源。資源服務(wù)器負(fù)責(zé)提供這些受保護(hù)的資源。授權(quán)服務(wù)器負(fù)責(zé)為客戶(hù)端應(yīng)用提供Access Token[8]。
OAuth2.0包含四種授權(quán)類(lèi)型:授權(quán)碼(Web應(yīng)用使用)、隱式授權(quán)(基于瀏覽器或移動(dòng)應(yīng)用)、用戶(hù)密碼方式與客戶(hù)端應(yīng)用憑證(基于應(yīng)用)授權(quán)方式[9]。
OAuth2.0采用短期有效形式的令牌,可以通過(guò)刷新令牌來(lái)保持令牌的長(zhǎng)期使用,其數(shù)據(jù)格式如下所示[10]:
{
"access_token":"1CutcHUDNjkisDkxIUvaA",
"token_type":"bearer",
"expires_in":3600,
"refresh_token":"vAgd2IOpQ9XG0Dx1E2KWAE",
}
OAuth2.0有多種實(shí)現(xiàn)方案,如php、python、C++與Java等等。Spring基于Java平臺(tái)實(shí)現(xiàn),對(duì)OAuth2.0進(jìn)行二次適配。
OAuth2.0包含眾多Java語(yǔ)言實(shí)現(xiàn)框架,如Jersey、Apache Oltu、Spring Security OAuth2、Google OAuth2 API等等。Jersey提供了對(duì)Java EE標(biāo)準(zhǔn)安全框架的集成,但只提供了客戶(hù)端的解決方案。Apache Oltu也是一個(gè)較為完善的解決方案,但參考文檔較為復(fù)雜,學(xué)習(xí)成本高。
Spring Security OAuth同時(shí)提供了對(duì)OAuth1.0與OAuth2.0的支持,支持OAuth2.0協(xié)議的所有特性與要求(Authorization Server,Resources Server,Client)。同時(shí)與Spring有著良好的集成,相比其他OAuth2.0的Java語(yǔ)言實(shí)現(xiàn)具有較大優(yōu)勢(shì)?;赟pring的注解與xml配置,使得OAuth2.0協(xié)議能夠完全融合于Spring框架[11]。
即使OAuth2.0協(xié)議簡(jiǎn)化了開(kāi)放平臺(tái)授權(quán),但仍然存在一定的工作量與復(fù)雜度。Spring框架整合OAuth2.0協(xié)議,極大地簡(jiǎn)化了OAuth2.0協(xié)議實(shí)現(xiàn)的復(fù)雜度。Spring框架中的Spring Security組件用于實(shí)現(xiàn)用戶(hù)認(rèn)證登陸,OAuth2.0用于實(shí)現(xiàn)開(kāi)放平臺(tái)授權(quán)。兩者結(jié)合簡(jiǎn)化了OAuth2.0服務(wù)器的開(kāi)發(fā)。
OAuth2.0服務(wù)端需要提供訪問(wèn)資源服務(wù)器的接口。共需要三個(gè)接口:客戶(hù)端平臺(tái)從資源擁有者(用戶(hù))取得資源授權(quán)接口,客戶(hù)端根據(jù)授權(quán)碼向資源服務(wù)器獲取Access Token接口,客戶(hù)端根據(jù)Access Token獲取資源接口。其中需要服務(wù)端提供兩個(gè)頁(yè)面:授權(quán)頁(yè)面與登陸頁(yè)面[12]。
Spring Security組件集成了對(duì)OAuth2.0的支持,使得頁(yè)面授權(quán)邏輯與OAuth2.0的協(xié)議邏輯相分離。Spring MVC負(fù)責(zé)頁(yè)面跳轉(zhuǎn)與展示,Spring Security負(fù)責(zé)安全認(rèn)證,OAuth2.0負(fù)責(zé)客戶(hù)端、用戶(hù)與服務(wù)器之間的關(guān)系處理[13]。
通過(guò)對(duì)個(gè)人誠(chéng)信系統(tǒng)管理的分析,存在資源服務(wù)器上的信息包括用戶(hù)注冊(cè)信息、用戶(hù)基本檔案信息與誠(chéng)信檔案信息三個(gè)部分。其中,用戶(hù)基本檔案信息與用戶(hù)誠(chéng)信檔案信息為該平臺(tái)對(duì)外開(kāi)放的信息。
用戶(hù)注冊(cè)信息包含用戶(hù)ID、用戶(hù)名和密碼等關(guān)鍵數(shù)據(jù)。用戶(hù)基本檔案包含用戶(hù)的信用記錄、信用狀態(tài)以及信用得分等。用戶(hù)基本檔案記錄著用戶(hù)的實(shí)名認(rèn)證等詳細(xì)信息。用戶(hù)的基本檔案以及誠(chéng)信檔案信息必須在用戶(hù)ID、密碼匹配的情況下才可以被訪問(wèn)。
Spring采用插件化的方法來(lái)集成Spring Security與OAuth2.0。構(gòu)建該系統(tǒng)同時(shí)需要引入相應(yīng)的Spring Security與spring-security-oauth2的jar包。Spring Security通過(guò)在xml中配置http節(jié)點(diǎn)設(shè)置相應(yīng)URL的訪問(wèn)權(quán)限,采用Spring框架的OAuth2.0的授權(quán)管理器。其原理如圖2所示。
圖2 Spring OAuth2.0授權(quán)原理
第三方平臺(tái)首先嘗試獲取位于資源服務(wù)器的資源,若資源是該平臺(tái)開(kāi)放資源,OAuth2 Access Decision Manager會(huì)判斷當(dāng)前第三方是否經(jīng)過(guò)本平臺(tái)用戶(hù)授權(quán)。沒(méi)有授權(quán)則轉(zhuǎn)到登陸頁(yè)面提示用戶(hù)登陸,若已經(jīng)授權(quán)則資源服務(wù)器將相應(yīng)的數(shù)據(jù)返回給第三方平臺(tái)。
同時(shí),Spring提供了基于xml配置的OAuth:authorization-server,該節(jié)點(diǎn)用于自動(dòng)解析創(chuàng)建OAuth2.0應(yīng)用所需要?jiǎng)?chuàng)建的類(lèi)與必須的配置項(xiàng)[14]。
OAuth2.0核心流程所需要的數(shù)據(jù)均保存在認(rèn)證服務(wù)器數(shù)據(jù)庫(kù)中。每一個(gè)需要接入的第三方系統(tǒng)都需要在認(rèn)證服務(wù)器注冊(cè)用于標(biāo)示該應(yīng)用信息,認(rèn)證服務(wù)器的第三方應(yīng)用信息數(shù)據(jù)見(jiàn)表1。
框架Spring為OAuth2.0提供了Access Token的實(shí)現(xiàn)類(lèi)JdbcTokenStore,用于實(shí)現(xiàn)令牌的存儲(chǔ)。同時(shí)令牌擁有有效期,Spring Security提供了令牌刷定時(shí)刷新的方法。JdbcTokenStore用于讀寫(xiě)存在于數(shù)據(jù)庫(kù)中的令牌數(shù)據(jù)。Access Token數(shù)據(jù)表包含accesstoken、createtime與expiretime三個(gè)字段,分別表示令牌、創(chuàng)建時(shí)間與過(guò)期時(shí)間的詳細(xì)信息。
表1 AppInfo應(yīng)用信息表
在系統(tǒng)設(shè)計(jì)的最后階段,需要向外部暴露自己的開(kāi)放接口。該誠(chéng)信系統(tǒng)只需要暴露兩個(gè)開(kāi)放接口,即調(diào)用基本信息接口與調(diào)用基本信息擴(kuò)展的誠(chéng)信信息接口。
SpringSecurity集成OAuth2.0需要實(shí)現(xiàn)的步驟如下:
Spring Authorization Server授權(quán)服務(wù)器端的配置。該配置用于創(chuàng)建授權(quán)服務(wù)器相關(guān)的支持類(lèi)。
Spring Resource Server的服務(wù)端配置。該配置用于創(chuàng)建資源服務(wù)器相關(guān)的支持類(lèi)。其作用是提供授權(quán)的Servlet過(guò)濾器用來(lái)保護(hù)Web資源。該項(xiàng)配置可以使用基于XML的配置
Spring OAuth2.0 Client的配置,該配置用于創(chuàng)建可以存儲(chǔ)當(dāng)前請(qǐng)求和上下文環(huán)境的Servlet過(guò)濾器,用來(lái)管理OAuth授權(quán)URI的重定向。該項(xiàng)配置可以使用基于XML的配置
當(dāng)?shù)谌綉?yīng)用需要使用用戶(hù)的個(gè)人信息檔案或者個(gè)人基本信息檔案時(shí),就可以接入本誠(chéng)信檔案系統(tǒng)。接著頁(yè)面跳轉(zhuǎn)到授權(quán)服務(wù)器提供授權(quán)頁(yè)面。用戶(hù)輸入有效的賬戶(hù)密碼并同意授權(quán)。用戶(hù)授權(quán)頁(yè)面如圖3所示。
圖3 用戶(hù)授權(quán)頁(yè)面
同意授權(quán)后,根據(jù)客戶(hù)端應(yīng)用提供的回調(diào)地址,將當(dāng)前頁(yè)面跳轉(zhuǎn)到客戶(hù)端應(yīng)用頁(yè)面,此時(shí)客戶(hù)端應(yīng)用可以根據(jù)獲取到的code,再向授權(quán)服務(wù)器獲取Access Token。授權(quán)成功跳轉(zhuǎn)頁(yè)面如圖4所示。
圖4 授權(quán)成功跳轉(zhuǎn)頁(yè)面
客戶(hù)端應(yīng)用根據(jù)Access Token可以得到的信息如圖5所示??蛻?hù)端可以得到用戶(hù)所允許的個(gè)人基本信息及信用狀態(tài)信息。由于篇幅,更多詳細(xì)信息未列出。
圖5 獲得用戶(hù)信息頁(yè)面
基于Spring Security,配置了第三方授權(quán)平臺(tái)的服務(wù)端。完成了基礎(chǔ)的授權(quán)功能,實(shí)現(xiàn)了用戶(hù)資源的第三方平臺(tái)授權(quán)訪問(wèn),保證了第三方授權(quán)的安全性。
在框架的支持下,Web服務(wù)端開(kāi)發(fā)人員僅僅需要配置
[1] 劉大紅,劉 明.第三方應(yīng)用與開(kāi)放平臺(tái)OAuth認(rèn)證互連技術(shù)研究[J].電腦知識(shí)與技術(shù),2012,8(8):5367-5369.
[2] 張衛(wèi)全,胡志遠(yuǎn).淺析作用于Web2.0安全防范的OpenID和OAuth機(jī)制[J].通信管理與技術(shù),2011(2):15-18.
[3] 王春枝,唐俊武.關(guān)于IoC模式及輕量級(jí)容器的研究[J].湖北工業(yè)大學(xué)學(xué)報(bào),2006,21(4):52-54.
[4] 張 宇,王映輝,張翔南.基于Spring的MVC框架設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2010,36(4):59-62.
[5] Leiba B.Oauth web authorization protocol[J].IEEE Internet Computing,2012,16(1):74-77.
[6] Jones M, Hardt D. The Oauth 2.0 authorization framework:bearer token usage[R].[s.l.]:[s.n.],2012.
[7] Hardt D.The OAuth 2.0 authorization framework[R].[s.l.]:[s.n.],2012.
[8] 張 銳,張建林,孫國(guó)忠.多業(yè)務(wù)系統(tǒng)的統(tǒng)一認(rèn)證授權(quán)研究與設(shè)計(jì)[J].計(jì)算機(jī)工程與設(shè)計(jì),2009,30(8):1826-1828.
[9] 蔣 緯,馬光思.Spring與其他框架整合及流程分析[J].計(jì)算機(jī)工程,2007,33(14):79-81.
[10] 莊少燉.基于Spring的輕量級(jí)Web框架研究與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2009.
[11] 黃道斌.一種基于SPRINGSECURITY的訪問(wèn)控制方案[J].軟件導(dǎo)刊,2011,10(8):122-123.
[12] 丁振凡.基于Spring Security的Web資源訪問(wèn)控制[J].宜春學(xué)院學(xué)報(bào),2012,34(8):71-74.
[13] 陳雄華.Spring 3.x企業(yè)應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)[M].北京:電子工業(yè)出版社,2012.
[14] 肖 云.基于Spring Security安全的Web應(yīng)用開(kāi)發(fā)[J].計(jì)算機(jī)與現(xiàn)代化,2011(6):158-159.
Investigation on Third Party Authorization System Based on Spring Security and OAuth2.0
LIU Yao
(College of Telecommunications and Information Engineering,Nanjing University of Posts and Telecommunications,Nanjing 210000,China)
OAuth2.0 is a third party authorization protocol of open standard,and allows the user to authorize a third party to obtain a user’s personal resources stored on a Web site without having to provide the user name and password to a third party platform.The main role of this agreement is to define a standard protocol that allows a Web or APP access the private data of the user in the case of authorized,and the data can be stored in areas such as Alipay and WeChat.Spring Security For OAuth 2.0 provides an open source Java library for OAuth2.0 implementations widely used in Web sites based on the Spring framework and Spring Security framework for seamless,easy to upgrade for Web back-end,simplification of the development of Web-based OAuth 2.0.The OAuth2.0 protocol rules as well as the key process are analyzed,and the Spring Security For OAuth 2.0 advantages,applications and server configuration are described,and as a foundation to quickly build the OAuth2.0 server software platform.The protocol library has features of easy to use,easy to maintain and use security,now widely used in the Internet,as well as financial and other fields.
Web security;Spring Security;OAuth2.0;open platform certification
2016-04-25
2016-08-11
時(shí)間:2017-02-17
國(guó)家自然科學(xué)基金資助項(xiàng)目(61271234)
劉 姚(1992-),男,碩士研究生,研究方向?yàn)樾l(wèi)星通信技術(shù)。
http://www.cnki.net/kcms/detail/61.1450.TP.20170217.1630.054.html
TP39
A
1673-629X(2017)03-0167-04
10.3969/j.issn.1673-629X.2017.03.035