上一篇分析了杭电助手健康打卡的接口,但是在 Header 参数 authorizationtoken 有效期只有一个月,必须每个月手动更换一次 token ,这就带来了额外的负担。

所以我们分析一波杭电统一认证平台的全流程,达到自动获取 token 的目的。

本篇以杭电助手健康打卡的认证为例,其他应用均可以参考此次分析过程。

认证过程

获取认证 state 参数

https://api.hduhelp.com/login/direct/cas?clientID=healthcheckin&redirect=https%3A%2F%2Fhealthcheckin.hduhelp.com%2F%23%2Fauth

健康打卡认证根链接

访问该链接会重定向到形如 https://cas.hdu.edu.cn/cas/login?service=https://api.hduhelp.com/sso?state=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 上,在 servie 上附带一个 state 的参数用于跳转识别。

保存重定向后的链接和 Set-Cookie 中的 JSESSIONID

https://cas.hdu.edu.cn/cas/login?service=https%3A%2F%2Fapi.hduhelp.com%2Fsso%3Fstate%3Dxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

此为重定向后的链接,用于发送登录请求

请求方式:POST

Cookie:

KeyValue说明
JSESSIONID形如0386853452C49C64DBAA489D2285792A 中获取的Cookie

Form Data:

KeyValue说明
rsaFEB18C06D36E0BE001...加密后的rsa字符串
ul-用户名长度
pl-密码长度
ltLT-13xxx-xxxx-caslogin ticket?
executionexxs1一个与lt有关的参数?
_eventIdsubmit恒定为 submit 不变
  • rsa = strEnc(u+p+lt , "1" , "2" , "3")

u 为用户名,p 为密码,ltForm Data 中相同

strEnchttps://cas.hdu.edu.cn/cas/comm/js/des.js 中 ,本质也只是个 DES 加密,可以选择直接拿JS执行,省事 (各语言基本上都有JS引擎的实现,Golang 可以选择 https://github.com/dop251/goja)

  • ltexecution ,在重定向的网页可以找到,正则匹配出来即可

lt : LT-[0-9]*-\w+-cas

execution : e[0-9]*s1

1

请求成功返回 302 状态码重定向,有错误返回 200 状态码

https://api.hduhelp.com/sso?state=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&ticket=ST-23xxx-xxxxxB6cPw3fNrUmxxxx-cas

重定向后的链接,用于单点登录,随即再次重定向至

https://healthcheckin.hduhelp.com/#/auth?auth=ca29cxxx-2xxx-41xx-axxx-1bxxx270xxxx

拿到 auth 参数的值,即为我们需要的 token

至此结束。

整体流程:

杭电助手根链接 →重定向到认证平台带 state → 认证平台登录请求 → 重定向到杭电助手单点登录 → 重定向到健康打卡拿到 token

分析过程

简单说说,比健康打卡接口简单一些,主要是 js 写的都是明明白白,也没有什么防爬措施,跟着走下去就好了。

一开始是没去找根链接的,直接跟着 https://cas.hdu.edu.cn/cas/login?service=https://api.hduhelp.com/sso?state=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 进去登录,抓包,开始找数据。

查看该页源代码,找到隐藏的表单,发现 ltexecution

F12 进入 Source 找到 https://cas.hdu.edu.cn/cas/comm/hdu/js/login.js ,搜索 rsa ,只有一个结果,代码写的很清楚了。

2

看出 ul 是用户名长度,pl 是密码长度, rsa 调用了一个函数,在看着非第三方库里搜一搜 strEnc ,找到 https://cas.hdu.edu.cn/cas/comm/js/des.js ,开头便是 strEnc 函数。

请求后发现错误,少个 Cookie ,发现在第一次重定向有 Set-Cookie 头,那么就带上 JSESSIONID ,再次请求,成功重定向。

跟着重定向请求一步步下来,就看到 https://healthcheckin.hduhelp.com/#/auth?auth=ca29cxxx-2xxx-41xx-axxx-1bxxx270xxxx

后来测试,发现 state 参数是会过期的,回到健康打卡界面,清除 Cookie ,抓到了根链接的包,结束。

最后修改:2021 年 09 月 13 日 02 : 14 PM