在讲今天的内容之前,我们应该先了解一些基本的基础知识,要不然,突然讲鉴权,可能有点懵,听不太懂,所以,我会先把基础的东西先梳理一遍
一、什么是接口测试?
接口测试:本质是基于某种协议,发送一个请求给服务器,然后服务器返回一个响应数据,然后对响应数据进行分析,判断是否与我们预期的返回一致,从而验证功能是否正确,这就是接口测试
二、授权和鉴权的区别?
授权:相当于给一个通行证
鉴权:鉴定是否有权访问(判断有没有通行证)
三、cookie与session的区别
1、cookie是一个小的小文本文件,是由web服务器保存在用户浏览器上的小文本文件,包含用户的相关信息,无论何时用户访问到服务器,都会带上该服务器的cookie信息,一般cookie是有有效期的,cookie只在浏览器上保存一段规定的时间,一旦超过规定的时间,该cookie就会被系统清除
2、session是将数据存储在服务器中,服务器会为每一个用户创建一条session,用户访问服务器的时候需要拿着session去表明自己的身份,session的实现是基于cookie,session需要借助于cookie来存储sessionID,session可以自动保存cookie信息
另外注意: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"
直接来上代码
"""
提前准备的工作:课堂派的接口
# 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())
我们以<前程贷>的项目中的充值功能为例,来讲解如何进行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())
我们先对代码中的部分,进行语法介绍,怕有的同学看不太懂
然后再从大局角度或者宏观角度,再来整体看看代码是如何实现token鉴权的
所以,以上两种就是requests请求需要鉴权的具体过程
其实,从以上两个举例中,我们都可以找到一些共同的影子,无论是哪种鉴权方式,都是测某个功能的接口,都需要先过登录这一关,这是门槛,然后再利用登录后的信息的基础上,再去测试具体的某个功能接口,
第一种:创建seeion对象,登录后,sesson保存cookie信息,然后用seesion请求
第二种:从登录后返回的数据中获取token,再把token放在该放的位置,然后照常用requests请求
拓展一个小内容:如果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())