在编写接口自动化测试用例或其他脚本的过程中,经常会遇到需要绕过用户名/密码或验证码登录,去请求接口的情况,一是因为有时验证码会比较复杂,比如有些图形验证码,难以通过接口的方式去处理;再者,每次请求接口前如果都需要先去登录一次,这样不仅效率低,还耗费资源。

有些网站是使用cookie辨别用户身份的,此时我们便可以先登录一次,拿到登录成功后的cookie,后续请求时在请求头中加入该cookie,便可保持登录状态直接请求。

cookie工作原理

HTTP协议1.0版本是无状态的,对于事务处理没有记忆能力,比如用户登录了某个网站后,再次刷新这个页面去请求服务器,如果没有相关机制的话,服务器是不知道这个请求是否还是刷新之前登录的用户发出来的。此时,为了维持用户的登录状态,即为了使服务器能够识别页面刷新之后的请求,就可以使用cookie机制

cookie原理简单概括如下:

  1. 用户在客户端 (一般为浏览器) 中访问某个页面 ,也就是向服务器发送请求。

  2. 服务器收到请求后,会在响应头中设置Set-Cookie字段值,该字段存储相关信息和状态。

  3. 客户端解析服务器HTTP响应头中的Set-Cookie字段,并以key=value的形式保存在本地,之后客户端每次发送HTTP请求时,都会在请求头中增加Cookie字段。

  4. 服务器接收到客户端的HTTP请求之后,会从请求头中取出Cookie数据,来校验客户端状态或身份信息。

以登录某网站为例,点击登录时请求sign_in接口,请求成功后 (即登录成功后) 在响应头中会返回set-cookie字段,如下:

浏览器会保存上图中set-cookie字段的值,后续发送请求 (即登录后进行页面操作) 时,请求头中都会携带包含刚刚保存的set-cookie值的cookie,如下所示:

服务器接收到这个cookie后,便会用它去查找内存中的记录,有则校验成功。

由此可知,如果需要绕过用户名密码、验证码等进行模拟登录,然后再去请求其他接口,那么我们可以先拿到登录成功后的cookie,将cookie放在请求头中,再去调用需要登录才能请求的接口,便能调用成功。

cookie绕过登录

1,哪些场景需要使用cookie绕过登录?

  • 网络爬虫,代码去爬取某个网站时需要验证码登录,而这时代码获取验证码登录有一定难度,就可以先抓取到登录后的cookie用于后续的接口请求。

  • 接口自动化测试,对某个需要登录的项目进行接口测试,每次请求时都先请求登录接口进行登录会影响效率而且极其不方便,这时就可以抓取到第一次登录后的cookie,后续每次接口请求都带上该cookie,服务器就会认为是登录状态。

  • 其他需要绕过登录的场景。

2,接下来举例说明怎样编写python脚本,利用cookie机制绕过登录。

  • 需求:请求接口获取博客园网自己账号的个人信息。

  • 需求分析:

    • 需要先登录博客园,才能去请求获取个人信息接口拿到个人信息
    • 该网站的登录方式有两种:用户名、密码登录,手机验证码登录
    • 可尝试使用cookie绕过这两种登录方式。

3,思路:

  • 首先,先使用手机验证码登录网站,Fiddler进行抓包,获取登录后的cookie信息;

  • 然后,编写python代码,拿上一步中获取到的cookie信息去请求获取个人信息接口;

  • 最后,个人信息获取成功便说明绕过了登录。

4,实际操作流程如下:

  • 首先,登录网站,Fiddler抓包获取登录成功后的cookie。

  • 然后,cookie信息去请求获取个人信息接口。

    登录后同样可以抓取到获取个人信息接口的信息,如下:

    个人信息接口请求方式为GET,请求URL如图所示,那么我们只需要这两点信息就足够了。接下使用上一步中拿到的cookie去请求这个接口。代码如下:

    import requests
    
    url = "https://account.cnblogs.com/user/userinfo"
    headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.30",
    "cookie": "登录成功后的cookie"
    } res = requests.get(url=url, headers=headers).text
    print(res)

    运行代码,结果如下:

    可以看到,成功获取了个人信息。

  • 最后,为了验证是cookie确实绕过了登录,我们修改上面的脚本,不加入该cookie,请求个人信息接口,代码如下:

    import requests
    
    url = "https://account.cnblogs.com/user/userinfo"
    headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.30"
    } res = requests.get(url=url, headers=headers).text
    print(res)

    运行后结果如下:

    从上图可以看出来,不加登录成功后的cookie去请求接口,则会提示先登录或注册。

总结

cookie绕过登录其实是登录状态保持,而不是真的不需要登录。

并非所有的网站都是使用cookie机制,除了cookie机制外,还有session、token等方式进行会话保持,这在后续的文章中会进行说明。

