接入SSO的草稿
没什么可说的前言
为了获取更全面的控制,还是先接入SSO的为好
流程简图
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的文档……