劉 姚
(南京郵電大學(xué) 通信與信息工程學(xué)院,江蘇 南京 210000)
基于Spring和OAuth2.0的第三方授權(quán)框架
劉 姚
(南京郵電大學(xué) 通信與信息工程學(xué)院,江蘇 南京 210000)
OAuth2.0是一個開放標(biāo)準(zhǔn)的第三方授權(quán)協(xié)議,允許用戶授權(quán)第三方平臺獲取在某一網(wǎng)站上存儲的用戶個人資源,而無需將用戶名和密碼提供給第三方平臺。這個協(xié)議的主要作用就是定義了一個標(biāo)準(zhǔn)協(xié)議,允許一個Web或APP在用戶授權(quán)下訪問用戶的隱私數(shù)據(jù)而無須了解用戶的賬號信息,這些數(shù)據(jù)可以存儲在諸如微信、支付寶中。Spring Security For OAuth 2.0為OAuth2.0的軟件實(shí)現(xiàn)提供了一個開源Java庫,廣泛用于基于Spring框架的Web站點(diǎn)上,與Spring Security框架無縫銜接,易于Web后端服務(wù)器的升級,簡化了基于Web的OAuth2.0協(xié)議的開發(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ù)器軟件平臺。該協(xié)議庫具有易于使用、易于維護(hù)與使用安全等特點(diǎn),目前已經(jīng)廣泛應(yīng)用在互聯(lián)網(wǎng)以及金融等領(lǐng)域。
Web安全;Spring Security;OAuth2.0;開放平臺認(rèn)證
早期的互聯(lián)網(wǎng)平臺與應(yīng)用系統(tǒng)是相互獨(dú)立的,各個平臺與系統(tǒng)之間不具有數(shù)據(jù)共享功能[1]。一個平臺或者一個系統(tǒng)只能使用自己的系統(tǒng)資源,同時也不可以訪問其他平臺的資源。隨著互聯(lián)網(wǎng)的迅速發(fā)展,各個平臺之間的聯(lián)系日益密切,互聯(lián)網(wǎng)平臺之間的數(shù)據(jù)共享亟待解決。
OAuth協(xié)議為資源服務(wù)器,第三方平臺與用戶之間提供了一個安全、開放并且簡易的協(xié)議標(biāo)準(zhǔn)[2]。任何第三方平臺均可以使用OAuth認(rèn)證服務(wù)在用戶的許可下獲取用戶所允許的用戶所屬互聯(lián)網(wǎng)資源。
Spring是一個輕量級的JAVAEE框架,提供了一個標(biāo)準(zhǔn)的IOC容器[3],全面支持AOP開發(fā)等特點(diǎn),在企業(yè)應(yīng)用開發(fā)與Web網(wǎng)站開發(fā)中占有重要地位。Spring Security是Spring的一個子項(xiàng)目,在Web安全方面應(yīng)用廣泛。Spring Security對OAuth協(xié)議提供了完整的支持與整合[4]。考慮到OAuth2.0協(xié)議開發(fā)的復(fù)雜性,文中以Spring Security開源框架為基礎(chǔ)開發(fā)第三方授權(quán)軟件平臺,具有開發(fā)周期短、代碼量少、實(shí)用性強(qiáng)等特點(diǎn)。
OAuth2.0是OAuth的下一代開放平臺授權(quán)協(xié)議,OAuth旨在增加為開發(fā)Web應(yīng)用程序、桌面應(yīng)用程序、移動電話和客廳設(shè)備的簡易性。并且作為標(biāo)準(zhǔn)協(xié)議入駐IETF[5]。
OAuth為客戶端提供了一種代表資源擁有者訪問受保護(hù)資源的方法。在客戶端訪問受保護(hù)資源之前,它必須先從資源擁有者獲取授權(quán)(訪問許可),然后用訪問許可交換訪問令牌(Access Token,包含許可的作用域、持續(xù)時間和其他屬性等信息)??蛻舳送ㄟ^向資源服務(wù)器出示訪問令牌來訪問受保護(hù)資源[6]。
在OAuth2.0協(xié)議流的定義下,第三方獲取資源必須按照獲取認(rèn)證、獲取訪問資源令牌、通過令牌獲取指定資源的順序。其工作流順序如圖1所示[7]。
圖1 OAuth抽象協(xié)議流
(A)客戶端向資源服務(wù)器(可以是OAuth服務(wù)器)請求用戶(資源所有者)授權(quán)。
(B)客戶端獲得授權(quán),表現(xiàn)為資源所有者的授權(quán)憑據(jù),可以是OAuth2.0所描述的返回類型,也可以是擴(kuò)展類型。
(C)客戶端通過使用授權(quán)服務(wù)器進(jìn)行身份驗(yàn)證和提交授權(quán)授予請求訪問令牌。
(D)授權(quán)服務(wù)器對客戶端進(jìn)行身份驗(yàn)證和驗(yàn)證授權(quán)授予,如果有效,會發(fā)出一個訪問令牌。
(E)客戶端從資源服務(wù)器請求受保護(hù)的資源,并使用訪問令牌進(jìn)行身份驗(yàn)證。
(F)資源服務(wù)器驗(yàn)證訪問令牌,如果有效,則對請求進(jìn)行服務(wù)。
OAuth2.0中的資源所有者負(fù)責(zé)給客戶端授權(quán)??蛻舳藨?yīng)用代表資源所有者獲取受保護(hù)的資源。資源服務(wù)器負(fù)責(zé)提供這些受保護(hù)的資源。授權(quán)服務(wù)器負(fù)責(zé)為客戶端應(yīng)用提供Access Token[8]。
OAuth2.0包含四種授權(quán)類型:授權(quán)碼(Web應(yīng)用使用)、隱式授權(quán)(基于瀏覽器或移動應(yīng)用)、用戶密碼方式與客戶端應(yīng)用憑證(基于應(yīng)用)授權(quán)方式[9]。
OAuth2.0采用短期有效形式的令牌,可以通過刷新令牌來保持令牌的長期使用,其數(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平臺實(shí)現(xiàn),對OAuth2.0進(jìn)行二次適配。
OAuth2.0包含眾多Java語言實(shí)現(xiàn)框架,如Jersey、Apache Oltu、Spring Security OAuth2、Google OAuth2 API等等。Jersey提供了對Java EE標(biāo)準(zhǔn)安全框架的集成,但只提供了客戶端的解決方案。Apache Oltu也是一個較為完善的解決方案,但參考文檔較為復(fù)雜,學(xué)習(xí)成本高。
Spring Security OAuth同時提供了對OAuth1.0與OAuth2.0的支持,支持OAuth2.0協(xié)議的所有特性與要求(Authorization Server,Resources Server,Client)。同時與Spring有著良好的集成,相比其他OAuth2.0的Java語言實(shí)現(xiàn)具有較大優(yōu)勢。基于Spring的注解與xml配置,使得OAuth2.0協(xié)議能夠完全融合于Spring框架[11]。
即使OAuth2.0協(xié)議簡化了開放平臺授權(quán),但仍然存在一定的工作量與復(fù)雜度。Spring框架整合OAuth2.0協(xié)議,極大地簡化了OAuth2.0協(xié)議實(shí)現(xiàn)的復(fù)雜度。Spring框架中的Spring Security組件用于實(shí)現(xiàn)用戶認(rèn)證登陸,OAuth2.0用于實(shí)現(xiàn)開放平臺授權(quán)。兩者結(jié)合簡化了OAuth2.0服務(wù)器的開發(fā)。
OAuth2.0服務(wù)端需要提供訪問資源服務(wù)器的接口。共需要三個接口:客戶端平臺從資源擁有者(用戶)取得資源授權(quán)接口,客戶端根據(jù)授權(quán)碼向資源服務(wù)器獲取Access Token接口,客戶端根據(jù)Access Token獲取資源接口。其中需要服務(wù)端提供兩個頁面:授權(quán)頁面與登陸頁面[12]。
Spring Security組件集成了對OAuth2.0的支持,使得頁面授權(quán)邏輯與OAuth2.0的協(xié)議邏輯相分離。Spring MVC負(fù)責(zé)頁面跳轉(zhuǎn)與展示,Spring Security負(fù)責(zé)安全認(rèn)證,OAuth2.0負(fù)責(zé)客戶端、用戶與服務(wù)器之間的關(guān)系處理[13]。
通過對個人誠信系統(tǒng)管理的分析,存在資源服務(wù)器上的信息包括用戶注冊信息、用戶基本檔案信息與誠信檔案信息三個部分。其中,用戶基本檔案信息與用戶誠信檔案信息為該平臺對外開放的信息。
用戶注冊信息包含用戶ID、用戶名和密碼等關(guān)鍵數(shù)據(jù)。用戶基本檔案包含用戶的信用記錄、信用狀態(tài)以及信用得分等。用戶基本檔案記錄著用戶的實(shí)名認(rèn)證等詳細(xì)信息。用戶的基本檔案以及誠信檔案信息必須在用戶ID、密碼匹配的情況下才可以被訪問。
Spring采用插件化的方法來集成Spring Security與OAuth2.0。構(gòu)建該系統(tǒng)同時需要引入相應(yīng)的Spring Security與spring-security-oauth2的jar包。Spring Security通過在xml中配置http節(jié)點(diǎn)設(shè)置相應(yīng)URL的訪問權(quán)限,采用Spring框架的OAuth2.0的授權(quán)管理器。其原理如圖2所示。
圖2 Spring OAuth2.0授權(quán)原理
第三方平臺首先嘗試獲取位于資源服務(wù)器的資源,若資源是該平臺開放資源,OAuth2 Access Decision Manager會判斷當(dāng)前第三方是否經(jīng)過本平臺用戶授權(quán)。沒有授權(quán)則轉(zhuǎn)到登陸頁面提示用戶登陸,若已經(jīng)授權(quán)則資源服務(wù)器將相應(yīng)的數(shù)據(jù)返回給第三方平臺。
同時,Spring提供了基于xml配置的OAuth:authorization-server,該節(jié)點(diǎn)用于自動解析創(chuàng)建OAuth2.0應(yīng)用所需要創(chuàng)建的類與必須的配置項(xiàng)[14]。
OAuth2.0核心流程所需要的數(shù)據(jù)均保存在認(rèn)證服務(wù)器數(shù)據(jù)庫中。每一個需要接入的第三方系統(tǒng)都需要在認(rèn)證服務(wù)器注冊用于標(biāo)示該應(yīng)用信息,認(rèn)證服務(wù)器的第三方應(yīng)用信息數(shù)據(jù)見表1。
框架Spring為OAuth2.0提供了Access Token的實(shí)現(xiàn)類JdbcTokenStore,用于實(shí)現(xiàn)令牌的存儲。同時令牌擁有有效期,Spring Security提供了令牌刷定時刷新的方法。JdbcTokenStore用于讀寫存在于數(shù)據(jù)庫中的令牌數(shù)據(jù)。Access Token數(shù)據(jù)表包含accesstoken、createtime與expiretime三個字段,分別表示令牌、創(chuàng)建時間與過期時間的詳細(xì)信息。
表1 AppInfo應(yīng)用信息表
在系統(tǒng)設(shè)計的最后階段,需要向外部暴露自己的開放接口。該誠信系統(tǒng)只需要暴露兩個開放接口,即調(diào)用基本信息接口與調(diào)用基本信息擴(kuò)展的誠信信息接口。
SpringSecurity集成OAuth2.0需要實(shí)現(xiàn)的步驟如下:
Spring Authorization Server授權(quán)服務(wù)器端的配置。該配置用于創(chuàng)建授權(quán)服務(wù)器相關(guān)的支持類。
Spring Resource Server的服務(wù)端配置。該配置用于創(chuàng)建資源服務(wù)器相關(guān)的支持類。其作用是提供授權(quán)的Servlet過濾器用來保護(hù)Web資源。該項(xiàng)配置可以使用基于XML的配置
Spring OAuth2.0 Client的配置,該配置用于創(chuàng)建可以存儲當(dāng)前請求和上下文環(huán)境的Servlet過濾器,用來管理OAuth授權(quán)URI的重定向。該項(xiàng)配置可以使用基于XML的配置
當(dāng)?shù)谌綉?yīng)用需要使用用戶的個人信息檔案或者個人基本信息檔案時,就可以接入本誠信檔案系統(tǒng)。接著頁面跳轉(zhuǎn)到授權(quán)服務(wù)器提供授權(quán)頁面。用戶輸入有效的賬戶密碼并同意授權(quán)。用戶授權(quán)頁面如圖3所示。
圖3 用戶授權(quán)頁面
同意授權(quán)后,根據(jù)客戶端應(yīng)用提供的回調(diào)地址,將當(dāng)前頁面跳轉(zhuǎn)到客戶端應(yīng)用頁面,此時客戶端應(yīng)用可以根據(jù)獲取到的code,再向授權(quán)服務(wù)器獲取Access Token。授權(quán)成功跳轉(zhuǎn)頁面如圖4所示。
圖4 授權(quán)成功跳轉(zhuǎn)頁面
客戶端應(yīng)用根據(jù)Access Token可以得到的信息如圖5所示??蛻舳丝梢缘玫接脩羲试S的個人基本信息及信用狀態(tài)信息。由于篇幅,更多詳細(xì)信息未列出。
圖5 獲得用戶信息頁面
基于Spring Security,配置了第三方授權(quán)平臺的服務(wù)端。完成了基礎(chǔ)的授權(quán)功能,實(shí)現(xiàn)了用戶資源的第三方平臺授權(quán)訪問,保證了第三方授權(quán)的安全性。
在框架的支持下,Web服務(wù)端開發(fā)人員僅僅需要配置
[1] 劉大紅,劉 明.第三方應(yīng)用與開放平臺OAuth認(rèn)證互連技術(shù)研究[J].電腦知識與技術(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].湖北工業(yè)大學(xué)學(xué)報,2006,21(4):52-54.
[4] 張 宇,王映輝,張翔南.基于Spring的MVC框架設(shè)計與實(shí)現(xiàn)[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] 張 銳,張建林,孫國忠.多業(yè)務(wù)系統(tǒng)的統(tǒng)一認(rèn)證授權(quán)研究與設(shè)計[J].計算機(jī)工程與設(shè)計,2009,30(8):1826-1828.
[9] 蔣 緯,馬光思.Spring與其他框架整合及流程分析[J].計算機(jī)工程,2007,33(14):79-81.
[10] 莊少燉.基于Spring的輕量級Web框架研究與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2009.
[11] 黃道斌.一種基于SPRINGSECURITY的訪問控制方案[J].軟件導(dǎo)刊,2011,10(8):122-123.
[12] 丁振凡.基于Spring Security的Web資源訪問控制[J].宜春學(xué)院學(xué)報,2012,34(8):71-74.
[13] 陳雄華.Spring 3.x企業(yè)應(yīng)用開發(fā)實(shí)戰(zhàn)[M].北京:電子工業(yè)出版社,2012.
[14] 肖 云.基于Spring Security安全的Web應(yīng)用開發(fā)[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
時間:2017-02-17
國家自然科學(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