背景

现在每天要进行健康情况上报,但是因为经常睡过头忘记打卡,于是想着写一个程序来自动打卡。

统一身份认证

访问健康情况上报页面(https://healthreport.zju.edu.cn/ncov/wap/default/index)后会先跳转到登录界面

输入账号密码登陆以后会发送一个post请求



表单里一共有五项内容





可以看到,username就是学号,password不是密码的明文,可能是经过了哈希或者加密,authcode一项为空不用管,_eventId应该是提交的意思,而最长的execution看不出有什么含义。

通过查看网页源代码,可以看到登录表单中有一项



就是execution的内容,可以看出,每次请求页面的时候会返回execution,在登录时带着这一项提交,作用可能是防止csrf攻击(猜的)。

那么就只剩下密码这一个参数了。

如果前端通过js加密密码,必然要先从input框中先获取密码的内容,于是先找到密码框的html代码



然后在source中全文搜索password关键字,发现login.js中有一段这样的代码



点开看看



可以看到这段代码先进行一些字段检查,再把密码加密填写回password,最后再执行submit提交到后台。

继续搜索加密中用到的RSAUtils



发现代码都放在security.js中,继续打开看看

这个文件包含了加密需要的代码,其中的算法我不太了解,不过好在Python有pyexecjs这个神器,直接把代码扒下来调用就好了。



但是图中需要的public_exponentModulus两个参数还没有找到,考虑到每次登录提交的密码内容都不一样,所以猜测这两个可能是通过时间戳生成或者请求来的?继续搜索



原来是通过ajax请求了这两个参数,再在network里找,果然找到了这个请求





应该是通过cookie将这次的登录表单和这对参数联系起来,好奇后台是通过什么算法验证的。

代码实现

现在整个登录的流程已经梳理清楚了,开始使用代码实现

  1. 先访问页面并提取execution
    sess = requests.session()
    r = sess.get('https://healthreport.zju.edu.cn/ncov/wap/default/index')
    execution = re.search('name="execution" value="(.*?)"', r.text).group(1)
  2. 获取密码加密需要的参数
    r = sess.get('https://zjuam.zju.edu.cn/cas/v2/getPubKey')
    modulus = r.json()['modulus']
    exponent = r.json()['exponent']
  3. 加密密码
    ctx = execjs.compile(jscode)
    encrypted_password = ctx.call('encrypt', username, password)
  4. 发送登录请求
    data = {
    'username': username,
    'password': encrypted_password,
    'authcode': ''
    'execution': execution,
    '_eventId': 'submit'
    } r = sess.post(post_url, data=data)

之后就可以进行自动打卡的操作了。

记录使用Python登录浙江大学统一身份认证的更多相关文章

  1. JEECG 集成KiSSO单点登录实现统一身份认证

    JEECG 集成KiSSO单点登录实现统一身份认证 JEECG 如何为其他第三方系统实现统一身份认证服务,实现单点登录? 第三方系统如何对接呢? 今天为大家揭开这层面纱,让大家了解实质,使用它更快速的 ...

  2. 【.NET Core微服务实战-统一身份认证】开篇及目录索引

    简介 ​ 学习.NETCORE也有1年多时间了,发现.NETCORE项目实战系列教程很少,都是介绍开源项目或基础教程,对于那些观望的朋友不能形成很好的学习思路,遇到问题怕无法得到解决而不敢再实际项目中 ...

  3. 基于DDD + SD.Framework实现的统一身份认证系统

    项目地址 http://git.oschina.net/lishilei0523/ShSoft.UAC 项目说明 本项目开发的目的有三: 1.作为一个使用SD.Framework框架开发的项目样板 2 ...

  4. 中国科学技术大学统一身份认证系统CAS

    CAS | Apereohttps://www.apereo.org/projects/cas 中国科学技术大学统一身份认证系统https://passport.ustc.edu.cn/login?s ...

  5. 构建基于分布式SOA架构的统一身份认证体系

    摘要:本文充分利用SOA架构松耦合的特点,通过规范统一网络接口实现业务系统整合,既提升系统安全性,又简化资源访问操作,具有重要的理论和现实意义. 统一身份认证旨在将分散在各个信息系统中的用户和权限资源 ...

  6. 配置用户通过Telnet登录设备的身份认证(AAA本地认证)

    背景信息 用户通过Telnet登录设备时,设备上必须配置验证方式,否则用户无法成功登录设备.设备支持不认证.密码认证和AAA认证三种用户界面的验证方式,其中AAA认证方式安全性最高. 采用AAA本地认 ...

  7. token机制完成登录状态保持/身份认证

    一般APP都是刚安装后,第一次启动时需要登录(提示你需要登录或者直接启动在登录界面).而只要登录成功后,以后每次启动时都是登录状态,不需要每次启动时再次登录.不过,也有些APP若你长期未启动,再次启动 ...

  8. SSO单点登录统一身份认证系统

    什么是单点登录 简单点说就是公司有A,B两个系统,我登录了A系统之后再跳转到B系统可以直接访问,而不需要再次登录B系统. 几种常见的单点登录实现方式 在讲解单点登录之前先讲解几个基本的概念: Cook ...

  9. 项目开发-->身份认证及用户登录模块

    1.首先明确的两个问题 如何判断当前申请是由一个已登录用户发起的?如果Request.IsAuthenticated为true,则表示是一个已登录用户. 如何获取当前登录用户的登录名?如果是一个已登录 ...

随机推荐

  1. DJANGO-天天生鲜项目从0到1-003-用户模块-登录

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  2. SpringBoot + Spring Cloud Eureka 服务注册与发现

    什么是Spring Cloud Eureka Eureka是Netflix公司开发的开源服务注册发现组件,服务发现可以说是微服务开发的核心功能了,微服务部署后一定要有服务注册和发现的能力,Eureka ...

  3. Pycharm远程解释器SFTP开发和调试

    转载:https://blog.csdn.net/ll641058431/article/details/53049453 使用PyCharm进行远程开发和调试 你是否经常要在Windows 7或MA ...

  4. 《Python Web开发实战》|百度网盘免费下载|Python Web开发

    <Python Web开发实战>|百度网盘免费下载|Python Web开发 提取码:rnz4 内容简介 这本书涵盖了Web开发的方方面面,可以分为如下部分: 1. 使用最新的Flask ...

  5. Servlet学习之Tomcat控制台中文乱码问题

    Tomcat控制台中文乱码问题 在更新了IDEA2020.1版本后,可以安装官方的简体中文插件,方便我们日常使用,但是更新后再运行Tomcat时,控制台的输出日志出现中文乱码问题,接下来告诉大家如何修 ...

  6. dubbo泛化调用 小demo

    前两天刚好有个同事来问是否用过 dubbo泛化 调用,不需要通过指定配置.第一次听到的时候,还是有点懵,但觉得有意思,可以学点东西. 立马百度了,找了demo,这篇比较容易上手(http://www. ...

  7. 5.19 省选模拟赛 小B的图 最小生成树 LCT

    LINK:小B的图 这道题就比较容易了. 容易想到将询问离线 然后 从小到大排序 那么显然是优先放正图(x+k)的边. 考虑随着x的增大 那么负图上的边会逐渐加进来 一条边被加进来当且仅当 其权值小于 ...

  8. luogu P4606 [SDOI2018]战略游戏

    LINK:战略游戏 一道很有价值的题目.这道题 一张无向联通图 每次询问给出K个关键点 问摧毁图中哪个点可以使得这K个关键的两两之间有一对不能联通 去掉的这个点不能是关键点 求方案数. 可以发现 当K ...

  9. Spring bean作用范围

    1,singleton Spring ioc 容器中仅有一个 Bean 实例,Bean 以单例的方式存在:2,prototype 每次从容器中调用 Bean 时,都返回一个新的实例:3,request ...

  10. grid网格布局使用

    定义 grid布局是指对网页进行划分成一个一个网格,然后根据自己的要求,可以任意组合. 以前写类似的功能,很麻烦,需要写很多的CSS去控制,有了grid就很方便了,可以随意进行组合. 跟flex有很多 ...