SpringBoot + Spring Security OAuth2基本使用

SpringBoot + Spring Security OAuth2基本使用

基本配置

maven配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.luoq</groupId>
    <artifactId>test_oauth</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    
    <name>test_oauth</name>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
      
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

認證服務器 Authorization Server

在過OAuth2.0有一個服務提供商,新建一個類,並添加相應的註解

@Configuration
@EnableAuthorizationServer
public class MyAuthorizationServerConfig {

}

隨後我們啓動項目,就會發現控制檯有如下的語句打印:

這就表明Authorization Server已經建立起來了。我們可根據OAuth的規則來訪問相應的接口。

第三方應用 User authenticates

在有了服務提供商之後,我們就可以根據OAuth的規則,來要求用戶給予授權。 這裏我們以code模式爲例。 所以這裏需要第三方應用去調用接口

http://localhost:8080/oauth/authorize?response_type=code&client_id=4b35d6b6-aed5-45a2-83cc-28d134317618&redirect_uri=http://www.baidu.com&scope=all

這裏對接口參數做一個簡單的介紹。

  • localhost:8080  這裏是我服務的地址以及端口,根據每個人的情況是不同的
  • /oauth/authorize  這個是Spring Security OAuth2默認提供的接口
  • response_type:表示授權類型,必選項,此處的值固定爲”code”
  • client_id: 表示客戶端的ID,必選項。這裏使用的是項目啓動時,控制檯輸出的security.oauth2.client.clientId,當然該值可以在配置文件中自定義
  • redirect_uri:表示重定向URI,可選項。即用戶授權成功後,會跳轉的地方,通常是第三方應用自己的地址
  • scope:表示申請的權限範圍,可選項。這一項用於服務提供商區分提供哪些服務數據
  • state:表示客戶端的當前狀態,可以指定任意值,認證服務器會原封不動地返回這個值。這裏沒有使用到該值

這裏我們訪問到接口後,會出現如下的界面,該界面用於用戶登錄

springboot securyt 默認的用戶名和密碼

用戶名:user

密碼在控制檯,每次啓動的時候會生成一個隨機的密碼,如下:

輸入用戶名和密碼,點擊登錄後,出現如下的界面:

這裏就是要求用戶授權的界面了,有點類似於我們使用百度、QQ、微信等進行第三方登錄時候的界面,這裏是簡易版。

我們這裏就點確認授權,這裏就會根據配置的redirect_uri進行跳轉,並且是帶有一個參數的。 

選擇Deny會跳轉: https://www.baidu.com/?error=access_denied&error_description=User%20denied%20access
選擇Approve會跳轉: https://www.baidu.com/?code=ePQZAz

這個code就是下一步第三方應用向服務器申請令牌使用的

請求Token

這裏我們拿着上一步獲取到的code,以及控制檯打印的clientId和secret去獲取Token。 這裏需要使用POST方法

請求的Header中有一個Authorization參數,該參數的值是Basic + (clientId:secret Base64值)

  • grant_type:表示使用的授權模式,必選項,此處的值固定爲”authorization_code”。
  • code:表示上一步獲得的授權碼,必選項。
  • redirect_uri:表示重定向URI,必選項,且必須與獲取code步驟中的該參數值保持一致。

 如果請求成功,就可以順利的拿到Token

  • access_token:表示訪問令牌,必選項。
  • token_type:表示令牌類型,該值大小寫不敏感,必選項,可以是bearer類型或mac類型。
  • expires_in:表示過期時間,單位爲秒。如果省略該參數,必須其他方式設置過期時間。
  • refresh_token:表示更新令牌,用來獲取下一次的訪問令牌,可選項。
  • scope:表示權限範圍,如果與客戶端申請的範圍一致,此項可省略。

 

資源服務器

和認證服務器一樣,這裏實現資源服務器就很容易了

@Configuration
@EnableResourceServer
public class MyResourceServerConfig {

}

這樣我們就可以用Token來訪問接口了。 
例如:

GET /user HTTP/1.1 
Host: localhost:8082 
Authorization: bearer 9b2aaea4-d161-4636-8883-6756a372e735

這裏Authorization中,bearer 是上一步返回的token_type。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章