上一篇分析了杭电助手健康打卡的接口,但是在 Header 参数 authorization 的 token 有效期只有一个月,必须每个月手动更换一次 token ,这就带来了额外的负担。
所以我们分析一波杭电统一认证平台的全流程,达到自动获取 token 的目的。
本篇以杭电助手健康打卡的认证为例,其他应用均可以参考此次分析过程。
认证过程
一
获取认证 state 参数
健康打卡认证根链接
访问该链接会重定向到形如 https://cas.hdu.edu.cn/cas/login?service=https://api.hduhelp.com/sso?state=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 上,在 servie 上附带一个 state 的参数用于跳转识别。
保存重定向后的链接和 Set-Cookie 中的 JSESSIONID。
二
此为重定向后的链接,用于发送登录请求
请求方式:POST
Cookie:
| Key | Value | 说明 |
|---|---|---|
| JSESSIONID | 形如0386853452C49C64DBAA489D2285792A | 在 一 中获取的Cookie |
Form Data:
| Key | Value | 说明 |
|---|---|---|
| rsa | FEB18C06D36E0BE001... | 加密后的rsa字符串 |
| ul | - | 用户名长度 |
| pl | - | 密码长度 |
| lt | LT-13xxx-xxxx-cas | login ticket? |
| execution | exxs1 | 一个与lt有关的参数? |
| _eventId | submit | 恒定为 submit 不变 |
rsa = strEnc(u+p+lt , "1" , "2" , "3")
u 为用户名,p 为密码,lt 与 Form Data 中相同
strEnc 在 https://cas.hdu.edu.cn/cas/comm/js/des.js 中 ,本质也只是个 DES 加密,可以选择直接拿JS执行,省事 (各语言基本上都有JS引擎的实现,Golang 可以选择 https://github.com/dop251/goja)
lt和execution,在重定向的网页可以找到,正则匹配出来即可
lt : LT-[0-9]*-\w+-cas
execution : e[0-9]*s1

请求成功返回 302 状态码重定向,有错误返回 200 状态码
三
重定向后的链接,用于单点登录,随即再次重定向至
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 进去登录,抓包,开始找数据。
查看该页源代码,找到隐藏的表单,发现 lt 和 execution 。
F12 进入 Source 找到 https://cas.hdu.edu.cn/cas/comm/hdu/js/login.js ,搜索 rsa ,只有一个结果,代码写的很清楚了。

看出 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 ,抓到了根链接的包,结束。