劉 姚
(南京郵電大學 通信與信息工程學院,江蘇 南京 210000)
基于Spring和OAuth2.0的第三方授權框架
劉 姚
(南京郵電大學 通信與信息工程學院,江蘇 南京 210000)
OAuth2.0是一個開放標準的第三方授權協議,允許用戶授權第三方平臺獲取在某一網站上存儲的用戶個人資源,而無需將用戶名和密碼提供給第三方平臺。這個協議的主要作用就是定義了一個標準協議,允許一個Web或APP在用戶授權下訪問用戶的隱私數據而無須了解用戶的賬號信息,這些數據可以存儲在諸如微信、支付寶中。Spring Security For OAuth 2.0為OAuth2.0的軟件實現提供了一個開源Java庫,廣泛用于基于Spring框架的Web站點上,與Spring Security框架無縫銜接,易于Web后端服務器的升級,簡化了基于Web的OAuth2.0協議的開發。文中分析了OAuth2.0協議細則以及關鍵流程,重點闡述了Spring Security For OAuth 2.0的優點、應用以及服務器配置,并以此為基礎快速構建OAuth2.0服務器軟件平臺。該協議庫具有易于使用、易于維護與使用安全等特點,目前已經廣泛應用在互聯網以及金融等領域。
Web安全;Spring Security;OAuth2.0;開放平臺認證
早期的互聯網平臺與應用系統是相互獨立的,各個平臺與系統之間不具有數據共享功能[1]。一個平臺或者一個系統只能使用自己的系統資源,同時也不可以訪問其他平臺的資源。隨著互聯網的迅速發展,各個平臺之間的聯系日益密切,互聯網平臺之間的數據共享亟待解決。
OAuth協議為資源服務器,第三方平臺與用戶之間提供了一個安全、開放并且簡易的協議標準[2]。任何第三方平臺均可以使用OAuth認證服務在用戶的許可下獲取用戶所允許的用戶所屬互聯網資源。
Spring是一個輕量級的JAVAEE框架,提供了一個標準的IOC容器[3],全面支持AOP開發等特點,在企業應用開發與Web網站開發中占有重要地位。Spring Security是Spring的一個子項目,在Web安全方面應用廣泛。Spring Security對OAuth協議提供了完整的支持與整合[4]。考慮到OAuth2.0協議開發的復雜性,文中以Spring Security開源框架為基礎開發第三方授權軟件平臺,具有開發周期短、代碼量少、實用性強等特點。
OAuth2.0是OAuth的下一代開放平臺授權協議,OAuth旨在增加為開發Web應用程序、桌面應用程序、移動電話和客廳設備的簡易性。并且作為標準協議入駐IETF[5]。
OAuth為客戶端提供了一種代表資源擁有者訪問受保護資源的方法。在客戶端訪問受保護資源之前,它必須先從資源擁有者獲取授權(訪問許可),然后用訪問許可交換訪問令牌(Access Token,包含許可的作用域、持續時間和其他屬性等信息)。客戶端通過向資源服務器出示訪問令牌來訪問受保護資源[6]。
在OAuth2.0協議流的定義下,第三方獲取資源必須按照獲取認證、獲取訪問資源令牌、通過令牌獲取指定資源的順序。其工作流順序如圖1所示[7]。

圖1 OAuth抽象協議流
(A)客戶端向資源服務器(可以是OAuth服務器)請求用戶(資源所有者)授權。
(B)客戶端獲得授權,表現為資源所有者的授權憑據,可以是OAuth2.0所描述的返回類型,也可以是擴展類型。
(C)客戶端通過使用授權服務器進行身份驗證和提交授權授予請求訪問令牌。
(D)授權服務器對客戶端進行身份驗證和驗證授權授予,如果有效,會發出一個訪問令牌。
(E)客戶端從資源服務器請求受保護的資源,并使用訪問令牌進行身份驗證。
(F)資源服務器驗證訪問令牌,如果有效,則對請求進行服務。
OAuth2.0中的資源所有者負責給客戶端授權。客戶端應用代表資源所有者獲取受保護的資源。資源服務器負責提供這些受保護的資源。授權服務器負責為客戶端應用提供Access Token[8]。
OAuth2.0包含四種授權類型:授權碼(Web應用使用)、隱式授權(基于瀏覽器或移動應用)、用戶密碼方式與客戶端應用憑證(基于應用)授權方式[9]。
OAuth2.0采用短期有效形式的令牌,可以通過刷新令牌來保持令牌的長期使用,其數據格式如下所示[10]:
{
"access_token":"1CutcHUDNjkisDkxIUvaA",
"token_type":"bearer",
"expires_in":3600,
"refresh_token":"vAgd2IOpQ9XG0Dx1E2KWAE",
}
OAuth2.0有多種實現方案,如php、python、C++與Java等等。Spring基于Java平臺實現,對OAuth2.0進行二次適配。
OAuth2.0包含眾多Java語言實現框架,如Jersey、Apache Oltu、Spring Security OAuth2、Google OAuth2 API等等。Jersey提供了對Java EE標準安全框架的集成,但只提供了客戶端的解決方案。Apache Oltu也是一個較為完善的解決方案,但參考文檔較為復雜,學習成本高。
Spring Security OAuth同時提供了對OAuth1.0與OAuth2.0的支持,支持OAuth2.0協議的所有特性與要求(Authorization Server,Resources Server,Client)。同時與Spring有著良好的集成,相比其他OAuth2.0的Java語言實現具有較大優勢。基于Spring的注解與xml配置,使得OAuth2.0協議能夠完全融合于Spring框架[11]。
即使OAuth2.0協議簡化了開放平臺授權,但仍然存在一定的工作量與復雜度。Spring框架整合OAuth2.0協議,極大地簡化了OAuth2.0協議實現的復雜度。Spring框架中的Spring Security組件用于實現用戶認證登陸,OAuth2.0用于實現開放平臺授權。兩者結合簡化了OAuth2.0服務器的開發。
OAuth2.0服務端需要提供訪問資源服務器的接口。共需要三個接口:客戶端平臺從資源擁有者(用戶)取得資源授權接口,客戶端根據授權碼向資源服務器獲取Access Token接口,客戶端根據Access Token獲取資源接口。其中需要服務端提供兩個頁面:授權頁面與登陸頁面[12]。
Spring Security組件集成了對OAuth2.0的支持,使得頁面授權邏輯與OAuth2.0的協議邏輯相分離。Spring MVC負責頁面跳轉與展示,Spring Security負責安全認證,OAuth2.0負責客戶端、用戶與服務器之間的關系處理[13]。
通過對個人誠信系統管理的分析,存在資源服務器上的信息包括用戶注冊信息、用戶基本檔案信息與誠信檔案信息三個部分。其中,用戶基本檔案信息與用戶誠信檔案信息為該平臺對外開放的信息。
用戶注冊信息包含用戶ID、用戶名和密碼等關鍵數據。用戶基本檔案包含用戶的信用記錄、信用狀態以及信用得分等。用戶基本檔案記錄著用戶的實名認證等詳細信息。用戶的基本檔案以及誠信檔案信息必須在用戶ID、密碼匹配的情況下才可以被訪問。
Spring采用插件化的方法來集成Spring Security與OAuth2.0。構建該系統同時需要引入相應的Spring Security與spring-security-oauth2的jar包。Spring Security通過在xml中配置http節點設置相應URL的訪問權限,采用Spring框架的OAuth2.0的授權管理器。其原理如圖2所示。

