在新版本的sas(1.2.1)中获取token更新了授权码校验逻辑,只能用form-data传递参数,使用url-params会失败,原因见issue1451
对应的 commit 在这里: Fix to ensure endpoints distinguish between form and query parameters
前言
文章较长,步骤比较繁琐,请各位读者耐心观看。
上篇文章大概了解了下框架的相关理论,本篇文章将带大家一步步构建一个简单的认证服务器
开始之前先放一下文档的链接:官网文档
项目环境要求(当前框架版本1.1.0)
- spring boot版本大于等于3.1.0-RC1
- JDK版本大于等于17
认证项目搭建
1. 在Idea中或spring Initializr中创建Spring boot项目
-
Spring Boot版本选择3.1.0,Java版本选择17以上,在Dependencies中勾选Spring Authorization Server和spring web依赖,其它看自己需要
引入持久层框架(本人用的是MybatisPlus,读者可自选)
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency>
引入webjars和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>
项目pom.xml示例
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.cssjc.com/42692813413f4730bb24efa1b362e434.png" alt="登录页面图">
3. 输入AuthorizationConfig中配置的账号密码
账号:admin, 密码:123456
4. 登录成功后跳转至授权确认页面
登录成功跳转至第1步的授权接口,授权接口检测到用户未确认授权,跳转至授权确认页面
选择对应的scope并提交确认权限
5. 提交后重定向至第1步的授权接口
授权接口生成code并重定向至第1步请求授权接口时携带的redirectUri地址,重定向时携带上参数code和state,我这里省略掉了state参数,重定向之后只会携带code参数;state用来防止CSRF攻击,正式请求需生成并携带state参数。
6. 用户确认授权后携带code跳转至redirectUri
一般来说配置的回调地址都是客户端的接口,接口在接收到回调时根据code去换取accessToken,接下来我会用postman模拟客户端发起一个http请求去换取token
不知道为什么在手机浏览器上看回调至百度的图片在平台显示违规,这里我放一张另一个回调地址的图片替代7. 根据code换取AccessToken
请求/oauth2/token接口
1. 设置Basic Auth
之前客户端设置的认证方式是
CLIENT_SECRET_BASIC
,所以需将客户端信息添加至请求头2. 添加表单数据,发起POST请求
下列表单数据可添加至form-data
也可添加至url params
参数中的code就是第6步回调时携带的code注意:添加url params时redirect_uri参数要经过encodeURIComponent函数对回调地址进行编码
在新版本的sas(1.2.1)中获取token更新了授权码校验逻辑,只能用form-data传递参数,使用url-params会失败,原因见issue1451
对应的 commit 在这里: Fix to ensure endpoints distinguish between form and query parameters8. 参数解释
1. client_id: 客户端的id 2. client_secret: 客户端秘钥 3. redirect_uri:申请授权成功后的回调地址 4. response_type:授权码模式固定参数code 5. code_verifier:一段随机字符串 6. code_challenge:根据指定的加密方式将code_verifier加密后得到的字符串 7. code_challenge_method:加密方式 8. scope:客户端申请的授权范围 9. state:跟随authCode原样返回,防止CSRF攻击 10. grant_type:指定获取token 的方式: 1. refresh_token:刷新token 2. authorization_code:根据授权码模式的授权码获取 3. client_credentials:客户端模式获取
总结
本篇文章从0到1搭建了一个简单认证服务,解释了认证服务的各项配置用意,如何设置自己的登录页和授权确认页,如何让认证服务解析请求时携带的token,文章过长难免有遗漏的地方,如果文章中有遗漏或错误的地方请各位读者在评论区指出。