东南大学身份认证页面的逆向、模拟登录,可用于其他自动化脚本的身份认证过程。
目前东南大学在使用的 Web 端身份认证系统有主要两个版本,分别是:
-
https://auth.seu.edu.cn/dist/#/dist/main/login(下文中称为 新版身份认证系统 )
-
https://newids.seu.edu.cn/authserver/login(下文中称为 旧版身份认证系统 )
现在一部分常用应用的身份认证已迁移到新版系统(比如网上办事服务大厅、第二课堂等),也还有不少还在使用旧版(比如邮箱、SRTP、网上办事服务大厅里的很多应用等),所以目前是两个版本的身份认证系统并存。
而且存在这样一种情况:访问网上办事服务大厅,经过新版身份认证登录,再访问其中的某个应用,还需要再经过旧版认证,所以本仓库对两个版本的身份认证都提供了实现。
除去 Web 端之外,还有 移动端身份认证系统,主要用于东大信息化 App 的登录,本仓库同样提供了实现与示例代码。
而更老的身份认证(http://xk.urp.seu.edu.cn/studentService/system/showLogin.action)已经基本不会再使用。
采用 RSA 加密用户密码,公钥通过单独的请求获取,Cookie 中需要附带与公钥相匹配的 UID。
登录流程如下:
flowchart LR
A[/"请求公钥\n保存对应的 Cookie"/]
B[/"使用公钥加密用户密码"/]
C[/"提交登录请求\n包含用户名、加密后的密码、Cookie"/]
D[/"成功获取 TGT,完成登录"/]
A-->B
B-->C
C-->D
详细的登录过程分析见 Wiki 页面。
采用 AES 加密用户密码,密钥和 Ticket 等写在 HTML 里,Ticket 需要写在载荷中。
登录流程如下:
flowchart LR
A[/"从登录页面获取\n密钥、Ticket等"/]
B[/"使用对称密钥加密用户密码"/]
C[/"提交登录请求\n包含用户名、加密后的密码、Ticket"/]
D[/"成功登录"/]
A-->B
B-->C
C-->D
【登录过程分析待更新】
采用……哦,根本不加密,直接明文传输用户密码。
登录流程也十分简单:
用户输入用户名、密码后,附带设备名、序列号等一起发送给服务器。通过身份验证后,服务器返回 TGT 以及加密后的密码,由客户端保存,下次启动应用时发送设备序列号、一卡通号、加密后的密码完成登录。
需要注意的是,采用了单点登录的机制,启动应用时发起的登录请求的响应头中包含了一个 ssoCookie
字段,需要在后续的请求中作为 Cookie 附带(在脚本中需要手动添加)。
assets/
docs/
Analysis-of-Login-Process-New.md
:新版身份认证系统登录过程分析
examples/
config.ini
:示例脚本的配置文件(一卡通号、密码)get_postgraduate_lecture_list.py
:获取研究生素质讲座列表的示例脚本get_captcha.py
:获取验证码的示例脚本get_seu_point.py
:查询东大信息化中的东豆余额的示例脚本login_to_dekt.py
:登录第二课堂的示例脚本login_to_ehall.py
:登录网上办事服务大厅的示例脚本
encrypt.js
:AES 加密函数(来自 CryptoJS)requirements.txt
:依赖库seu_auth_mobile.py
:移动端身份认证登录脚本seu_auth_newids.py
:旧版身份认证登录脚本seu_auth.py
:新版身份认证登录脚本LICENSE
README.md
在 seu_auth.py 中实现了模拟登录新版身份认证系统,流程如下:
- 函数
get_pub_key()
从服务器请求 RSA 公钥,存储与公钥相匹配的 Cookie; - 函数
rsa_encrypt()
对用户密码进行 RSA 加密; - 函数
seu_login()
中调用以上两个函数,向服务器发送用户名(一卡通号)、加密后的密码,以及先前获取到的 Cookie,模拟登录。
web 请求使用到 requests 库,RSA 加密使用到 pycryptodome 库。
在 seu_auth_newids.py 中实现了模拟登录旧版身份认证系统,流程如下:
- 函数
get_login_data()
从登录页面解析出 AES 密钥、Ticket 等信息; - 函数
aes_encrypt()
对用户密码进行 AES 加密; - 函数
seu_login()
中调用以上两个函数,向服务器发送用户名(一卡通号)、加密后的密码、Ticket 等,模拟登录。
web 请求使用到 requests 库,HTML 解析使用到 BeautifulSoup4 库,AES 加密直接使用到请求返回的 encrypt.js(来自 CryptoJS),JavaScript 运行使用到 Js2Py。
在 seu_auth_mobile.py 中实现了模拟登录移动端身份认证系统,流程如下:
- 函数
get_user_info()
用于获取已登录用户的身份信息; - 函数
seu_login()
向服务器发送用户名、密码以及其他设备信息(可不填),模拟登录,调用上一个函数验证是否成功登录。
在 examples/ 中给出了以下几个使用示例,分别是:
- get_postgraduate_lecture_list.py:获取研究生素质讲座列表(新版系统);
- get_captcha.py:获取研究生讲座系统、本科生选课系统的验证码(新版系统);
- login_to_dekt.py:登录东南大学第二课堂(新版系统);
- login_to_ehall.py:登录东南大学网上办事服务大厅(新版系统);
- query_seu_points.py:查询东大信息化中的东豆余额(移动端)。
(注:括号中内容表示访问该应用所需要经过哪个身份认证系统)
项目 zhjcreator/fetch_lecture 使用到新版认证脚本登录研究生素质讲座系统;
项目 Golevka2001/Earn-SEU-Points-Daily 使用到移动端认证脚本登录东大信息化 App。
详细的登录过程分析见 Wiki 页面。