圖2 Spring OAuth2.0授權原理
第三方平臺首先嘗試獲取位于資源服務器的資源,若資源是該平臺開放資源,OAuth2 Access Decision Manager會判斷當前第三方是否經過本平臺用戶授權。沒有授權則轉到登陸頁面提示用戶登陸,若已經授權則資源服務器將相應的數據返回給第三方平臺。
同時,Spring提供了基于xml配置的OAuth:authorization-server,該節點用于自動解析創建OAuth2.0應用所需要創建的類與必須的配置項[14]。
OAuth2.0核心流程所需要的數據均保存在認證服務器數據庫中。每一個需要接入的第三方系統都需要在認證服務器注冊用于標示該應用信息,認證服務器的第三方應用信息數據見表1。
框架Spring為OAuth2.0提供了Access Token的實現類JdbcTokenStore,用于實現令牌的存儲。同時令牌擁有有效期,Spring Security提供了令牌刷定時刷新的方法。JdbcTokenStore用于讀寫存在于數據庫中的令牌數據。Access Token數據表包含accesstoken、createtime與expiretime三個字段,分別表示令牌、創建時間與過期時間的詳細信息。

表1 AppInfo應用信息表
在系統設計的最后階段,需要向外部暴露自己的開放接口。該誠信系統只需要暴露兩個開放接口,即調用基本信息接口與調用基本信息擴展的誠信信息接口。
SpringSecurity集成OAuth2.0需要實現的步驟如下:
Spring Authorization Server授權服務器端的配置。該配置用于創建授權服務器相關的支持類。
Spring Resource Server的服務端配置。該配置用于創建資源服務器相關的支持類。其作用是提供授權的Servlet過濾器用來保護Web資源。該項配置可以使用基于XML的配置
Spring OAuth2.0 Client的配置,該配置用于創建可以存儲當前請求和上下文環境的Servlet過濾器,用來管理OAuth授權URI的重定向。該項配置可以使用基于XML的配置
當第三方應用需要使用用戶的個人信息檔案或者個人基本信息檔案時,就可以接入本誠信檔案系統。接著頁面跳轉到授權服務器提供授權頁面。用戶輸入有效的賬戶密碼并同意授權。用戶授權頁面如圖3所示。

圖3 用戶授權頁面
同意授權后,根據客戶端應用提供的回調地址,將當前頁面跳轉到客戶端應用頁面,此時客戶端應用可以根據獲取到的code,再向授權服務器獲取Access Token。授權成功跳轉頁面如圖4所示。

圖4 授權成功跳轉頁面
客戶端應用根據Access Token可以得到的信息如圖5所示。客戶端可以得到用戶所允許的個人基本信息及信用狀態信息。由于篇幅,更多詳細信息未列出。

圖5 獲得用戶信息頁面
基于Spring Security,配置了第三方授權平臺的服務端。完成了基礎的授權功能,實現了用戶資源的第三方平臺授權訪問,保證了第三方授權的安全性。
在框架的支持下,Web服務端開發人員僅僅需要配置
[1] 劉大紅,劉 明.第三方應用與開放平臺OAuth認證互連技術研究[J].電腦知識與技術,2012,8(8):5367-5369.
[2] 張衛全,胡志遠.淺析作用于Web2.0安全防范的OpenID和OAuth機制[J].通信管理與技術,2011(2):15-18.
[3] 王春枝,唐俊武.關于IoC模式及輕量級容器的研究[J].湖北工業大學學報,2006,21(4):52-54.
[4] 張 宇,王映輝,張翔南.基于Spring的MVC框架設計與實現[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] 張 銳,張建林,孫國忠.多業務系統的統一認證授權研究與設計[J].計算機工程與設計,2009,30(8):1826-1828.
[9] 蔣 緯,馬光思.Spring與其他框架整合及流程分析[J].計算機工程,2007,33(14):79-81.
[10] 莊少燉.基于Spring的輕量級Web框架研究與實現[D].成都:電子科技大學,2009.
[11] 黃道斌.一種基于SPRINGSECURITY的訪問控制方案[J].軟件導刊,2011,10(8):122-123.
[12] 丁振凡.基于Spring Security的Web資源訪問控制[J].宜春學院學報,2012,34(8):71-74.
[13] 陳雄華.Spring 3.x企業應用開發實戰[M].北京:電子工業出版社,2012.
[14] 肖 云.基于Spring Security安全的Web應用開發[J].計算機與現代化,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
國家自然科學基金資助項目(61271234)
劉 姚(1992-),男,碩士研究生,研究方向為衛星通信技術。
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