模拟登录学校教务系统遇到的问题

2016-09-12 10:24:08 +08:00
 wenxw1997
我用浏览器登录学校教务系统查成绩的流程是这样的:
登录信息门户 xinxi.xxx.edu.cn
访问教务系统查成绩页面 jiaowu.xxx.edu.cn

目前用 request 或 cookielib 模拟登录信息门户没问题,信息门户上的东西都能采集,但是访问教务系统显示未登录

教务系统没有专门的登录入口
用 firebug 抓包的结果是
访问信息门户的页面时会抓到一个请求
jiaowu.xxx.edu.cn/login.do?sessionid=xxxxx(一长串数字),每次登录都不一样

这种情况下应该怎么模拟登录教务系统呢
4146 次点击
所在节点    Python
28 条回复
yangyanggnu
2016-09-12 15:03:49 +08:00
你描述的流程是只要登录信息门户( xinxi.xxx.edu.cn )后,再访问教务系统查成绩页面( jiaowu.xxx.edu.cn )无需再次登录,这类单点登录的模式常见于 4A 系统中,免去个人用户分别管理多个业务系统的账号 /密码的麻烦,其中,门户系统的账号称为主账号、教务系统的账号称为从账号。

门户系统为教务系统统一认证,一般有两种实现方式:
0 )(门户系统中_未存放_教务系统的密码)用户登录门户系统后,第一步,门户系统在服务端生成 token ,第二步,门户系统在服务端将 token 发给教务系统服务端,门户系统在服务端将 token 下发给用户客户端(浏览器),第三步,用户客户端拿着 token 去请求教务系统页面,第四步,教务系统服务端比对门户服务端发过来的 token 和客户端提交上来的 token 是否一致,若一至则完成教务系统鉴权并将结果 set-cookie ,反之亦然;
1 )(门户系统中_已存放_教务系统的密码)用户登录门户系统后,第一步,门户系统在服务端将预先存放的教务系统账号 /密码发给教务系统鉴权;第二步,教务系统自行完成鉴权。

显然,前者更优,做到了真正意义上的单点登录,免去主定期同步从系统账号 /密码的麻烦。具体到你说的场景中,抓取的 jiaowu.xxx.edu.cn/login.do?sessionid=xxxx ,我猜测也是采用的第一种实现方式, sessionid 等同于 token ,所以,如果你要通过爬虫访问教务系统,只要把登录门户后下发给客户端的 sessionid 提取出来,拼装进 jiaowu.xxx.edu.cn/login.do?sessionid=xxxx 后提交,然后提取教务系统鉴权完成后下发给客户端的 set-cookie ,后续的任何教务系统页面请求均带上该 set-cookie 即可。
yangyanggnu
2016-09-12 15:05:17 +08:00
昏,已经解决了哇,白码字了 :-(
wenxw1997
2016-09-12 15:08:14 +08:00
@yangyanggnu 是这样没错。只不过我之前没认真检查,把显而易见的 token 忽略了。
chezs66
2016-09-12 20:57:44 +08:00
借楼问问: sessionId 直接放在 url 里好吗?为何不在 header 里呢?
mingyun
2016-09-12 23:03:48 +08:00
@kylinking
@zonghua 用 python3
yangyanggnu
2016-09-13 14:21:15 +08:00
@chezs66

通常使用 GET 方法就放在 URL 中,使用 POST 方法就放在 header 或者 body 中。
chezs66
2016-09-13 19:22:12 +08:00
@yangyanggnu
按理说, get 方法时 session ID 也能放在 header 里。
chezs66
2016-09-13 19:50:05 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/305594

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX