(十)JavaspringcloudB2B2Co2o多使用者商城springcloud架構-SSO單點登入之OAuth2.0登入認證(1)

it芒果發表於2018-12-13

之前寫了很多關於spring cloud的文章,今天我們對OAuth2.0的整合方式做一下筆記,首先我從網上找了一些關於OAuth2.0的一些基礎知識點,幫助大家回顧一下知識點:
 
一、oauth中的角色
client:呼叫資源伺服器API的應用

Oauth 2.0 Provider:包括Authorization Server和Resource Server

(1)Authorization Server:認證伺服器,進行認證和授權

(2)Resource Server:資源伺服器,保護受保護的資源
user:資源的擁有者

二、下面詳細介紹一下Oauth 2.0 Provider
Authorization Server:
(1)AuthorizationEndpoint:進行授權的服務,Default URL: /oauth/authorize

(2)TokenEndpoint:獲取token的服務,Default URL: /oauth/token  

Resource Server:
OAuth2AuthenticationProcessingFilter:給帶有訪問令牌的請求載入認證

三、下面再來詳細介紹一下Authorization Server:
一般情況下,建立兩個配置類,一個繼承AuthorizationServerConfigurerAdapter,一個繼承WebSecurityConfigurerAdapter,再去複寫裡面的方法。

主要出現的兩種註解:
1、@EnableAuthorizationServer:宣告一個認證伺服器,當用此註解後,應用啟動後將自動生成幾個Endpoint:(注:其實實現一個認證伺服器就是這麼簡單,加一個註解就搞定,當然真正用到生產環境還是要進行一些配置和複寫工作的。)

/oauth/authorize:驗證

/oauth/token:獲取token

/oauth/confirm_access:使用者授權

/oauth/error:認證失敗

/oauth/check_token:資源伺服器用來校驗token

/oauth/token_key:如果jwt模式則可以用此來從認證伺服器獲取公鑰

以上這些endpoint都在原始碼裡的endpoint包裡面。

2、@Beans:需要實現AuthorizationServerConfigurer

AuthorizationServerConfigurer包含三種配置:

ClientDetailsServiceConfigurer:client客戶端的資訊配置,client資訊包括:clientId、secret、scope、authorizedGrantTypes、authorities

(1)scope:表示許可權範圍,可選項,使用者授權頁面時進行選擇

(2)authorizedGrantTypes:有四種授權方式 

Authorization Code:用驗證獲取code,再用code去獲取token(用的最多的方式,也是最安全的方式)
Implicit: 隱式授權模式
Client Credentials (用來取得 App Access Token)
Resource Owner Password Credentials
(3)authorities:授予client的許可權

這裡的具體實現有多種,in-memory、JdbcClientDetailsService、jwt等。

AuthorizationServerSecurityConfigurer:宣告安全約束,哪些允許訪問,哪些不允許訪問

AuthorizationServerEndpointsConfigurer:宣告授權和token的端點以及token的服務的一些配置資訊,比如採用什麼儲存方式、token的有效期等

 

client的資訊的讀取:在ClientDetailsServiceConfigurer類裡面進行配置,可以有in-memory、jdbc等多種讀取方式。

jdbc需要呼叫JdbcClientDetailsService類,此類需要傳入相應的DataSource.

 

下面再介紹一下如何管理token:
AuthorizationServerTokenServices介面:宣告必要的關於token的操作

(1)當token建立後,儲存起來,以便之後的接受訪問令牌的資源可以引用它。

(2)訪問令牌用來載入認證

介面的實現也有多種,DefaultTokenServices是其預設實現,他使用了預設的InMemoryTokenStore,不會持久化token;

 

token儲存方式共有三種分別是:
(1)InMemoryTokenStore:存放記憶體中,不會持久化

(2)JdbcTokenStore:存放資料庫中

(3)Jwt: json web token

 

授權型別:
可以通過AuthorizationServerEndpointsConfigurer來進行配置,預設情況下,支援除了密碼外的所有授權型別。相關授權型別的一些類:

(1)authenticationManager:直接注入一個AuthenticationManager,自動開啟密碼授權型別

(2)userDetailsService:如果注入UserDetailsService,那麼將會啟動重新整理token授權型別,會判斷使用者是否還是存活的

(3)authorizationCodeServices:AuthorizationCodeServices的例項,auth code 授權型別的服務

(4)implicitGrantService:imlpicit grant

(5)tokenGranter:

 

