Spring Cloud雲架構 - SSO單點登陸之OAuth2.0登陸認證(1)

以前寫了不少關於spring cloud的文章,今天咱們對OAuth2.0的整合方式作一下筆記,首先我從網上找了一些關於OAuth2.0的一些基礎知識點,幫助你們回顧一下知識點:html

1、oauth中的角色 client:調用資源服務器API的應用 Oauth 2.0 Provider:包括Authorization Server和Resource Server (1)Authorization Server:認證服務器,進行認證和受權 (2)Resource Server:資源服務器,保護受保護的資源 user:資源的擁有者web

2、下面詳細介紹一下Oauth 2.0 Provider Authorization Server: (1)AuthorizationEndpoint:進行受權的服務,Default URL: /oauth/authorize (2)TokenEndpoint:獲取token的服務,Default URL: /oauth/token
Resource Server: OAuth2AuthenticationProcessingFilter:給帶有訪問令牌的請求加載認證spring

3、下面再來詳細介紹一下Authorization Server: 通常狀況下,建立兩個配置類,一個繼承AuthorizationServerConfigurerAdapter,一個繼承WebSecurityConfigurerAdapter,再去複寫裏面的方法。 主要出現的兩種註解: 一、@EnableAuthorizationServer:聲明一個認證服務器,當用此註解後,應用啓動後將自動生成幾個Endpoint:(注:其實實現一個認證服務器就是這麼簡單,加一個註解就搞定,固然真正用到生產環境仍是要進行一些配置和複寫工做的。) /oauth/authorize:驗證 /oauth/token:獲取token /oauth/confirm_access:用戶受權 /oauth/error:認證失敗 /oauth/check_token:資源服務器用來校驗token /oauth/token_key:若是jwt模式則能夠用此來從認證服務器獲取公鑰 以上這些endpoint都在源碼裏的endpoint包裏面。數據庫

二、@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的權限json

這裏的具體實現有多種,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:app

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)"

4、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簽名的方式,資源服務器本身直接進行校驗,不借助任何中間媒介。

5、oauth client 在客戶端獲取到token以後,想去調用下游服務API時,爲了能將token進行傳遞,可使用RestTemplate.而後使用restTemplate進行調用Api。 注: scopes和authorities的區別: scopes是client權限,至少授予一個scope的權限,不然報錯。 authorities是用戶權限。

以上是我從網上找到的一篇寫的不錯的博客,但願能夠幫助你們快速瞭解OAuth2.0,下一篇文章咱們正式介紹OAuth2.0在當前框架中的使用。

從如今開始,我這邊會將近期研發的spring cloud微服務雲架構的搭建過程和精髓記錄下來,幫助更多有興趣研發spring cloud框架的朋友,你們來一塊兒探討spring cloud架構的搭建過程及如何運用於企業項目。

源碼來源:http://minglisoft.cn/honghu/technology.html

相關文章
相關標籤/搜索