主题
接口增加验证码
场景
在任何业务场景中,都会使用到“验证码”功能,可以参考以下文档。
一、验证码接口
警告
需要在微服务中编写验证码接口,需要完全按照以下流程来进行。
1.1 引入依赖
本次示例使用hutool验证码生成工具
xml
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-captcha</artifactId>
<version>${hutool.version}</version>
</dependency>
1.2 验证码接口
强制
验证码接口必须返回ResultVo<CaptchaVo>
对象,返回其他的对象会导致异常。
java
@PostMapping(value = "/captcha", produces = MediaType.APPLICATION_JSON_VALUE)
public Mono<ResultVo<CaptchaVo>> captcha() {
AbstractCaptcha captcha = CaptchaUtil.createLineCaptcha(150,60,5,150);
captcha.setGenerator(new RandomGenerator("23456789ABCDEFGHJKLMNPQRSTUVWXYZ",5));
String captchaCode = captcha.getCode();
CaptchaVo vo = new CaptchaVo();
vo.setCode(captchaCode);
vo.setCaptcha(captcha.getImageBase64Data());
return Mono.just(ResultVo.ok(vo));
}
1.3 CaptchaVo对象属性说明
CaptchaVo
完成路径为com.wueasy.base.vo.CaptchaVo
captcha
:图片验证码base64字符串code
:验证码具体值
二、网关配置
警告
网关不需要任何代码开发,只需要按照如下配置。
- 1.验证码拦截器
- 2.配置免登陆接口地址
yaml
logging:
file:
name: ./logs/gateway.log
max-history: 60
max-size: 100MB
level:
root: INFO
server :
port : 8080
spring:
cloud:
loadbalancer:
gateway:
discovery:
locator:
enabled: false
lowerCaseServiceId: true
routes:
#配置路径规则
- id: demo
uri: http://127.0.0.1:8081
predicates:
- Path=/demo/**
filters:
- StripPrefix= 1
data:
#配置redis
redis:
database: 9
host: 127.0.0.1
port: 6379
password: 123456
timeout: 3000
lettuce:
pool:
max-active: 100
max-wait: -1
max-idle: 10
min-idle: 0
wueasy :
gateway:
filter:
session:
enabled: true #启用session拦截器
items:
- type: redis #使用redis存储session信息
redis-auto-expire: true #启用会话自动延期
expire: PT1H #配置会话1小时过期
urls: #配置拦截的url地址,所有的/demo/请求都拦截
- /demo/**
user-login-urls: /demo/login #配置登录接口地址,需要和微服务调用的完全一致。
security-visitor-urls: #配置免登陆接口地址
- /demo/login
- /demo/captcha
captcha:
enabled: true #启用验证码拦截器
items:
- generate-urls: #生成验证码的接口地址
- /demo/captcha
verify-urls: #需要验证的接口地址
- /demo/login
code-field-name: code #临时code的参数名称
value-field-name: captcha #验证码值的参数名称
parameter-type: body #参数类型
三、请求接口
TIP
通过发起登录请求,获取登录结果。
3.1 发起请求示例
shell
curl --location --request POST "http://127.0.0.1:8080/demo/login" ^
--header "User-Agent: Apifox/1.0.0 (https://apifox.com)" ^
--header "Content-Type: application/json" ^
--header "Accept: */*" ^
--header "Host: 127.0.0.1:8080" ^
--header "Connection: keep-alive" ^
--data-raw "{ \"accountNo\": \"admin\", \"password\": \"123456\", \"code\":\"27c6e1a15600fbe82b3907bbe2831ce0\", \"captcha\":\"1234\"}"
3.2 接口返回结果
authorization
值为用户访问令牌
json
{
"code": 0,
"data": {
"authorization": "demo:1:2f202192dd2744b9f5589080d765e43e"
},
"successful": true
}