endpoint的URL的配置:
(1)AuthorizationServerEndpointsConfigurer的pathMapping()方法,有兩個引數,第一個是預設的URL路徑,第二個是自定義的路徑

(2)WebSecurityConfigurer的例項,可以配置哪些路徑不需要保護,哪些需要保護。預設全都保護。

 

自定義UI:
(1)有時候,我們可能需要自定義的登入頁面和認證頁面。登陸頁面的話,只需要建立一個login為字首名的網頁即可,在程式碼裡,設定為允許訪問,這樣,系統會自動執行你的登陸頁。此登陸頁的action要注意一下,必須是跳轉到認證的地址。

(2)另外一個是授權頁,讓你勾選選項的頁面。此頁面可以參考原始碼裡的實現,自己生成一個controller的類,再建立一個對應的web頁面即可實現自定義的功能。

 

下面梳理一下授權獲取token流程:
(1)埠號換成你自己的認證伺服器的埠號,client_id也換成你自己的,response_type型別為code。

 localhost:8080/uaa/oauth/authorize?client_id=client&response_type=code&redirect_uri=http://www.baidu.com
(2)這時候你將獲得一個code值:http://www.baidu.com/?code=G0C20Z

(3)使用此code值來獲取最終的token:

curl -X POST -H “Cant-Type: application/x-www-form-urlencoded” -d `grant_type=authorization_code&code=G0C20Z&redirect_uri=http://www.baidu.com` “http://client:secret@localhost:8080/uaa/oauth/token”

返回值:

{“access_token”:”b251b453-cc08-4520-9dd0-9aedf58e6ca3″,”token_type”:”bearer”,”expires_in”:2591324,”scope”:”app”}

 

(4)用此token值來呼叫資源伺服器內容(如果資源伺服器和認證伺服器在同一個應用中,那麼資源伺服器會自己解析token值,如果不在,那麼你要自己去做處理)

curl -H “Authorization: Bearer b251b453-cc08-4520-9dd0-9aedf58e6ca3” “localhost:8081/service2(此處換上你自己的url)”

 

四、Resource Server:保護資源,需要令牌才能訪問
在配置類上加上註解@EnableResourceServer即啟動。使用ResourceServerConfigurer進行配置:

(1)tokenServices:ResourceServerTokenServices的例項,宣告瞭token的服務

(2)resourceId:資源Id,由auth Server驗證。

(3)其它一些擴充套件點,比如可以從請求中提取token的tokenExtractor

(4)一些自定義的資源保護配置,通過HttpSecurity來設定

 

使用token的方式也有兩種:

(1)Bearer Token(https傳輸方式保證傳輸過程的安全):主流

(2)Mac(http+sign)

 

如何訪問資源伺服器中的API?

如果資源伺服器和授權伺服器在同一個應用程式中,並且您使用DefaultTokenServices,那麼您不必太考慮這一點,因為它實現所有必要的介面,因此它是自動一致的。如果您的資源伺服器是一個單獨的應用程式,那麼您必須確保您匹配授權伺服器的功能,並提供知道如何正確解碼令牌的ResourceServerTokenServices。與授權伺服器一樣,您可以經常使用DefaultTokenServices,並且選項大多通過TokenStore(後端儲存或本地編碼)表示。

(1)在校驗request中的token時,使用RemoteTokenServices去呼叫AuthServer中的/auth/check_token。

(2)共享資料庫,使用Jdbc儲存和校驗token,避免再去訪問AuthServer。

(3)使用JWT簽名的方式,資源伺服器自己直接進行校驗,不借助任何中間媒介。

 

五、oauth client
在客戶端獲取到token之後,想去呼叫下游服務API時,為了能將token進行傳遞,可以使用RestTemplate.然後使用restTemplate進行呼叫Api。

注:

scopes和authorities的區別:

scopes是client許可權,至少授予一個scope的許可權,否則報錯。

authorities是使用者許可權。   

以上是我從網上找到的一篇寫的不錯的部落格,希望可以幫助大家快速瞭解OAuth2.0,下一篇文章我們正式介紹OAuth2.0在當前框架中的使用。 

從現在開始,我這邊會將近期研發的spring cloud微服務雲架構的搭建過程和精髓記錄下來,幫助更多有興趣研發spring cloud框架的朋友,大家來一起探討spring cloud架構的搭建過程及如何運用於企業專案。完整專案的原始碼來源


相關文章