No desc

没什么可说的前言

为了获取更全面的控制,还是先接入SSO的为好

流程简图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
graph TD
start((Start))
checkC[GET checkNeedCaptcha, UT]
isNeedC{isNeeded}
toSlider[GET toSliderCaptcha, none]
openSlider[GET openSliderCaptcha, T]
fetchWidth(Fetch width)
fetchAndCrack(Fetch image and track)
verifyCaptcha[POST verifySliderCaptcha, data]
login[POST login]
redirected{ReAuth?}
succ2[Let it redirect]
systemTime[POST systemTime, fake]
reAuth[POST getDynamicCodeByReauth]
waitForUser([Wait for user input])
submit[POST reAuthSubmit]
reAuthSuccess{Success?}
regetLogin[GET login]

start-->checkC
checkC-->isNeedC
isNeedC-->|true|toSlider-->fetchWidth
isNeedC-->|true|login
toSlider-->openSlider-->fetchAndCrack
fetchWidth-->verifyCaptcha
fetchAndCrack-->verifyCaptcha
verifyCaptcha-->succ1{Success?}
succ1-->|false|f1((Failed))
succ1-->|true|login
login-->redirected
redirected-->|false|succ2
redirected-->|true|systemTime-->reAuth-->waitForUser-->submit-->reAuthSuccess
reAuthSuccess-->|false|waitForUser
reAuthSuccess-->|true|regetLogin-->succ2

请求细节

概览

Method Path Return
GET /authserver/checkNeedCaptcha.htl JSON:{"isNeeded":Boolean}
GET /authserver/common/toSliderCaptcha.htl HTML
GET /authserver/common/openSliderCaptcha.htl JSON:{"smallImage":base64,"bigImage":base64,"tagWidth":Int,"yHeight":Int}
POST /authserver/common/verifySliderCaptcha.htl JSON:{"errorCode":Int,"errorMsg":String(success)}
POST /authserver/login HTML
POST /authserver/systemTime JSON:{"systemTime":"2025-05-04 18:29:12"}
POST /authserver/dynamicCode/getDynamicCodeByReauth.do JSON:{"codeTime":120}
POST /authserver/reAuthCheck/reAuthSubmit.do JSON:{"msg":String,"code":"reAuth_failed/reAuth_success"}

各个请求细节

注:自行携带Cookie

checkNeedCaptcha.htl

用途:检查是否需要滑块验证码
参数:带一个username和一个__是以毫秒为单位的时间戳
返回:很简单,就是一个Boolean

toSliderCaptcha.htl

用途:在网页端中,用于显示验证码界面
参数:无
返回:一个HTML的网页,注意可以在这里获取到画板宽度

1
<div id="sliderDiv" style="position: relative; width: 280px; margin: 0px auto;"></div>

openSliderCaptcha.htl

用途:拉取验证码图片
参数:一个_,注意这里_的值应为checkNeedCaptcha.htl请求中_的值+1
返回:一个JSON对象,内含了bigImage(验证码底图)和smallImage(验证码拼图)两张图片的base64,以及tagWidth(小拼图的大小)和没有用的yHeight(据目前观测其值总为0)

verifySliderCaptcha.htl

用途:在线验证滑块验证码
参数:一个form,传入canvasLength(画板宽度)和moveLength(移动距离),距离计算的原点当然是左下角为0
返回:一个JSON对象,内含一个errorCode(成功时为1,失败时为0),和一个errorMsg(成功时为success,失败时为error)

login

用途:最复杂的请求,目前只发掘出一种使用方法——用账号密码登录
参数:一个form,有很多内容,具体如下:

参数 备注
username 顾名思义,用户名
password 顾名思义,密码 加密方式见下
captcha 始终为""
cllt "userNameLogin""qrLogin"
dllt 始终为"generalLogin"
lt 始终为"" 估计是被废弃的选项
execution 从网页端的表单中获取

返回:如果成功,会重定向至目标网页;如果需要多因子验证,会重定向至多因子验证

systemTime

用途:获取系统时间,用途不明(看在它甚至是POST方法的情况下还是写了)
参数:无
返回:一个JSON对象,内含一个键是systemTime,值是格式为yyyy-MM-dd HH:mm:ss的时间

getDynamicCodeByReauth.do

用途:获取动态验证码
参数:一个form,传入username(用户名)和authCodeTypeName(验证方式,一般为reAuthDynamicCodeType
返回:一个JSON对象,内含一个codeTime(估计是验证码发送CD)

reAuthSubmit.do

用途:提交动态验证码
参数:一个form,内容有点多,具体如下:

参数 备注
service 始终为""
reAuthType 始终为"3"
isMutifactor 始终为"true"
password 始终为""
dynamicCode 验证码的值
uuid 始终为""
answer1 始终为""
answer2 始终为""
otpCode 始终为""
skipTmpReAuth 选择之后是否跳过验证

密码的加密

这里发送的密码是一串base64值,是经过加密的,具体如下:
密码使用AES/CBC/Pkcs5Padding进行加密:

参数
明文 随机生成的64位长字符串+用户密码
密码 在主界面获取到的id为pwdEncryptSalt<input>的值
IV 随机生成的16位长字符串

随机字符串的每一个字符为ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678之中的其中之一

后日谈

2025/10/13 22:03 我觉得什么时候要整个OpenAPI的文档……