上一篇分析了杭电助手健康打卡的接口,但是在 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
,抓到了根链接的包,结束。