前言:今天咱们来学习下使用Python来做cookie和token及session鉴权方式,我们将通过几个简单的例子来快速学习上手
鉴权就是鉴定权限,最常见的就是鉴定该用户是否为登录状态。最开始做接口测试的时候,找了一个接口,把协议、ip、URL填好以后就以为万事大吉。一发起请求,查看响应就说登录信息错误。
为什么呢?这就是因为没有鉴权,服务器根本就不认识你,所以就不理你,请求的数据就不会发送给你了。
答:说到这里,又不得不说一下http协议的工作原理。
简单来说,就是客户端(浏览器)发起请求,服务器端接收到请求,根据请求参数解析到对应的资源,再返回给客户端的过程。
cookie是鉴权的方式之一,是客户端登录后,服务器端生成后发送给客户端的。cookie可以保存很多种数据,但是他只能保存字符串,且在安全性上有隐患。
在客户端发起请求后,服务器端生成一个cookie,并发送给客户端,保存在客户端本地,下次请求的时候带上cookie。cookie鉴权:登陆接口的响应头当中,有set-cookie
在登陆之后其它业务请求当中,请求头会带上登陆返回的cookie
例子:
#####################例子:手动传参cookie
from jsonpath import jsonpath
import requests
class KeTangPai_login:
def __init__(self):
self.url_ketang = "https://v4.ketangpai.com/UserApi/login"
self.vip_url = "https://v4.ketangpai.com/VipApi/isVip"
self.login_headers = {"content-type":"application/x-www-form-urlencoded; charset=UTF-8"}
self.cookie = {}
def login(self):
data_login = {
"email":"xxxx",#换成你的账号
"password":"xxxxx",#换成你的密码
"remember": 0
}
res = requests.post(url =self.url_ketang,data= data_login,headers=self.login_headers)
print(res.json())
cookies = jsonpath(res.json(),"$..token")[0] #jsonpath取出cookie 是一个列表,需要通过索引取到具体值
self.cookie["cookie"] =cookies
def getUserVipSetting(self):
self.login()
vipSetting_res = requests.get(url=self.vip_url,headers = self.cookie)#headers = self.cookie的意思是 用返回的cookie作为头带到请求里面去
print(vipSetting_res.json())
cl = KeTangPai_login()
cl.getUserVipSetting()
session是一种会话,比如我发起请求到关闭浏览器这个过程就是一个会话。session是鉴权的方式之二,在客户端发起请求后,服务器生成一个对应的session,并保存在服务器中,再把session保存到cookie里面,通过cookie发送给客户端,客户端接收到cookie过后,下一次请求时就会把cookie带上,服务器收到请求中的session后就会把它与之前保存的session做对比,如果是一样的,那就说明是已经登录过的,如果不一样,那就需要重新登录
例子:
例子2:session()自动传cookie鉴权
import requests
session = requests.session()
login_data = {"email": "xxxx",#换成你的账号
"password": "XXXX",
"remember": 0}
print("登陆之前的请求头:",session.headers)
response1 = session.post(url="https://v4.ketangpai.com/UserApi/login",data=login_data)
print(response1.json())
print("*"*30)
response2 = session.get(url="https://v4.ketangpai.com/VipApi/isVip")
print(response2.request.headers)
print(response2.json())
tocken是一个令牌,是鉴权方式之三,他是由一部分固定的header、以及body组成的,在body中可以放userid+电话号码,等用户的非隐秘信息,然后再通过某种加密方式,把这两部分加密形成一个秘钥。
在客户端发起请求后,服务器会生成一个tocken,可以通过cookie也可以直接发送给客户端,客户端接收到tocken后,会把它保存在本地,在下一次请求时,会带上,服务器端收到二次请求以及带上的tocken后,会再根据用户的信息去加密一个tocken,再把两次tocken进行比对,如果是相同的,那就不用再登录了,如果不一样就需要再重新登录。token鉴权:token值 一般都是放在登陆接口的响应数据当中,需要提取出来。
在登陆之后其它业务请求当中,可能是在请求头当中带上token,也可能是在请求体当中带上token
看接口的开发者如何定义
例子:
import requests
#登录令牌token
url = "https://openapiv5.ketangpai.com/UserApi/login"
req_data = {"email":"XXXX","password":"XXXX","remember":"0","code":"","mobile":"","type":"login"}
#这里用了Jason是因为新版课堂派的content-type是Jason格式
resp = requests.post(url,json=req_data)
print(resp.json())
#{'status': 1, 'code': 10000, 'message': '访问成功', 'data': {'url': '', 'token': '998478ac6fe7a50965aff12fc4f62b61f711829a14a335d74b68123b8c646f70', 'isenterprise': 0, 'uid': 'MDAwMDAwMDAwMLR2uZaGqatohLVyoQ'}}
#访问其他接口地址带上token
#通过字典取值到token
resp_dict = resp.json()
token = resp_dict["data"]["token"]
#下一个接口地址
url1 = "https://openapiv5.ketangpai.com/UserApi/getUserBasinInfo"
req_data2 = ""
#传入取值后的token
req_header = {"token": token}
resp2 = requests.post(url1,json=req_data2,headers=req_header)
print(resp2.json())
例子2:
class XinV5_KeTangPai_login:
def __init__(self):
self.url_ketang_login = "https://openapiv5.ketangpai.com//UserApi/login"
self.login_headers = {"content-type":"application/json; charset=UTF-8"}
self.rchiveSemesterList_ulr = "https://openapiv5.ketangpai.com//CourseApi/archiveSemesterList"
self.token = {}
def xin_login(self):
login_data = {
"email": "xxxx",#换成你的账号
"password": "xxxx",
# "remember": "0",
# "code": "",
# "mobile": "",
# "type": "login",
# "reqtimestamp": 1648376173056
}
response_login = requests.post(url=self.url_ketang_login,json=login_data,headers =self.login_headers)
print(response_login.json())
get_token = jsonpath(response_login.json(),"$..data")[0]["token"] #jsonpath提取token
self.token["token"] = get_token
def rchiveSemesterList(self):
self.xin_login()
data = {
"isstudy": "0",
"search": "",
"reqtimestamp": 1648378296877
}
response_rchiveSemesterList = requests.post(url=self.rchiveSemesterList_ulr, json=data, headers=self.token)#headers=self.token把token带到请求头里面去鉴权
print(response_rchiveSemesterList.json())
clll = XinV5_KeTangPai_login()
clll.rchiveSemesterList()
cookie、session、tocken的区别
1.生成的位置相同:cookie、session、tocken都是在服务器端生成;
2.保存的位置不同:cookie、tocken保存在客户端本地,session保存在服务器;
3.鉴权过程不同: cookie是将请求中携带的cookie与服务器记录的cookie做对比; session是将请求中携带的session与服务器存储的session做对比; tocken是将请求中携带的tocken与服务器通过请求中的信息(userid、签名)生成的tocken作对比。