1 token简介
token-今牌:Token 也是由服务器产生的,存在服务器的内存或硬盘中,有一套产生规则,会涉及到加密算法
用Token 来实现登录:开发提供一个获取Token接口,根据用户名+密码,获取一个Token值-返回一个Token (字符串)
Token 值服务器通过什么给客户端的呢?
(1)通过响应头给客户端的== ==次要
(2)通过响应消息体传给客户端== ==主要
(3)通过Cookie传递给客户端 ====很少
概念:令牌,一般在我们的前后端分离的项目中使用,作为身份的校验
详情:服务后端程序产生的,然后存放到服务端,一般是缓存中(内存/磁盘)
时效性:过久过期,由开发或者项目本身决定
扩展:redis使用场景:
登录的token会放到redis
高频 热点数据可以放
工作流程:
项目代码的处理:
1.一般通过登录接口,成功之后,在响应数据里有token值
2.后续其他接口关联使用这个token,一般放在后续接口的请求头里
响应体json(token)内容获取:
1、先转换为字典--res.json()
2、使用第三方库--jsonpath
1.2 token实战
HOST = 'http://121.41.14.39:8082'#便于维护--测试环境变更--测试环境-预生产环境-生产环境
'''
目标:完成外卖系统的店铺端的登录接口操作
注意事项:密码需要md5加密!
'''
import requests
import pprint
#需求:输入一个字符串的密码,输出的一个md5加密结果
import hashlib
def get_md5(password):
#1-实例化加密对象
md5 = hashlib.md5()
#2- 进行加密操作
md5.update(password.encode('utf-8'))
#3- 返回加密后的值
return md5.hexdigest()
print(get_md5('xintian'))
def login(inData,getToken=False):
'''
:param inData:账号+密码---字典
:param getToken 为True 获取token; 为False 返回接口响应数据
:return:
'''
#1-url
url = f'{HOST}/account/sLogin'
#2- 参数
#字典的修改值操作 字典[键] = 新的值
inData['password'] = get_md5(inData['password'])
payload = inData
#3-请求方法
resp = requests.post(url,params=payload)
if getToken == False:
return resp.json()#响应数据
else:
return resp.json()['data']['token']#token
if __name__ == '__main__':
res = login({'username':'xxxxxx','password':'xxxxxx'})
# pprint.pprint(res)
print(res)
2. cookies 简介
Cookie是保存在客户端的纯文本文件
通过浏览器进行访问网页的时候,服务器就会生成一个证书并返回给浏览器并写入本地。这个证书就是cookie
浏览器的Cookies是保存在浏览器的某个位置的服务器端可以通过: 响应头中的set-Cookie参数,对客户端的Cookie进行管理
浏览器的每次请求,都会把该站点的Cookie发送给服务器
实现登录: Cookie + Session 配合使用的
2.1 cookies的项目场景:
1、访问任何页面都会返回cookies,这个cookies是临时的,后续需要登录认证,变得有效
2、只有登录才会有cookies,否则不会返回cookies
cookies工作流程(主要里面就是jsessionID)
(1) 客户端发送一个请求到服务器
(2) 服务器返回响应数据--响应头--Set- Cookies---给我们客户端
- 这个时候这个cookies不一定是有效!---需 要登录的网站--临时cookies
- 需要登录---服务器判断这个账号密码正确之 后,之前的cookies变成可以使用的!
- cookies的关联场景:
1、原生态的cookies,即项目后续接口直接使用这个cookies,不作任何操作----不建议取出sessionid
2、需要更新的cookies,即项目后续接口使用这个cookies,但是需要第三方认证,则需要更新cookies(增加cookies的属性,如token)
2.2 cookies 封装:
HOST="http://localhost:8080"
import requests
# -------登录接口-----------
def login(data):
url = f"{HOST}/api/mgr/loinReq" # 1 url
payload = data # 请求body
res = requests.post(url,data=payload) # 获取响应头
print('响应头-->',resp.headers)
print('响应头-->',resp.headers['Set-Cookie']) # 1 使用建取cookies值
print('cookies对象--->',resp.cookies) # 2 直接获取cookie对象
# -------业务接口-----------
class Lesson:
def __init__(self,in_cookies):
self.cookies = in_cookies
def list_lesson(self,data):
url = f'{host}/api/mgr/sq_mgr/'
payload = data
resp = requests.get(url,params=data,cookies=self.cookies) # get方式用params,cookies的获取直接到类中取得
resp.encoding = 'unocode_escape' #设置响应数据编码(为了返回数据正常展示)
return resp.text
def get_vip_token():
retuen 'token' # 假装获得了token
if __name__== '__main__':
# 1 login接口
cookies = login('usename':'auto','password':';sdfsdfsdf')
# -----获取token后,需要更新cookies,或手动新增(拼接)
cookies.update('token':get_vip_token()) # 更新,有键值则更新,无键值则新增
user_cookies= {'sessionid':cookies['sessionid'],'token':get_vip_token()}# 新增
# 2 列出课表接口
Lesson(cookies).list_lesson({'action':'list_course','pagenumm':1.,'pagesize':20})
cookies的传递:
补充:
知识点1:字典与json区别
1- 数据类型区别
(1) 字典是一种存储数据类型 type()
(2)json:是一个键值对形式的格式字符串, a. json 不是python专属; b .键是双引号的字符串; c. json数据里怎么表示一个空对象:null,python的空None; d. json数据里怎么表示一个真:true,python的空True
(3) 两者相互转化 import json: 字典转json json.dumps(); json转字典 json.loads()
2- 代码里区别:在控制台里输出这个数据: 如果是单引号--是字典类型; 如果是双引号--json字符串
演示代码:
#1- 字典类型
dict1 = {'name':'songqin','data':None,'data2':True}
print('字典>>> ',dict1)
print(json.dumps(dict1))#字典转json
知识点2:场景描述:有时候,某一个接口你的Postman可以测试成功,但是你写的代码不能成功!
分析:
1- 项目的接口没有问题,不要去怼开发
2- 肯定是你接口本身写有问题:数据类型,一些参数 url等一些原因
环境限制:这个测试环境不能搭建任何抓包工具
解决方案:
1- 你拿到你自己代码发出去请求与postman对比
2- 自己打印你的请求详情
知识点3:
cookies在项目里使用场景:
1- 后续接口使用原生态的cookie
2- 后续接口会使用到登录的cookies(只有sessionid),但是这个cookies他是二次封装的
cookies:session+token+uuid
解决方案:
1- 先通过登录的方式获取第三方接口的token
2- 再使用本测试项目的登录去获取cookies
3- 先从本项目的cookes提取session
4- 二次封装 cookie=sessionid+token
2.3 cookie实战(关联操作)
1、cookie关联操作
前端访问路径:http://124.223.33.41:7081/mgr/login/login.html
1、登录接口
- url : http://124.223.33.41:7081/api/mgr/loginReq http协议
- 请求体:
username auto 必填
password sdfsdfsdf 必填 - 响应头
比如:·sessionid=89emkau5vhyg8vcwfwvq2pvr7ul2t5sc
· Content-Type 必填 该字段值为 application/json,表示返回 JSON 格式的文本信息。
·Set-Cookie 必填 该字段保存本次登录的 sessionid, - 响应体
如果请求成功,返回 json 格式的消息体,如下所示,retcode 值为 0 表示登录认证成功
{
"retcode": 0
}
如果输入的用户名或者密码错误,则返回结果为:
{
"retcode": 1,
"reason": "用户或者密码错误"
}
2、课程接口
- 请求语法: GET /api/mgr/sq_mgr/?action=list_course&pagenum=1&pagesize=20 HTTP/1.1
- url请求参数
- 参数名
(1)action:填写list_course,表明是要列出所有课程信息
(2)pagenum:表示当前要显示的是第几页,目前固定填写1
(3)pagesize:表示一页最多显示多少条课程信息,目前固定填写20 - 请求体内容:该请求无需指定请求内容。
- 响应内容
如果请求成功,返回json格式的消息体,如下所示
{
"retlist": [
{
"desc": "初中语文",
"id": 418,
"display_idx": 1,
"name": "初中语文"
}
],
"total": 3,
"retcode": 0
}
retcode值为0表示查询成功。
total 值表示总共有多少门课程信息
retlist的内容是一个数组,其中每个元素对应一门课程信息。
示例
testData2 = { "action":"list_course", "pagenum":1,"pagesize":20 }
2.4 cookie实战代码
#登录接口
fiddler_proxies = {
'http':'http://127.0.0.1:8888',
'https':'http://127.0.0.1:8888'
}
esp = requests.post(url,params=payload)
HOST = 'http://120.55.190.222:7080'
import requests
def login():
#1- url
url = f'{HOST}/api/mgr/loginReq'
#2- 请求体
payload = {'username':'auto','password':'sdfsdfsdf'}
#3- 请求
resp = requests.post(url,data=payload)
#获取cookie
#方案一:响应里就有这个cookie
# print(resp.cookies)
return resp.cookies#返回原生态的cookie
#需要关联的接口
def add_lesson(userCookie):
# 1- url
url = f'{HOST}/api/mgr/sq_mgr/'
# 3- 请求
resp = requests.post(url, cookies =userCookie)
print(resp.request.headers)#查看请求头的cookies
if __name__ == '__main__':
userCookie= login()
add_lesson(userCookie)
2.5 自己封装cookie关联后续接口实战
使用场景描述:举例说明如下
1、一个电商整个项目安装包给学员
2、电商项目使用了cookie机制--sessionid
3、为了避免非VIP使用该项目,在使用这个项目的使用,会弹出一个VIP认证的页面,需要输入VIP账号
4、这个时候,代码层做接口自动化测试时:需要自己获取sessionID+token
代码实战:
HOST = 'http://120.55.190.222:7080'
import requests
def login():
#1- url
url = f'{HOST}/api/mgr/loginReq'
#2- 请求体
payload = {'username':'auto','password':'sdfsdfsdf'}
#3- 请求
resp = requests.post(url,data=payload)
#获取cookie
#方案二:需要额外增加一些参数到cookie---定制化cookie--提取sessionID
print(resp.cookies['sessionid'])
return resp.cookies['sessionid']#返回原生态的cookie里的sessionID
#需要关联的接口
def add_lesson(userCookie):
# 1- url
url = f'{HOST}/api/mgr/sq_mgr/'
# 3- 请求
resp = requests.post(url, cookies =userCookie)
print(resp.request.headers)#查看请求头的cookies
if __name__ == '__main__':
#自己封装cookie
userCookie = {'sessionid':userSessionId,'token':'123456'}
add_lesson(userCookie)