最近學習了一些Spring Security OAuth2授權認證的實現過程。打算寫一篇博客記錄一下,畢竟自己將要參加工作了,這些技術也是需要學習的內容。
目錄
1.OAuth2是什麼?
在開始正文內容之前,我想先解釋一下,OAuth2是什麼。
OAuth 協議爲用戶資源的授權提供了一個安全的、開放而又簡易的標準。與以往的授權方式不同之處是 OAuth 的授權不會使第三方觸及到用戶的帳號信息(如用戶名與密碼),即第三方無需使用用戶的用戶名與密碼就可以申請獲得該用戶資源的授權,因此 OAuth 是安全的。換言之,就像我們在第三方平臺上需要QQ登錄授權時,第三方平臺並不會拿到我們的qq登錄密碼而是通過QQ提供的第三方登錄系統獲取到了用戶的個人信息,比如頭像和暱稱這些。
所以本文所說的Spring Security其實就是基於OAuth2協議的一種實現方式。它提供了強大的授權和認證方式,可以讓用戶只是通過一些配置的方式就可以實現OAuth2協議中規定的功能。
2.OAuth2中存在的概念描述
(1)交互模型
交互模型涉及三方:
- 資源擁有者:用戶
- 客戶端:APP
- 服務提供方:包含兩個角色
- 認證服務器
- 資源服務器
認證服務器需要對客戶端進行認證,以保證客戶端的有效性,其次認證服務器需要用戶進行認證,比如需要用戶提供賬號和密碼。但是這部分內容是不經過第三方客戶端而是直接調用認證服務器提供的接口,比如QQ的授權登錄界面(如下圖所示)。
認證服務器會爲客戶端提供一個clientid和client_secret。這個是用來進行客戶端認證的過程。在客戶端通過認證服務器的認證後,會讓用戶跳轉到用戶登錄的界面讓用戶輸入用戶名和密碼進行授權,在授權成功後會給客戶端返回一個授權碼code。客戶端需要根據clientid,client_secret以及這個code換取相應的access_token。
(2)四種客戶端授權模式
1> 簡化模式
簡化模式其實是將上述獲取到access_token存儲在頁面上,沒有更新token的功能,沒有持久化存儲的能力,所有的token都是存儲在頁面上的。
2>授權碼模式
授權碼模式適用於有自己的服務器的應用,它是一個一次性的臨時憑證,用來換取 access_token
和 refresh_token
。需要客戶端提供clientid和client_secret來換取code,這個code使用一次之後就會作廢。
3>密碼模式
這個跟上述的授權模式很相似,只是用戶需要提供的自己的用戶名以及密碼。客戶端使用這些信息,向 "服務商提供商" 索要授權。在這種模式中,用戶必須把自己的密碼給客戶端,但是客戶端不得儲存密碼。
4>客戶端模式
如果信任關係再進一步,或者調用者是一個後端的模塊,沒有用戶界面的時候,可以使用客戶端模式。鑑權服務器直接對客戶端進行身份驗證,驗證通過後,返回 token。
上述即爲OAuth2的一些基本知識,下一篇博客我會展示具體的實現代碼,如果之後在工作中涉及到該部分的使用我會進一步跟進。