本改編課程基於《OAuth 2.0 Cookbook_Protect Your Web Applications using Spring Security-Packt Publishing(2017)》。這本書側重經過一個個精簡的小例子來學習,如何使用spring security和oauth2.0來保護你的資源,。git
課程從第二章開始,在Chaptor2,咱們將學習如下內容:github
本節爲隱式模式的用例,該模式直接運行在瀏覽器上(例如Javascript 應用)。本例將容許客戶端以資源全部者的名義經過OAuth2.0保護的api。redis
Java 8+maven
源碼可從如下連接獲取https://github.com/PacktPubli...spring
接下來的步驟將指導你使用Spring Security OAuth2 搭建一個受權中心和一個資源服務器:數據庫
1.使用Spring Initializr 新建一個Springboot工程,加入web
,security
依賴,本例使用的springboot版本爲「1.5.4.RELEASE」。segmentfault
2.打開pom.xml
,加入如下依賴:api
<dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> </dependency>
3.打開application.properties
文件,輸入:瀏覽器
security.user.name=adolfo security.user.password=123
4.新建UserProfile類與UserController類,內容與《學習3》中一致,這個是獲取資源的接口。springboot
5.新建OAuth2ResourceServer類,內容與《學習3》中一致,這個是資源管理器配置。
6.新建OAuth2AuthorizationServer類,即配置受權中心,注意其中的不一樣之處:
@Configuration @EnableAuthorizationServer public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter{ @Override public void configure(ClientDetailsServiceConfigurer clients)throws Exception{ clients.inMemory() .withClient("clientapp") .secret("123456") .redirectUris("http://localhost:9000/callback") .authorizedGrantTypes("implicit") .accessTokenValiditySeconds(120) .scopes("read_profile","read_contacts"); } }
7.至此,咱們已經完成了全部步驟,能夠看出,在spring security框架中,受權碼模式和隱式模式的構建模式很類似,僅僅在於配置受權中心時,設置不一樣的authorizedGrantTypes
。
當咱們使用@EnableAuthorizationServer
和@EnableResourceServer
這兩個標籤時,意味着,咱們將Oauth 2.0的 endpoint加入到咱們的項目中,與上一節的不一樣之處在於,咱們使用了不一樣的受權模式,所以驗證流程有一點點不一樣。此外,咱們還必須知道的是,咱們無需再往/oauth/token
發請求,由於咱們如今是隱式模式。
接下來,咱們來運行這個項目
1.首先,咱們往受權中心發送以下請求:
http://localhost:8080/oauth/authorize?client_id=clientapp&redirect_uri=http://localhost:9000/callback&response_type=token&scope=read_profile&state=xyz
注意,此時response_type
的參數值爲token
,而不是以前的code
。而且,咱們的url沒有使用編碼,此處是做爲教學用例因此省略,但在實際生產項目中,請記住要對全部參數進行編碼。
當請求到達受權中心的endPoint後,受權中心將會要求資源全部者作身份驗證
輸入用戶名密碼後,將會跳到受權頁面:
2.選擇所需的scope
,點擊Authorize
,你將跳回到以前設置的redirect uri
,正如你所見,回調路徑攜帶了咱們須要的access token
和以前輸入的state
http://localhost:9000/callback#access_token=a68fce80-522f-43ee-85d4-6705c34 e555c&token_type=bearer&state=xyz&expires_in=119
除了access token
和state
,咱們還獲得了兩個參數:token_type
和expires_in
。在上一節,使用受權碼模式時,也得到了這些返回參數。重要的是要記住,隱式受權類型不容許按照OAuth2規範發佈刷新令牌(refresh token)。這種行爲是有必要的,它要求在使用運行在瀏覽器中的程序時,用戶必須在場,這樣能夠在任何須要的時候,給第三方應用受權。
除此以外,受權中心有充分的能力來識別用戶的session,避免重複要求資源中心來對客戶端進行驗證和受權。
隱式模式不容許發佈refresh token的另外一個理由是,隱式模式是應用在那些沒法保護機密數據的公共應用,而這是refresh token要作的。
3.如今咱們能夠從api/profile
這個endpoint取回用戶資料了,就像咱們在上一節所作的,記住需攜帶access token,具體參見上一節。
當使用隱式模式時,第三方應用始終須要經過重定向URI來註冊,這樣能確保不會將access token傳給不須要驗證的客戶端。若是不這樣作,一些心懷不軌的用戶可能先註冊一個應用,而後試圖讓其餘的應用來頂替,接收這個access token,這樣可能致使災難性的結果。