1. 程式人生 > >SSO單點登錄之OAuth2.0登錄認證

SSO單點登錄之OAuth2.0登錄認證

保存 types ofo 內容 相關 resources 環境 apt 獲得

一、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:(註:其實實現一個認證服務器就是這麽簡單,加一個註解就搞定,當然真正用到生產環境還是要進行一些配置和復寫工作的。)

br/>一般情況下,創建兩個配置類,一個繼承AuthorizationServerConfigurerAdapter,一個繼承WebSecurityConfigurerAdapter,再去復寫裏面的方法。
主要出現的兩種註解:
1、@EnableAuthorizationServer:聲明一個認證服務器,當用此註解後,應用啟動後將自動生成幾個Endpoint:(註:其實實現一個認證服務器就是這麽簡單,加一個註解就搞定,當然真正用到生產環境還是要進行一些配置和復寫工作的。)
/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進行配置:
br/>在配置類上加上註解@EnableResourceServer即啟動。使用ResourceServerConfigurer進行配置:
(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在當前框架中的使用。

SSO單點登錄之OAuth2.0登錄認證