在讲今天的内容之前,我们应该先了解一些基本的基础知识,要不然,突然讲鉴权,可能有点懵,听不太懂,所以,我会先把基础的东西先梳理一遍
一、什么是接口测试?
接口测试:本质是基于某种协议,发送一个请求给服务器,然后服务器返回一个响应数据,然后对响应数据进行分析,判断是否与我们预期的返回一致,从而验证功能是否正确,这就是接口测试
二、授权和鉴权的区别?
授权:相当于给一个通行证
鉴权:鉴定是否有权访问(判断有没有通行证)
三、cookie与session的区别
1、cookie是一个小的小文本文件,是由web服务器保存在用户浏览器上的小文本文件,包含用户的相关信息,无论何时用户访问到服务器,都会带上该服务器的cookie信息,一般cookie是有有效期的,cookie只在浏览器上保存一段规定的时间,一旦超过规定的时间,该cookie就会被系统清除
2、session是将数据存储在服务器中,服务器会为每一个用户创建一条session,用户访问服务器的时候需要拿着session去表明自己的身份,session的实现是基于cookie,session需要借助于cookie来存储sessionID,session可以自动保存cookie信息
另外注意:cookie和session都是开发设置的,我们作为测试人员,不要想着去怎么设置,基本与测试人员无关,我们只是测接口
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鉴权,因为是先登录,登录后才能实现充值功能
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过期怎么办?
拓展一个小内容:如果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())
小编愿同广大网友一起交流,共同进步