array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 接口测试中的cookie鉴权和token鉴权 - 爱码网

  在讲今天的内容之前,我们应该先了解一些基本的基础知识,要不然,突然讲鉴权,可能有点懵,听不太懂,所以,我会先把基础的东西先梳理一遍

一、什么是接口测试?
接口测试:本质是基于某种协议,发送一个请求给服务器,然后服务器返回一个响应数据,然后对响应数据进行分析,判断是否与我们预期的返回一致,从而验证功能是否正确,这就是接口测试

二、授权和鉴权的区别?
授权:相当于给一个通行证
鉴权:鉴定是否有权访问(判断有没有通行证)

三、cookie与session的区别
1、cookie是一个小的小文本文件,是由web服务器保存在用户浏览器上的小文本文件,包含用户的相关信息,无论何时用户访问到服务器,都会带上该服务器的cookie信息,一般cookie是有有效期的,cookie只在浏览器上保存一段规定的时间,一旦超过规定的时间,该cookie就会被系统清除

2、session是将数据存储在服务器中,服务器会为每一个用户创建一条session,用户访问服务器的时候需要拿着session去表明自己的身份,session的实现是基于cookie,session需要借助于cookie来存储sessionIDsession可以自动保存cookie信息

另外注意:cookie和session都是开发设置的,我们作为测试人员,不要想着去怎么设置,基本与测试人员无关,我们只是测接口

接口测试中的cookie鉴权和token鉴权

 cookie_session鉴权的接口

接下来,我们以课堂派的接口为例,为大家讲解如何进行cookie和session方式鉴权的接口,提前准备好一些接口信息,比如:

# 1.登录接口
login_url = "https://www.ketangpai.com/UserApi/login"
请求方法:post
请求参数类型:表单类型
请求参数: 有时候我们并没有拿到开发人员给我们的接口文档,那请求参数怎么获取,只能去浏览器上手动抓包,获取这些信息
email: 邮箱(账号)
password: 密码
remember: 0           

# 2.获取班级列表的接口地址
course_url = "https://www.ketangpai.com/CourseApi/lists"

 接口测试中的cookie鉴权和token鉴权

 直接来上代码

"""
提前准备的工作:课堂派的接口

# 1.登录接口
login_url = "https://www.ketangpai.com/UserApi/login"
请求方法:post
请求参数类型:表单类型
请求参数:
    email:  邮箱(账号)
    password: 密码
    remember: 0

# 2.获取班级列表的接口地址
course_url = "https://www.ketangpai.com/CourseApi/lists"


笔记:
http请求时无状态的:
    可以通过cookie或者token来传递用户登录的状态信息
    session可以自动保存cookie信息
cookie+session进行鉴权的接口,在python的处理:

    requests模块中有一个session类,使用session类的同一个对象发送请求,会自动保存之前请求的cookie信息
"""
import requests

# 创建一个session对象
session = requests.Session()
# -------------------------请求课堂派登录接口-------------------------------------
# 接口地址
login_url = "https://www.ketangpai.com/UserApi/login"
# 请求参数
params = {
    "email": "1234667890",
    "password": "000000123",
    "remember": 0     
}

response = session.post(url=login_url, data=params)
print(response.json())

# -------------------请求课堂派课程列表的接口---------------------------
course_url = "https://www.ketangpai.com/CourseApi/lists"

response2 = session.get(url=course_url)
print(response2.json())

接口测试中的cookie鉴权和token鉴权

 token鉴权的接口

我们以<前程贷>的项目中的充值功能为例,来讲解如何进行token鉴权,因为是先登录,登录后才能实现充值功能

token鉴权解决思路:

1、登录,获取服务器返回的token

2、提取登录之后返回的token
    1、要么从返回的响应数据中提取
    2、要么从响应头中提取

3、请求需要鉴权的接口时,加上前面提取得token
    1、要么把token放在请求头中
    2、要么返回请求的参数中

import requests
from jsonpath import jsonpath# 登录
login_url = "http://api.lemonban.com/futureloan/member/login"
params = {
    "mobile_phone": "15879563287",
    "pwd": "lemonban"
}
headers = {
    "X-Lemonban-Media-Type": "lemonban.v2"
}

# 1、发送请求登录
response = requests.post(url=login_url, json=params, headers=headers)
# 获取请求之后返回得数据
result = response.json()

# 2、提取token
token = jsonpath(result, "$..token")[0]
token_data = "Bearer" + " " + token

# 提取用户id
member_id = jsonpath(result, "$..id")[0]
# ------------------------------充值--------------------------
recharge_url = "http://api.lemonban.com/futureloan/member/recharge"
# 充值的参数
recharge_params = {
    "member_id": member_id,  # 充值的用户id哪里来?
    "amount": 10000
}
# 请求头
headers2 = {
    "X-Lemonban-Media-Type": "lemonban.v2",
    "Authorization": token_data
}
response2 = requests.post(url=recharge_url, json=recharge_params, headers=headers2)
print("充值的结果:", response2.json())

我们先对代码中的部分,进行语法介绍,怕有的同学看不太懂

接口测试中的cookie鉴权和token鉴权

 然后再从大局角度或者宏观角度,再来整体看看代码是如何实现token鉴权的

接口测试中的cookie鉴权和token鉴权

所以,以上两种就是requests请求需要鉴权的具体过程

其实,从以上两个举例中,我们都可以找到一些共同的影子,无论是哪种鉴权方式,都是测某个功能的接口,都需要先过登录这一关,这是门槛,然后再利用登录后的信息的基础上,再去测试具体的某个功能接口,

第一种:创建seeion对象,登录后,sesson保存cookie信息,然后用seesion请求

第二种:从登录后返回的数据中获取token,再把token放在该放的位置,然后照常用requests请求

 token过期怎么办?

拓展一个小内容:如果token过期了,那如何进行处理?在代码中如何进行改进?

导入时间类,登录前设置开始时间,后边再设置结束时间,通过if判断时间,token有效期是否过期,如果过期,则重新登录,(详情请见红色代码标记之处)

import requests
from jsonpath import jsonpath
import time
# 登录
login_url = "http://api.lemonban.com/futureloan/member/login"
params = {
    "mobile_phone": "15879563287",
    "pwd": "lemonban"
}
headers = {
    "X-Lemonban-Media-Type": "lemonban.v2"
}
s_time = time.time()
# 1、发送请求登录
response = requests.post(url=login_url, json=params, headers=headers)
# 获取请求之后返回得数据
result = response.json()

# 2、提取token
token = jsonpath(result, "$..token")[0]
token_data = "Bearer" + " " + token

# 提取用户id
member_id = jsonpath(result, "$..id")[0]
# ------------------------------充值--------------------------
recharge_url = "http://api.lemonban.com/futureloan/member/recharge"
# 充值的参数
recharge_params = {
    "member_id": member_id,  # 充值的用户id哪里来?
    "amount": 10000
}
# 请求头
headers2 = {
    "X-Lemonban-Media-Type": "lemonban.v2",
    "Authorization": token_data
}
e_time = time.time()
if e_time - s_time > 300:
    pass   # 重新登录提取token

response2 = requests.post(url=recharge_url, json=recharge_params, headers=headers2) print("充值的结果:", response2.json())

 

 

小编愿同广大网友一起交流,共同进步

相关文章: