第三方验证码中心实现流程,以点击类型的验证码为案例实现

应用场景


用户拥有自己的后台(JAVA,GO等),前台(浏览器或APP等),用户无需自己开发验证码。

验证流程


第三方验证码中心实现流程,以点击类型的验证码为案例实现_第1张图片

流程详解

  1. 作为第三方的验证码中心,需要为每一位客户提供用户id和秘钥,用户根据一定的加密原则,由客户端获取验证码图片
  2. 验证码中心会返回给客户端,图片下载地址,验证码等信息
  3. 客户端将验证码填写完毕,传给验证码中心
  4. 验证码中心验证成功后返回加密信息
  5. 客户发送登录请求前,需要将加密信息再次发到验证码中心校验(二次核验)

总结:
1. 客户端从验证码中心获取图片,验证码等信息
2. 客户端发送验证请求到验证码中心,校验成功,返还给客户端加密token
3. 服务端拿token去请求验证码中心,校验token得合法性

验证中心搭建配置


1. 获取源码

github地址(点击链接)

2. 修改配置 & 启动项目

修改application.properties文件

# 服务启动端口
server.port=8085

# redis (修改为自己的redis服务器)
spring.redis.host=192.168.150.130
spring.redis.port=6379
spring.redis.database=14
spring.redis.password=

# 用户 & 秘钥
captcha.clients[tbc]=abcdefg

验证码中心使用

1. 客户端获取验证码

发送请求:GET请求

参数 描述 是否必填
clientId 用户名,配置文件中的clients ,例如:tbc
randomStr 随机数(保证一分钟内不重复)例如:123
token SHA256加密(security + randomStr),例如:SHA256(abcdefg + 123) ,没有“+”号
width 生成图片的宽度,限制:260-400,默认:300
height 生成图片的高度,限制:100-300,默认:150
length 生成验证码的个数,即图片中包含几个文字,默认为:5,最大限制为8
interfereCount 虚假字符个数,默认为:0

注意:
length = 5 & interfereCount = 2
生成的图片中有5个文字,虚假字符个数为2,只有3个文字的位置是需要验证的

请求路径

http://127.0.0.1:8085/code/click?
	clientId=tbc& // 用户名
	randomStr=123& // 随机数
	interfereCount=2& // 虚假字符个数
	token=200f5183a8d9ef5339eaf6e3987d892e8751036beaa158257c1b65d78e3fa0f2 // 摘要加密SHA256(abcdefg + 123)

返回样例

{
	"status": 1,
	"message": "成功!",
	"data": {
		"code": "惠伪别",	// 要依次点击的文字(因为虚假字符为2,只需要点击这三个字的位置即可)
		"url": "temp/2019-03-12/e82c2d3a-9ac5-40cb-90cd-4378b57d0c16.jpg" // 下载的相对地址(图片中包含5个文字)
	}
}

2. 客户端验证

发送请求:POST请求

参数 描述 是否必填
clientId 用户名,配置文件中的clients ,例如:tbc
randomStr 与第一步中的随机数保持一致,例如:123
token SHA256加密(security + randomStr),例如:SHA256(abcdefg + 123) ,没有“+”号
width 使用时图片的宽度,限制:260-400,默认:300
height 使用时图片的高度,限制:100-300,默认:150

注意:
width= 300 & height= 150
第一步生成图片的时候已经指定了图片的大小,但是在使用过程中,图片可以通过css动态调整宽,高
这两个参数为调整后的图片宽,高

请求路径

http://127.0.0.1:8085/code/click?
	clientId=tbc& // 用户名
	randomStr=123& // 随机数
	token=200f5183a8d9ef5339eaf6e3987d892e8751036beaa158257c1b65d78e3fa0f2 &// 摘要加密SHA256(abcdefg + 123)
	width=300 &// 宽度
	height=150 // 宽度

请求体

[
	// 依次点击的位置,横纵坐标
    [
        89.56606105408488,
        131.01752929343525
    ],
    [
        215.6328867291958,
        96.6122642706682
    ],
    [
        270.23317983101146,
        84.86074188057876
    ]
]

返回样例

{
    "status": 1,
    "message": "成功!",
    "data": "ajsdkljiasgkekljfklasjdiopufipaosd" // 在第三步中需要使用
}

3. 服务端验证


注意:对于安全要求不高的,第三步可以省略,无需服务端校验

发送请求:GET请求

参数 描述 是否必填
clientId 用户名,配置文件中的clients ,例如:tbc
randomStr 与第一步中的随机数保持一致,例如:123
token SHA256加密(security + randomStr),例如:SHA256(abcdefg + 123) ,没有“+”号
confirm 第二步中返回的数据data,例如:ajsdkljiasgkekljfklasjdiopufipaosd

请求路径

http://127.0.0.1:8085/code/click/confirm?
	clientId=tbc& // 用户名
	randomStr=123& // 随机数
	token=200f5183a8d9ef5339eaf6e3987d892e8751036beaa158257c1b65d78e3fa0f2 // 摘要加密SHA256(abcdefg + 123)
	confirm=ajsdkljiasgkekljfklasjdiopufipaosd // 第二步中返回的数据data

返回样例

{
    "status": 1,
    "message": "成功!",
    "data": "校验成功"
}

参考

网易易顿
github源码
国家标识顶级节点


本项目尚未实现客户端样例

有志之士可加微信共同讨论:17702201250

你可能感兴趣的:(java)