首先访问登录页面,获取头中的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作出一点说明,这是一个用于密码加密的JavaScript文件,可以让传输过程中不出现明文密码,保证安全。首先给出学校官网上这个文件的原版链接,实际上就调用里面的encryptPassword(pwd0, key),pwd0是明文密码,key是salt,调用后函数会返回加密后的密码。我懒得(大概也没有能力)把这个加密复现,所以即使在安卓客户端里也只是硬调这个JavaScript代码。 修改于 2023-05-17 07:55:16