Spring Authorization Server:实现OAuth2认证服务
Spring Authorization Server为构建安全的SpringBoot应用提供了一系列解决方案,本节课程我们将结合OAuth2来实现认证服务,该认证服务将支持常用的OAuth2授权模式和刷新Token。
Spring Authorization Server简介
Spring Authorization Server是一个安全框架,它提供了OAuth 2.1和OpenID Connect 1.0规范以及其他相关的实现。Spring Authorization Server是在Spring Security的基础上构建的,它为构建OAuth2授权服务和OpenID Connect 1.0身份提供者提供了一个安全、轻量级、可定制的基础。
OAuth2基本概念
在使用Spring Authorization Server之前,我们需要先对OAuth2有个大致了解,这里我们先来学习下。
简介
OAuth2协议定义了一系列关于认证授权的标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息。目前主流第三方平台提供的授权登录基本都是基于Oauth2协议的,例如微信、QQ、GitHub和Gitee等。而我们要学习的Spring Authorization Server也是基于OAuth2协议的。
相关名词
- 资源拥有者(Resource owner):拥有该资源的最终用户,他拥有访问资源的账号密码。
- 资源服务器(Resource server):拥有受保护资源的服务器,如果请求包含正确的访问令牌,可以访问资源。
- 客户端(Client):访问资源的客户端,会使用访问令牌去获取资源服务器的资源,可以是浏览器、移动设备或者服务器。
- 认证服务器(Authorization server):用于认证用户的服务器,如果客户端认证通过,发放访问资源服务器的令牌。
授权模式
- 授权码模式(Authorization Code Grant):功能最完整、流程最严密的Oauth2授权模式。客户端先将用户导向认证服务器,登录后获取授权码,然后进行授权,最后根据授权码获取访问令牌。
- PKCE授权码模式(Proof Key for Code Exchange):授权码模式的扩展模式,使用授权码授权的OAuth2公共客户端容易受到授权码拦截攻击的影响,该模式通过使用代码交换证明密钥来抵御威胁,可以减轻攻击。
- 客户端模式(Client Credentials):客户端以自己的名义,而不是以用户的名义,向认证服务器进行认证,从而获取访问令牌。
- 设备授权码模式(Device Authorization Grant):是一种凭证式授权类型,主要为那些没有浏览器或输入受限的设备提供认证方式。在这种模式下,设备会引导用户在另一台设备的浏览器中打开一个网页进行登录。用户完成登录后,设备就能够获取所需的访问令牌。
两种常用授权模式
授权码模式
具体流程如下:
- (1)客户端将用户导向认证服务器;
- (2)用户在认证服务器进行登录并授权;
- (3)认证服务器返回授权码给客户端;
- (4)客户端通过授权码和跳转地址向认证服务器获取访问令牌;
- (5)认证服务器发放访问令牌(有需要带上刷新令牌)。
客户端模式
具体流程如下:
- (1)客户端以自己的名义向认证服务器获取访问令牌;
- (2)认证服务器发放访问令牌。
搭建认证服务
接下来我们将创建一个authorization-server
模块,用于演示OAuth2的授权码模式和客户端模式。
项目准备
- 在项目的
pom.xml
中添加相关依赖;
<dependencies><!--oauth2认证服务相关依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-authorization-server</artifactId></dependency><!--SpringBoot Web相关依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--持久层框架Mybatis依赖--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis-spring-boot-starter.version}</version></dependency><!--thymeleaf页面模版引擎依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--由于html中引入了bootstrap,所以需要添加该依赖--><dependency><groupId>org.webjars</groupId><artifactId>webjars-locator-core</artifactId></dependency><dependency><groupId>org.webjars</groupId><artifactId>bootstrap</artifactId><version>5.2.3</version></dependency>
</dependencies>
- 在MySQL中初始化Spring Authorization Server需要的数据库表,该表结构在
spring-security-oauth2-authorization-server-xxx.jar
中,有如下3个脚本;
- 这里已经整理好了一份脚本,创建数据库
authorization-server
,直接执行如下sql脚本即可。
-- oauth2认证许可表
CREATE TABLE oauth2_authorization_consent
(registered_client_id varchar(100) NOT NULL,principal_name varchar(200) NOT NULL,authorities varchar(1000) NOT NULL,PRIMARY KEY (registered_client_id, principal_name)
);
-- oauth2认证信息表
CREATE TABLE oauth2_authorization
(id varchar(100) NOT NULL,registered_client_id varchar(100) NOT NULL,principal_name varchar(200) NOT NULL,authoriz