python中使用token模拟登录

背景:在接口测试中我们经常是需要一个登陆token,或者获取其他用到的参数来关联下一个接口用到的参数。

Token的意义及用法

一.Token的来源:

       当客户端多次向服务端请求数据时,服务端就需要多次从数据库中查询用户名和密码并进行对比,判断用户名和密码是否正确,并作出相应提示。但这样无疑会增加服务器端的运行压力,是否可以有一种方式只需要验证用户就是之前的用户而不需要每次在客户端请求数据时都需要查询数据库判断用户名和密码是否正确。在这种请求下,引入了token来解决服务器端多次访问数据库问题。

1、什么是Token:

       Token是服务端生成的一串字符串,作为客户端进行请求时辨别客户身份的的一个令牌。当用户第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

2、使用Token的目的:

  Token的目的是为了验证用户登录情况以及减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

二. Token的运用流程:

1、当用户首次登录成功之后, 服务器端就会生成一个 token 值,这个值,会在服务器保存token值(保存在数据库中),再将这个token值返回给客户端;

2、客户端拿到 token 值之后,进行保存 (保存位置由服务器端设置);

3、以后客户端再次发送网络请求(一般不是登录请求)的时候,就会将这个 token 值附带到参数中发送给服务器.;

4、服务器接收到客户端的请求之后,会取出token值与保存在本地(数据库)中的token值进行比较;

5、如果两个 token 值相同, 说明用户登录成功过!当前用户处于登录状态;

6、如果没有这个 token 值, 没有登录成功;

7、如果 token 值不同: 说明原来的登录信息已经失效,让用户重新登录;

案例实践

本案例中登录接口返回的sign,作用类似于token值,即用该值关联下一个接口。

 整体思路

1、先进行登录操作,并从响应体中提取sign值;

2、将提取到的sign值传参到下一个接口的请求头header就可以了。

# 从登录接口获取到sign(暂且当作token),并将sign作为参数用于学生金币充值接口

import requests
import json
import urllib3
urllib3.disable_warnings()

# 登录接口
url1 = "http://api.nnzhp.cn/api/user/login"
# 学生金币充值接口
url2 = "http://api.nnzhp.cn/api/user/gold_add"
param1 = {
    "username": "niuhanyang",
    "passwd": "aA123456"
}

session = requests.session()
response = session.post(url=url1, data=param1)
response = json.loads(response.text)
# 从响应体中提取sign(类似于token值,后面用于其它接口的调用)
sign = response["login_info"]["sign"]
# 由于此案例要求传入cookie而非token值,所以只能打印出来,手动添加至下一个请求的header中
print(sign)

header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0",
    "Cookie": "niuhanyang=754a2e97989e9ba3d5ab8dc6764f5b51"
}

# 假如此案例要求传入token值,则不需要先print打印,可直接向header请求头添加对象键值,如下:
# header['token'] = sign

param2 = {
    "stu_id": 123456,
    "gold": 10000
}

res = session.post(url=url2, headers=header, data=param2)
print(res.text)

运行结果:

754a2e97989e9ba3d5ab8dc6764f5b51
{
        "error_code": 0,
        "msg": "操作成功!"
}

Process finished with exit code 0

参考:https://www.cnblogs.com/du-hong/p/10735012.html

原文地址:https://www.cnblogs.com/Maruying/p/13511995.html