Spring Cloud Security:Oauth2使用入门

Spring Cloud Security:Oauth2使用入门

摘要

Spring Cloud Security 为构建安全的SpringBoot应用提供了一系列解决方案,结合Oauth2可以实现单点登录、令牌中继、令牌交换等功能 。

OAuth2 简介

OAuth 2.0是用于授权的行业标准协议。OAuth 2.0为简化客户端开发提供了特定的授权流,包括Web应用、桌面应用、移动端应用等。

作者:MacroZheng链接:https://juejin.cn/post/6844903940312530957来源:掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

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模块

 Spring Cloud Security:Oauth2使用入门

 

 

 

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

 


授权码模式使用

 Spring Cloud Security:Oauth2使用入门

Spring Cloud Security:Oauth2使用入门

 

 

 

  • 使用授权码请求该地址获取访问令牌:http://localhost:39401/oauth/token

  • 使用Basic认证通过client_id和client_secret构造一个Authorization头信息; 在body中添加以下参数信息,通过POST请求获取访问令牌

Spring Cloud Security:Oauth2使用入门

 

密码模式使用

  • 使用密码请求该地址获取访问令牌:http://localhost:39401/oauth/token

  • 使用Basic认证通过client_id和client_secret构造一个Authorization头信息;

     

Spring Cloud Security:Oauth2使用入门

 

刷新令牌

在Spring Cloud Security 中使用oauth2时,如果令牌失效了,可以使用刷新令牌通过refresh_token的授权模式再次获取access_token。

  • 只需修改认证服务器的配置,添加refresh_token的授权模式即可。

  • 使用刷新令牌模式来获取新的令牌,访问如下地址:http://localhost:39401/oauth/token

 

Spring Cloud Security:Oauth2使用入门

 

 本文参考自MacroZheng链接 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

上一篇:spring security+oauth2重写/oauth/token接口


下一篇:CocosCreator原生平台退出游戏,暂停和继续