1、Oauth2通過管理和驗證令牌將受保護的資源暴露出去。
2、OAuth2提供者其實是分成授權服務和資源服務兩個角色,可以在一個應用程序或多個應用程序中,也可以有選擇的給授權服務配置多個資源服務。
運行流程:
- 用戶打開客戶端以后,客戶端要求用戶給予授權
- 用戶同意給予客戶端授權
- 用戶端使用獲取的授權向認證服務器申請令牌。
- 認證服務器對客戶端進行認證以后,確認無誤,同意發放令牌。
- 客戶端使用令牌,向資源服務器申請獲取資源。
- 資源服務器確認令牌無誤,同意向客戶端開發資源。
3、獲取令牌的請求是由Spring MVC的控制器來處理的,訪問受保護的資源是通過標准的spring請求過濾器來處理的。
4、url
- /oauth/authrize 用於授權服務請求
- /oauth/token 用於獲取訪問令牌
- /oauth/confirm_access 用戶發送確認授權到這里
- /oauth/error 用戶呈現授權服務器授權出錯的請求
5、OAuth2AuthenticationProcessingFilter 用於加載請求提供的一個授權了的訪問令牌是否有效
6、配置授權服務器:
OAuth客戶端通過將終端用戶導向一個可以輸入證書/口令的授權驗證頁面來獲取授權碼,然后講授權碼傳遞給授權服務器,服務器驗證后重定向頁面
@EnableAuthorizationServer
繼承AuthorizationServerConfigurerAdapter類(實現AuthorizationServerConfigure接口)
- ClientDetailsServiceConfigurer:定義了客戶端細節服務,可以用來定義一個基於內存的或者jdbc的客戶端信息服務。
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
}
客戶端對象的重要屬性:
clientid(客戶端id)、secret(客戶端的私密信息)、scope(客戶端的作用域)、authorizedGrantTypes(授權給客戶端使用的權限類型)authorities(授權給客戶端的權限)
- AuthorizationServerSecurityConfigurer:在令牌端點上定義了安全約束。
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
}
- AuthorizationServerEndpointsConfigurer:定義了授權和令牌端點和令牌服務
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
}
AuthorizationServerTokenServices:
注意:創建一個令牌時必須保存權限信息,這樣后續令牌才可以引用它。訪問令牌用於加載創建令牌時的授權信息。
DefaultTokenServices實現類使用隨機值創建令牌,並處理永久令牌(TokenStore類處理)以外的所有令牌。
令牌存儲方式:
InMemoryTokenStore(默認)對於一個單服務器場景非常使用 JdbcTokenStore:適用於服務器共享數據庫或者同一個服務器有多個實例或授權服務器資源服務器有多個組件
JwkTokenStore:可以加密所有令牌授權訪問的數據,不需要在后台存儲。但是不能方便的撤銷一個已授權的令牌,撤銷授權的操作在刷新令牌中進行。而且存儲的令牌數據會越來越大,因為令牌里面存儲了大量的數據證書信息。
授權類型:
AuthenticationManager 密碼授予
AuthorizationCodeServices 授權碼服務
7、授權碼模式:
- 用戶訪問客戶端,客戶端將用戶導向認證服務器。

client_id(必選項,客戶端id)
response_type(必選項,授權類型,此處固定值code)
redirect_uri(可選項,重定向uri)
scope(可選性,申請的權限范圍)
state(客戶端當前狀態,可以為任意值,服務器會返回該值)
- 用戶選擇是否給予客戶端授權。
授權碼code有效期很短,客戶端只能使用改碼一次,否則會被授權服務器拒絕。該授權碼與客戶端ID和重定向URI是一一對應關系。
假設用戶給予授權,認證服務器將用戶導向重定向URI,同時附上一個授權碼code。

- 客戶端收到授權碼,附上之前的重定向URI,向認證服務器申請令牌。

grant_type:使用的授權模式,必選項,此處固定值“authorization_code”
code:上一步的授權碼,必選項
redirect_uri:上一步的重定向uri,必選項
client_id:客戶端ID,必選項
- 認證服務器核對授權碼和重定向URI,確認無誤后,向客戶端發送訪問令牌和更新令牌。

access_token:訪問令牌,必選項
token_type:令牌類型
expires_in:過期時間,單位為秒
refresh_token:表示更新令牌,用來獲取下一次的訪問令牌
scope:表示權限范圍,如果與客戶端申請的范圍一致,此項可以省略

