登录流程
首先访问登录页面,获取头中的Set-Cookie
、页面中id
分别为pwdEncryptSalt
和execution
的input
的标签的value
(注意页面中可能有多个相同id
的,需要的这俩被包裹在id
为pwdFromId
的form
中),几次密码错误后需要获取验证码,获取验证码和登录时使用同一个Cookie
即可。
然后在前端将明文密码和pwdEncryptSalt
传入EncryptPassword.js
计算出加密后的密码,再将Cookie
、加密后的密码、execution
、验证码(如果需要的话)通过POST
发送到登陆页面,然后会经历一大堆乱七八糟的302
重定向,注意这一大堆重定向过程中需要一直携带Cookie
(Python
的requests
库重定向默认不带,需要手动处理,开始我被折腾了好久555)。
对于webvpn来说,之后拿着同一个Cookie
就可以走天下了,只不过访问每一个子模块或多或少都需要前序验证(其实就是访问一个页面然后经历一大堆重定向)。另外,由于webvpn相当于代理了内部的Cookie
,所以内部的这些Cookie
过期时间是不可知的,只能是用到相关服务的时候都把前序验证流程走一遍。
对于非webvpn的直接访问来说,需要统一身份认证时会被重定向到登录页面,这时候只要携带着登录时拿到的Cookie
就会被自动重定向回要访问的页面,并且下发可能需要的对应站点的Cookie
。
关于EncryptPassword.js
另外对EncryptPassword.js
作出一点说明,这是一个用于密码加密的JavaScript
文件,可以让传输过程中不出现明文密码,保证安全。首先给出学校官网上这个文件的原版链接,实际上就调用里面的encryptPassword(pwd0, key)
,pwd0
是明文密码,key
是salt
,调用后函数会返回加密后的密码。我懒得(大概也没有能力)把这个加密复现,所以即使在安卓客户端里也只是硬调这个JavaScript
代码。