spring security實戰 4-使用隱式模式(implicit grant type)保護資源

寫在開篇

本改編課程基於《OAuth 2.0 Cookbook_Protect Your Web Applications using Spring Security-Packt Publishing(2017)》。這本書側重經過一個個精簡的小例子來學習,如何使用spring security和oauth2.0來保護你的資源,。git

課程從第二章開始,在Chaptor2,咱們將學習如下內容:github

  1. 使用受權碼模式(Authorization Code grant)保護資源web

  2. 支持隱式受權模式(Implicit grant)
  3. 使用密碼模式(Resource Owner Password Credentials grant type )
  4. 配置客戶端證書受權模式(Client Credentials grant)
  5. 支持refresh tokens
  6. 使用一個關係數據庫來保存tokens和客戶信息
  7. 使用redis保存token
  8. 實現客戶端註冊過程
  9. 中途破壞Oauth 2.0 Provider
  10. 使用Gatling,經過共享數據庫測試token的驗證過程

本節爲隱式模式的用例,該模式直接運行在瀏覽器上(例如Javascript 應用)。本例將容許客戶端以資源全部者的名義經過OAuth2.0保護的api。redis

Getting ready

Java 8+maven
源碼可從如下連接獲取https://github.com/PacktPubli...spring

How to do it…

接下來的步驟將指導你使用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

How it works…

當咱們使用@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 tokenstate,咱們還獲得了兩個參數:token_typeexpires_in。在上一節,使用受權碼模式時,也得到了這些返回參數。重要的是要記住,隱式受權類型不容許按照OAuth2規範發佈刷新令牌(refresh token)。這種行爲是有必要的,它要求在使用運行在瀏覽器中的程序時,用戶必須在場,這樣能夠在任何須要的時候,給第三方應用受權。

除此以外,受權中心有充分的能力來識別用戶的session,避免重複要求資源中心來對客戶端進行驗證和受權。

隱式模式不容許發佈refresh token的另外一個理由是,隱式模式是應用在那些沒法保護機密數據的公共應用,而這是refresh token要作的。

3.如今咱們能夠從api/profile 這個endpoint取回用戶資料了,就像咱們在上一節所作的,記住需攜帶access token,具體參見上一節

There's more…

當使用隱式模式時,第三方應用始終須要經過重定向URI來註冊,這樣能確保不會將access token傳給不須要驗證的客戶端。若是不這樣作,一些心懷不軌的用戶可能先註冊一個應用,而後試圖讓其餘的應用來頂替,接收這個access token,這樣可能致使災難性的結果。

相關文章
相關標籤/搜索