在讲今天的内容之前,我们应该先了解一些基本的基础知识,要不然,突然讲鉴权,可能有点懵,听不太懂,所以,我会先把基础的东西先梳理一遍
一、什么是接口测试?
接口测试:本质是基于某种协议,发送一个请求给服务器,然后服务器返回一个响应数据,然后对响应数据进行分析,判断是否与我们预期的返回一致,从而验证功能是否正确,这就是接口测试
二、授权和鉴权的区别?
授权:相当于给一个通行证
鉴权:鉴定是否有权访问(判断有没有通行证)
三、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())