Spring Cloud Security:Oauth2使用入門


Spring Cloud Security:Oauth2使用入門

摘要

Spring Cloud Security 為構建安全的SpringBoot應用提供了一系列解決方案,結合Oauth2可以實現單點登錄、令牌中繼、令牌交換等功能 。

OAuth2 簡介

OAuth 2.0是用於授權的行業標准協議。OAuth 2.0為簡化客戶端開發提供了特定的授權流,包括Web應用、桌面應用、移動端應用等。

 

OAuth2 相關名詞解釋

  • Resource owner(資源擁有者):擁有該資源的最終用戶,他有訪問資源的賬號密碼;

  • Resource server(資源服務器):擁有受保護資源的服務器,如果請求包含正確的訪問令牌,可以訪問資源;

  • Client(客戶端):訪問資源的客戶端,會使用訪問令牌去獲取資源服務器的資源,可以是瀏覽器、移動設備或者服務器;

  • Authorization server(認證服務器):用於認證用戶的服務器,如果客戶端認證通過,發放訪問資源服務器的令牌。

四種授權模式

  • Authorization Code(授權碼模式):正宗的OAuth2的授權模式,客戶端先將用戶導向認證服務器,登錄后獲取授權碼,然后進行授權,最后根據授權碼獲取訪問令牌;

  • Implicit(簡化模式):和授權碼模式相比,取消了獲取授權碼的過程,直接獲取訪問令牌;

  • Resource Owner Password Credentials(密碼模式):客戶端直接向用戶獲取用戶名和密碼,之后向認證服務器獲取訪問令牌;

  • Client Credentials(客戶端模式):客戶端直接通過客戶端認證(比如client_id和client_secret)從認證服務器獲取訪問令牌。

兩種常用的授權模式

授權碼模式

  • (A)客戶端將用戶導向認證服務器;

  • (B)用戶在認證服務器進行登錄並授權;

  • (C)認證服務器返回授權碼給客戶端;

  • (D)客戶端通過授權碼和跳轉地址向認證服務器獲取訪問令牌;

  • (E)認證服務器發放訪問令牌(有需要帶上刷新令牌)。

密碼模式

  • (A)客戶端從用戶獲取用戶名和密碼;

  • (B)客戶端通過用戶的用戶名和密碼訪問認證服務器;

  • (C)認證服務器返回訪問令牌(有需要帶上刷新令牌)。

 

創建oauth2-server模塊

 

 

 

 

pom.xml文件

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.reno</groupId>
    <artifactId>springcloud.oauth.server</artifactId>
    <version>1.0</version>
    <name>springcloud.oauth.server</name>
    <description>Demo project for Spring Boot</description>
​
​
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
    </properties>
​
​
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency><dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency><dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency><!--        <dependency>-->
<!--            <groupId>org.springframework.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.cloud</groupId>-->
<!--            <artifactId>spring-cloud-netflix-eureka-server</artifactId>-->
<!--            <version>2.2.0.RELEASE</version>-->
<!--        </dependency>-->
​
​
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-oauth2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-security</artifactId>
        </dependency>
​
​
​
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.6.3</version>
        </dependency>
​
​
​
    </dependencies>
​
​
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
​
​
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories><build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build></project>

 

 
        

yml文件

server:
  port: 39401
spring:
  application:
    name: oauth2-service

 

 
        

授權碼模式使用

 

 

 

 

  • 使用授權碼請求該地址獲取訪問令牌:http://localhost:39401/oauth/token

  • 使用Basic認證通過client_id和client_secret構造一個Authorization頭信息; 在body中添加以下參數信息,通過POST請求獲取訪問令牌

 

密碼模式使用

  • 使用密碼請求該地址獲取訪問令牌:http://localhost:39401/oauth/token

  • 使用Basic認證通過client_id和client_secret構造一個Authorization頭信息;

     

 

刷新令牌

在Spring Cloud Security 中使用oauth2時,如果令牌失效了,可以使用刷新令牌通過refresh_token的授權模式再次獲取access_token。

  • 只需修改認證服務器的配置,添加refresh_token的授權模式即可。

  • 使用刷新令牌模式來獲取新的令牌,訪問如下地址:http://localhost:39401/oauth/token

 

 

 本文參考自MacroZheng鏈接 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM