OAuth2.0 OAuth 引入了一個授權層,用來分離兩種不同的角色:客戶端和資源所有者。客戶端來申請資源,資源所有者同意以後,資源伺服器可以向客戶端頒發令牌。客戶端通過令牌,去請求數據。也就是說,OAuth 的核心就是向第三方應用頒發令牌。而且,OAuth 2.0 規定了四種獲得令牌的流程。你可 ...
OAuth2.0
OAuth 引入了一個授權層,用來分離兩種不同的角色:客戶端和資源所有者。客戶端來申請資源,資源所有者同意以後,資源伺服器可以向客戶端頒發令牌。客戶端通過令牌,去請求數據。也就是說,OAuth 的核心就是向第三方應用頒發令牌。而且,OAuth 2.0 規定了四種獲得令牌的流程。你可以選擇最適合自己的那一種,向第三方應用頒發令牌。
具體的OAuth學習建議仔細研讀阮一峰的教程,
- http://www.ruanyifeng.com/blog/2019/04/oauth_design.html
下麵我們來使用spring cloud security 和 spring cloud oauth2兩個組件來簡單實現授權流程。
授權服務
下麵我們來使用spring cloud security 實現一個授權服務,首先來引入依賴:
除了一個web組件,只引入了一個spring-cloud-starter-oauth2,這是因為spring cloud下的oauth2組件已經包含了security:
首先寫一個正常的登錄功能,application配置文件和啟動類都不用增加特殊配置,主要來配置security配置類:
這裡面基本沒有特殊的配置,都是前面遇到過的熟悉的配置。有了這個配置類,基本的登錄功能就有了,要想有授權功能,還需要一個授權配置類,授權配置類需要繼承 AuthorizationServerConfigurerAdapter 類,並引入 @EnableAuthorizationServer 註解:
首先配置一個客戶端:
然後配置token的存儲和管理,此處使用secret作為秘鑰,後面會介紹使用非對稱加密的方式 :
上面的token存儲在了記憶體中,token也可以存儲在資料庫或者redis中。最後配置授權端點的訪問控制:
以上就是一個簡答的授權服務。
資源服務
下麵來搭建一個資源服務,其實授權和資源服務是可以合二為一的,此處為了清晰,將它們分開。pom中引入的依賴和授權服務是一樣的,同樣,配置文件和啟動類不需要做特殊配置。首先來寫兩個簡單的介面,一個定義為受保護,另一個不受保護:
然後定義一個資源服務配置類,需要繼承 ResourceServerConfigurerAdapter 類,並引入 @EnableResourceServer 註解:
首先來看令牌驗證的配置:
然後來看介面資源的攔截規則:
save開頭的可以直接訪問,不會被攔截,/user/save介面會被驗證。
註意上面配置的clientId和secret都是單一的配置死的,如果需要對多客戶端動態進行認真,需要重寫,後面是通過http調用的方式解析訪問令牌(主要是通過訪問授權服務的/oauth/check_token解析)。
測試
我們來根據前面說到的流程測試,首先向授權服務申請一個授權碼:
- http://localhost:8015/oauth/authorize?client_id=clientId&response_type=code&redirect_uri=http://localhost:8015/
訪問首先會跳轉到登錄頁面:
輸入配置中預設的用戶名密碼登錄,然後進入下一個頁面:
這個頁面是真正的授權頁面,選擇Approve,點擊按鈕,同意授權,授權碼會通過回調地址獲取,如下圖:
然後攜帶授權碼申請訪問令牌,需要訪問下麵的地址(需要使用post方式):
- http://localhost:8015/oauth/token?grant_type=authorization_code&code=授權碼&redirect_uri=http://localhost:8015/&client_id=clientId&client_secret=secret
將授權碼替換上面地址中的授權碼三個字,然後在postman中訪問:
其返回結果中,包含access_token參數,就是我們需要的訪問令牌,token_type 參數說明瞭令牌的類型,一般類型為bearer或者refresh_token可以在訪問令牌過期後向授權服務申請新的令牌,expires_in參數是令牌的有效時間,單位是秒,圖中顯示預設是12個小時。令牌已經得到了,下麵來訪問資源介面,首先試一下不受保護的資源:
可以看到直接就能訪問,然後訪問受保護的資源介面:
得到這樣的結果說明該介面需要認證,我們來使用我們前面得到的令牌來訪問,首先選擇正確的認真協議:
然後在右側填寫前面獲取的access_token:
然後訪問介面,就能看到受保護的資源通過令牌可以訪問:
代碼地址 : https://gitee.com/blueses/spring-boot-security 15 和 16