接入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的文档……