说明
接口鉴权使用方式很多,接口的请求有时候需要携带不同参数再次向服务端发起请求:常见的参数有token、cookies、session等
鉴权是什么?
鉴权就是鉴定权限,最常见的就是鉴定该用户是否为登录状态。最开始做接口测试的时候,找了一个接口,把协议、ip、URL填好以后就以为万事大吉。一发起请求,查看响应就说登录信息错误。
为什么呢?这就是因为没有鉴权,服务器根本就不认识你,所以就不理你,请求的数据就不会发送给你了
知识分享
什么是cookie
属于浏览器提供的在客户端存储数据的一种机制。(由于浏览器禁止了网页中的代码直接访问磁盘的文件因此要想再网页中实现数据的持久化存储、就可以使用Cookie。
存储的数据是键值对的格式,不一定是字典,就是键值的组成格式,由程序员自定义的。
Cookie在客户端和服务端的传递方式
服务器返回响应的时候。可以把要在客户端保存的数据以
Set-Cookie
放在header
里的方式来返回给浏览器。
客户端下次访问服务器的时候,就会把之前保存好的cookie
再发给服务器
为什么出现cookie?
HTTP 协议自身是属于 “无状态” 协议.
“无状态” 的含义指的是:
默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系,为了方便下次两者之间再联系方便认证而建立的存储机制。
http协议的工作原理:
服务端给客户端的令牌就是token/cookies/session
服务端通过这个给的令牌与自己的sessionid绑定,下次就能对应关系便捷处理响应:
因为服务端同时处理多个回话,如果不建立sessionid机制,会话可能就乱了。
Cookie 和 Session 的区别
Cookie 是客户端的机制. Session 是服务器端的机制
cookies 是服务器为了标记用户,存储在用户本地的数据,它里面也保存了用户的登录信息,同时它有一定的时效性,过期就会失效
session 是会话过程中,服务器用来记录特定用户会话的信息
session和cookies的关系: cookies里带有session的编码信息,服务器可以通过cookies辨别用户,同时返回和这个用户相关的特定编码的session
————————————————
原文链接:https://blog.csdn.net/qq_56444564/article/details/128840277
cookie、session、tocken的区别
1.生成的位置相同:cookie、session、token都是在服务器端生成;
2.保存的位置不同:cookie、tocken保存在客户端本地,session保存在服务器;
3.鉴权过程不同: cookie是将请求中携带的cookie与服务器记录的session做对比; session服务器端是将请求中携带的sessionid与自己存储的session做对比; token是将请求中携带的token与服务器通过请求中的信息(userid、签名)生成的token作对比。
cookie鉴权
cookie是鉴权的方式之一,是客户端登录后,服务器端生成后发送给客户端的。cookie可以保存很多种数据,但是他只能保存字符串,且在安全性上有隐患。
在客户端发起请求后,服务器端生成一个cookie,并发送给客户端,保存在客户端本地,下次请求的时候带上cookie。
cookie鉴权:登陆接口的响应头当中,有set-cookie
在登陆之后其它业务请求当中,请求头会带上登陆返回的cookie
————————————————
原文链接:https://blog.csdn.net/qq_41130705/article/details/125871934
登录例子处理:
import requests
"""
登录接口:
1、本身做自动化测试
2、给后续做鉴权
"""
class Login:
def login(indata):
# 请求地址
url = 'http://1xx.2xx.3xx.xxx:7080/api/mgr/loginReq'
# 请求头
# 请求体
payload = indata
# 执行请求
# 参数类型:json/data/files,通过get_Cookie布尔值控制有无cookie
resp = requests.post(url, data=payload, get_Cookie=True)
# 返回响应数据
print(resp.text)
# # 方案一:原生态cookie----如果后续接口直接使用这个cookie,不增加其他参数的,直接使用
# print(resp.cookies)
# # 方案二:后续接口使用这个cookie,再增加其他参数认证,二次封装了cookie,处理方法:
# print(resp.cookies['sessionid'])
#return resp.cookies, resp.cookies['sessionid'] #根据实际cookie 封装做返回处理
#所以处理返回的cookie方法:
if get_Cookie:
return resp.cookies['sessionid'] #二次封装cookie
# return resp.cookies #原生cookie
else:
return resp.json()
"""
参数:
- data:表单格式,form
- json:json格式
- files:文件上传
- params:一般使用get请求
- cookies:身份信息
- headers:请求头
"""
if __name__ == '__main__':
# 登录参数
login_data={'username':'xxxxx', 'psw':'xxxxxxx'}
# 登录参数
print(Login().login(login_data))
#下个接口更具具体场景使用:
#如果是方案1:原生态的cookie:下个接口请求调用直接使用cookies=cookie1即可:
resp = requests.post('url', data=data, headers=headers, cookies=cookie1)
#如果是方案2:二次封装的cookie:下个接口请求调用直接使用cookies=cookie1即可:
resp = requests.post('url', data=data, headers=headers, cookies=cookie2)
实例代码:
import json
import pprint
import requests
from configs_test.configs_req import HOST, login_data
from lib_test.login_req import Login
class addCourse:
# 初始化,封装cookie,登录返回的session传给sessionid
def __init__(self, session):
self.cookies = {'sessionid': session}
# 创建请求方法
def add_my_course(self, course_name, detail, ordernum):
# 1、请求地址
url = f'{HOST}/api/mgr/sq_mgr/'
# 2、请求头
# cookies
# 3、请求体
# 将嵌入字典转为json格式
dict = {"name": course_name, "desc": detail, "display_idx": ordernum}
# 将嵌套的字典转为字符串
dict2 = json.dumps(dict)
body = {
"action": "add_course",
"data": f'{dict2}'
}
# print(type(body))
res = requests.post(url, cookies=self.cookies, data=body)
return res.json().get('id')
# 展示课程列表
def list_course(self, pagenum, pagesize):
# 1、请求地址
url2 = f'{HOST}/api/mgr/sq_mgr/'
# 请求头
# cookie
# 2、请求体
indata = {
"action": "list_course",
"pagenum": pagenum,
"pagesize": pagesize}
# 3、发起请求
res = requests.get(url2, cookies=self.cookies, params=indata)
dict_course = res.json().get('retlist')
pprint.pprint(dict_course)
if __name__ == '__main__':
# 1、登录
cookies = Login().login(login_data, get_Cookie=True)
# 2、增加课程
logindata = addCourse(cookies)
addid = logindata.add_my_course("1223235s", "01234121d23", 4)
print(addid)
# 3、查询课程
logindata.list_course(1, 100)
--------------------**注**
-------------------------
session鉴权
session是一种会话,比如我发起请求到关闭浏览器这个过程就是一个会话。session是鉴权的方式之二,在客户端发起请求后,服务器生成一个对应的session,并保存在服务器中,再把session保存到cookie里面,通过cookie发送给客户端,客户端接收到cookie过后,下一次请求时就会把cookie带上,服务器收到请求中的session后就会把它与之前保存的session做对比,如果是一样的,那就说明是已经登录过的,如果不一样,那就需要重新登录
代码如上,方案2就是处理这种方式的,session也是通过set_cookie给到浏览器。
token鉴权
token是一个令牌,是鉴权方式之三,他是由一部分固定的header、以及body组成的,在body中可以放userid+电话号码,等用户的非隐秘信息,然后再通过某种加密方式,把这两部分加密形成一个秘钥。
在客户端发起请求后,服务器会生成一个token,可以通过cookie也可以直接发送给客户端,客户端接收到token后,会把它保存在本地,在下一次请求时,会带上,服务器端收到二次请求以及带上的tocken后,会再根据用户的信息去加密一个token,再把两次token进行比对,如果是相同的,那就不用再登录了,如果不一样就需要再重新登录。
token鉴权:token值 一般都是放在登陆接口的响应数据当中,需要提取出来。
在登陆之后其它业务请求当中,可能是在请求头当中带上token,也可能是在请求体当中带上token
看接口的开发者如何定义
登录例子:
import requests
from configs.config import HOST
# 登录接口
class Login:
def login(self, indata, getToken=False): # 实例方法,token通过布尔值开关控制下次登录token的获取与否
url = f'{HOST}/account/sLogin/' # 请求url
resp = requests.post(url, data=indata) # post请求参数
print(resp.text) # 打印响应数据
if getToken:
return resp.json()['data']['token'] # 将token返回
else:
return resp.json() #没有token的响应数据
if __name__ == '__main__':
# 登录实参
Login().login({'username': 'xxx', 'psw': 'xxxx'})
下个接口使用:初始化,header封装下token
import requests
from tkwy_config.config import HOST
from lib.apiLib.login import Login
class MyShop:
#1 需要操作商店,需要token
def __init__(self, inToken):
self.header = {'Authorization': inToken} #请求头
#2 列出种类
def list_stores(self, inData):
payload = inData
url = f'{HOST}/shopping/myShop'
respres = requests.get(url, headers=self.header, params=payload)
return respres.json()
if __name__ == '__main__':
#1 登录,将token设置为True,塞给第二个接口MyShop(token)
token = Login().login({"username": "sq0100", "psw": "111111"}, getToken=True)
#2 列出商铺
res = MyShop(token).list_stores({"page": 1, "limit": 20})
print(res)