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模块
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
授权码模式使用
-
启动oauth2-server服务;
-
在浏览器访问该地址进行登录授权:http://localhost:39401/oauth/authorize?client_id=wuzzClientId&response_type=code&redirect_uri=http://www.baidu.com&scope=all
-
输入账号密码进行登录(admin 123456)操作:
-
使用授权码请求该地址获取访问令牌: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链接 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。