python+pytest接口自动化(9)-cookie绕过登录(保持登录状态)的更多相关文章

  1. python+pytest接口自动化(11)-测试函数、测试类/测试方法的封装

    前言 在python+pytest 接口自动化系列中,我们之前的文章基本都没有将代码进行封装,但实际编写自动化测试脚本中,我们都需要将测试代码进行封装,才能被测试框架识别执行. 例如单个接口的请求代码 ...

  2. Python接口自动化基础---cookie绕过登录

    使用fiddler获取登录cookie 对比登录前和登录后的cookis 登录前 登录后: 获得cookie之后,使用cookie访问,就可以获取登录态: import requests url='h ...

  3. python+pytest接口自动化(13)-token关联登录

    在PC端登录公司的后台管理系统或在手机上登录某个APP时,经常会发现登录成功后,返回参数中会包含token,它的值为一段较长的字符串,而后续去请求的请求头中都需要带上这个token作为参数,否则就提示 ...

  4. python+pytest接口自动化(10)-session会话保持

    在接口测试的过程中,经常会遇到有些接口需要在登录的状态下才能请求,否则会提示请登录,那么怎样解决呢? 上一篇文章我们介绍了Cookie绕过登录,其实这就是保持登录状态的方法之一. 另外一种方式则是通过 ...

  5. python+pytest接口自动化(16)-接口自动化项目中日志的使用 (使用loguru模块)

    通过上篇文章日志管理模块loguru简介,我们已经知道了loguru日志记录模块的简单使用.在自动化测试项目中,一般都需要通过记录日志的方式来确定项目运行的状态及结果,以方便定位问题. 这篇文章我们使 ...

  6. python+pytest接口自动化(4)-requests发送get请求

    python中用于请求http接口的有自带的urllib和第三方库requests,但 urllib 写法稍微有点繁琐,所以在进行接口自动化测试过程中,一般使用更为简洁且功能强大的 requests ...

  7. python+pytest接口自动化(6)-请求参数格式的确定

    我们在做接口测试之前,先需要根据接口文档或抓包接口数据,搞清楚被测接口的详细内容,其中就包含请求参数的编码格式,从而使用对应的参数格式发送请求.例如某个接口规定的请求主体的编码方式为 applicat ...

  8. python+pytest接口自动化(12)-自动化用例编写思路 (使用pytest编写一个测试脚本)

    经过之前的学习铺垫,我们尝试着利用pytest框架编写一条接口自动化测试用例,来厘清接口自动化用例编写的思路. 我们在百度搜索天气查询,会出现如下图所示结果: 接下来,我们以该天气查询接口为例,编写接 ...

  9. python+pytest接口自动化(1)-接口测试基础

    接口定义 一般我们所说的接口即API,那什么又是API呢,百度给的定义如下: API(Application Programming Interface,应用程序接口)是一些预先定义的接口(如函数.H ...

随机推荐

  1. JavaEE复制后项目出错或者无法运行的解决方法

    eclipse中,直接复制项目,会出现一些错误,解决方法如下: 1,在复制后的工程上点右键->properties->Web Project Settings>web context ...

  2. postman中环境变量的设置方法、使用方法和实际中常见使用场景

    文中共介绍2种添加环境变量的方法.2种使用环境变量的方法,以及不同方法的适用范围. 文中给出了环境变量的两种常见使用场景:切换环境.动态参数关联(前一个请求的响应作为下一个请求的入参) 2种添加环境变 ...

  3. 5、前端--js常量、变量、5种基本数据类型(number string boolean undefined object)、运算符、流程控制、三元运算符、函数、自定义对象、内置对象、BOM操作

    变量与常量 在JS中声明变量需要使用关键字 老版本 var(全部都是全局变量) 新版本 let(可以声明局部变量) # 推荐使用let(其实问题不大) 在JS中声明常量也需要使用关键字 const # ...

  4. 1、网络并发编程--简介、软件开发架构、OSI七层协议

    python复习 变量与常量 基本数据类型 内置方法 字符编码.文件操作 函数 函数参数.闭包函数.装饰器 面向对象 封装.继承.多态 """ 什么是对象 数据与功能的结 ...

  5. JAVA 对象的创建与克隆

    目录 一.对象的4种创建方式 二.通过new创建对象 三.反射 四.克隆对象 浅拷贝 深拷贝 五.反序列化 六.补充 一.对象的4种创建方式 new 创建 反射 克隆 反序列化 二.通过new创建对象 ...

  6. Solution -「Gym 102956B」Beautiful Sequence Unraveling

    \(\mathcal{Description}\)   Link.   求长度为 \(n\),值域为 \([1,m]\) 的整数序列 \(\lang a_n\rang\) 的个数,满足 \(\not\ ...

  7. VMware Workstation批量克隆虚拟机

    由于经常要用vmware创建虚拟机做一些测试,集群的测试使用连接克隆,可以节省磁盘的空间(如果不是因为穷,没人愿意向生活低头) 于是找到了这个bat脚本,做了一些修改和学习,为大家加上了一些注释,方便 ...

  8. suse 12 二进制部署 Kubernetets 1.19.7 - 第08章 - 部署kube-scheduler组件

    文章目录 1.8.部署kube-scheduler 1.8.0.创建kube-scheduler请求证书 1.8.1.生成kube-scheduler证书和私钥 1.8.2.创建kube-schedu ...

  9. suse 12 二进制部署 Kubernetets 1.19.7 - 第09章 - 部署kubelet组件

    文章目录 1.9.部署kubelet 1.9.0.创建kubelet bootstrap kubeconfig文件 1.9.1.创建kubelet配置文件 1.9.2.配置kubelet为system ...

  10. verification 时间不推进,挂起

    时间不推进,挂起 0时刻 windows-> new -> source Browser 可能是仿真精度不够,比如进度是1ns,但是时钟有0.1ns为周期的,这种情况下,仿真器会吧这个周期 ...