認證服務器已經搭建好了。 可以通過認證服務器拿到令牌
下面改造訂單服務,讓它可以用這個令牌。

爭對訂單服務要做三個事,
1。讓訂單服務知道它自己是Oauth協議里面的資源服務器。,它知道這個事后,它才會在自己的應用前面去加一個過濾器,然后去校驗這個令牌。
2.讓它知道自己是什么資源服務器。讓它聲明一下,因為我們之前在認證服務器上,下面這個地方配置了發出去的令牌只能訪問order-server這樣一個資源服務器。所以我讓它自己知道它是order-server

3.在訂單服務上,配置怎么去驗證這個令牌。去哪驗,驗的時候要帶什么信息。這些都是在訂單服務上要做的事情。
開始寫代碼
這里先注釋掉。

創建server.resources包

pom.xml內引入oauth2的引用。這樣就會把Oauth協議相關的資源引進來。

有了依賴后,來寫代碼
繼承這個適配器。


@EnableResourceServer告訴OrderService這個應用,它本身是作為oauth協議里面的資源服務器的角色存在的

ResourceServerConfigurerAdapter有兩個配置方法,一個是配資源服務器的,本身的相關的配置
兩外一個是HttpSecurity相關的配置。

@EbableResourceServer配置好了以后,表示它是一個資源服務器,下面只要配置資源服務器的id

下面是認證中心的定義

覆蓋掉配置方法configure方法,一定要配置在認證中心定義的一樣。叫做order-server

那么我給orderAapp發出去的令牌現在只能訪問order-server

另一個方法實際上是在控制器權限
加上EnableResourceServer的注解后,所有發往order-api服務器的所有請求,它都會去你的頭里面找Token。如果找不到token就不讓你過。就是這樣一個邏輯。

這個邏輯實際上這里來控制的,這是默認的一個配置。anyRequest就是任何請求,authenticated 是一定要身份認證。

所以就因為有了上面的配置,當我啟動了以后,order-server里面提供所有的服務都會去驗證token,沒有token就不讓過。有些情況下我們會去做權限控制。哪些請求需要驗令牌,哪些請求不需要驗令牌,當你需要做這樣的控制的時候。就可以覆蓋下面這個方法。重寫里面的配置。

除了哈哈這個請求意外,其他的都需要驗證令牌。


驗證令牌-配置文件
驗證令牌怎么來驗,我們寫另外一個配置文件。


寫上這兩個注解

從圖里可以看到,我們驗證令牌 需要發一個遠程的請求到認證服務器。

需要聲明一個新的Bean來做這個事。資源服務器的令牌服務。ResourceServerTokenServices它是一個接口,我們會有各種各樣的實現。

我們用的這個實現叫做 RemoteTokenServices,從名字可以看出來,它是一個調用遠程服務的TokenServices

調用遠程服務就要告訴他clientId和clientSecret。
setCheckTokenEndpointUrl:校驗服務的地址。


還要讓它知道調用這個服務去驗token,所謂的驗token,就是拿這個token去獲取用戶信息,問一下認證服務器,這個令牌對應的用戶信息是什么樣的
如果你想驗證 跟用戶相關的信息,應該用這個AuthenticationManager

所以這里我要覆蓋掉的方法是authenticationManager

把AuthenticationManagger暴露成一個Bean。加上@Bean注解。

這個時候就不能用系統默認的了 ,我們要自己寫一個AuthenticationManager

那么做了這個配置以后。當我們的資源服務器,也就是order-api攔截到請求里面的token的時候。他就會調用這個方法來驗證這個token

tokenServices里面配置的這個地址去驗證token。獲取token對應的用戶信息。

獲取到用戶信息之后,如何讓我自己寫的這個應用知道這個用戶信息。比如創建訂單的時候,帶着一個令牌來訪問創建訂單的方法,那么在創建訂單的方法里面,我如何知道這個令牌里的用戶信息到底是哪個用戶。
用@AuthenticationPrincipal 這樣就拿到了用戶名。這里目前寫String,拿到用戶名。

日志輸出拿到的用戶名。
啟動服務

端口是9080

調用創建訂單的服務

因為已經加上資源服務的配置了,所以調用的時候 就是401錯誤。需要認證認證了。

之前拿令牌的方法 我們再去獲取下

反復申請的令牌,如果沒過期,他會把這個令牌再給你。只不過 過期時間減少了。

在創建訂單的服務上面 ,加上這個 authorization 值是復制過來的token令牌。

httpBasic也是用的 authorization的請求頭,那么服務器如果知道你是HttpBasic還是OAuth2的令牌。我們在token前面加上 bearer 空格+token。
這樣服務器就知道這是Oauth2的令牌,他就會用不同的邏輯去解這個令牌。


控制台輸出的用戶名

如果order-api的配置文件內把自己的resourceId改掉了,改成xxx-server

再次啟動orderAPi

再去發送創建訂單的請求

access_denied:沒權限

這是一個無效的token,里面沒有包含xxx-server的權限。

token在下發的時候可以訪問order-server。上面的服務器是xxx-server所以是訪問不了的
獲取到的用戶名
就是我們在獲取token的時候,傳過去的用戶名。

調用創建訂單的服務

創建訂單的服務里面,寫這樣一個注解 就拿到了令牌對應的用戶名是誰了。
修改其他的
比如說修改ClientSecret改成 1234567 加了個7 這樣就是錯誤的了。

重啟orderAPI的服務
去驗證令牌的時候,信息傳錯了。


看下控制台的錯誤信息。401就是身份認證失敗。為什么認證失敗 就是因為clientSceret傳錯了。

現在確實是通過一個遠程的服務驗證令牌的

資源服務器相關的內容,暫時就講到這里。
結束
