一、背景

最近负责的项目接口签名规则做了调整,第一次接触“2次认证“的方式,正好有时间,记录一下。

测试的服务A有一部分接口需要给第三方调用,这样需要对第三方有个认证,认证是由一个公共服务(API鉴权服务)来完成的。

基本框架:

调用时序图:

第三方调用服务A的认证流程:

1、先访问API鉴权服务来获取apiToken(即拿到访问服务A的认证)

2、再由获取到的apiToken参与服务A的签名认证规则

这样就相当于在第三方和服务A直接增加了2次认证,安全性有了更好的保障。

流程1(获取apiToken)的签名规则如下:

1、将所有请求参数的值放入List中,注意:计算sign时所有参数不应进行URLEncode;

2、将格式化后的参数以字典序升序排列,拼接在一起,注意字典序中大写字母在前,空值(null)使用空字符串代替;

3、将B形成字符串获取SHA1摘要,形成一个40位的十六进制(字母大写)字符串,即为本次请求signature(签名)的值;   

流程2(获取服务A的签名)的规则如下:

1、参与签名的参数为:apiToken+appKey+appSecret+timestamp+body(提取body中的所有参数)

2、将格式化后的参数以字典序升序排列,拼接在一起

3、将第二步形成字符串获取SHA1摘要

4、第三步获得的字符串即为签名参数

二、代码实现

规则同时也是签名的构造方法,按照上面所列的步骤用Python来实现。

获取apiToken:

请求参数有3个:

appKey:应用KEY(必填项)

timestamp: 访问时间戳(必填项),Unix时间戳;

signature:签名(必填项)

 """
Created on 2019年04月03日
@author:
""" import time
import hashlib
import requests
import operator
import json appKey = "n3nuk67byade3c3qgrccjhosvmqfzt7z5wavp3ig" appSecret = "b3a3056ef7ffb441332892ed76998b2e" time_stamp = str(int(time.time())) url = "http://10.10.10.100:8080/rest/v1/token/get" class get_tokenclass(): # 生成字符串
def str_create(self):
if operator.lt(appKey[0], appSecret[0]) == bool(1): #py3中operator类和py2中cmp()函数的作用相似,通过比较2个值的大小,返回布尔类型
strnew = time_stamp + appKey + appSecret
else:
strnew = time_stamp + appSecret + appKey
print(strnew)
return strnew # 生成signature
def signature_create(self):
str_switch = self.str_create()
signature = hashlib.sha1(str_switch.encode('utf-8')).hexdigest().upper().strip()
print(signature)
return signature # 生成token
def token_creat(self):
signature = self.signature_create()
params = {"appKey":appKey, "timestamp":time_stamp, "signature":signature}
res = requests.get(url=url,params=params)
print(res.url)
print(json.loads(res.content.decode('utf-8')))
token = json.loads(res.content.decode('utf-8'))['result']['token'] #字节型的response转换成字符串型,再转换成字典型
print(token)
return token if __name__ == '__main__':
tc = get_tokenclass()
# str_create()
# signature_create()
tc.token_creat()
# tc.str_create()
# tc.signature_create()

测试用例:

测试用例用unittest框架来组织

 """
Created on 2019年04月03日
@author:
""" import requests
import unittest
import get_token
from get_token import get_tokenclass
import json
import re
import hashlib
import random class Test(unittest.TestCase): def setUp(self):
token_class = get_tokenclass()
self.apiToken = token_class.token_creat()
self.sign = token_class.signature_create()
self.timeSTAP = get_token.time_stamp
self.appKey = get_token.appKey
self.appSecret = get_token.appSecret
self.base_url = "http://10.10.10.100:8080"
self.headers = {"Content-type": "application/json", "Connection": "close"}
self.requestId = str(random.randint(0, 99999)) #每次请求(每个case)生成不同的随机requestId def tearDown(self):
pass # 删除酒店
def test_001(self):
params = {
"header": {
"appKey": self.appKey,
"apiToken": self.apiToken,
"requestId": self.requestId,
"timestamp": self.timeSTAP,
"sign": self.sign
},
"body": {
"hotels": [
"aaa",
"bbb"
]
}
}
body_list1 = str(params["body"])
body_list2 = body_list1.replace(body_list1[25:32], "udid")
body_list3 = re.sub("[[]", "", body_list2)
body_list = re.sub("[]]", "", body_list3)
list_sig = self.timeSTAP + self.apiToken + self.appSecret + self.appKey + body_list
signature = hashlib.sha1(list_sig.encode('utf-8')).hexdigest().upper().strip()
params["header"]["sign"] = signature
res = requests.post(url=self.base_url+"/partner/hotel/remove", data=json.dumps(params), headers=self.headers) #第二次签名验证
response = json.loads(res.content.decode('utf-8'))
self.assertEqual(response["msg"], "SUCCESS") if __name__ == '__main__':
mySuit = unittest.TestSuite()
tesTCases = ["test_001", "test_002", "test_003", "test_004", "test_005", "test_006", "test_007"]
for cs in tesTCases:
mySuit.addTest(Test(cs))
# mySuit.addTest(Test("test_003"))
myRun = unittest.TextTestRunner()
myRun.run(mySuit)

另外,学会了一个变量名warning的处理办法,pep8编码规范,要求变量名或者函数名最好包含大小写。

除了通过修改pycharm设置的方式,还可以使用“驼峰命名法”来给变量或函数命名。

“驼峰命名法”,顾名思义,就是变量或函数的命名要像骆驼的驼峰一样有高低起伏(Ps:这个名字是不是很可爱呢~)

附链接:

-----------

https://baike.baidu.com/item/%E9%AA%86%E9%A9%BC%E5%91%BD%E5%90%8D%E6%B3%95/7794053?fromtitle=%E9%A9%BC%E5%B3%B0%E5%91%BD%E5%90%8D%E6%B3%95&fromid=7560610&fr=aladdin

-----------

另外:python的hashlib库还可以完成密码的md5加密等功能。

如:

import hashlib

password1 = hashlib.md5("".encode('utf-8')).hexdigest().upper().strip()
print(password1)

结果:E10ADC3949BA59ABBE56E057F20F883E

不错的文章:

-----------

https://blog.csdn.net/m0_38080253/article/details/78838489

https://blog.csdn.net/qq_24452475/article/details/79623051

-----------

接口测试心得--签名处理(Python)的更多相关文章

  1. Python接口测试实战2 - 使用Python发送请求

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  2. 接口测试框架——第二篇-python读取excel文件内容

    今天完善excel_module.py文件,上代码: # coding: utf-8 import xlrd class ReadExcel(): def __init__(self, file_na ...

  3. Python面试的一些心得,与Python练习题分享【华为云技术分享】

    版权声明:本文为CSDN博主「华为云」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/devcloud/arti ...

  4. Python面试的一些心得,与Python练习题分享

    关于基础 项目打算招聘一个自动化运维,主要需求是python.Linux与shell脚本能力.但面试几天发现一些问题: 简历虚假 这个不管哪行,简历含水量大都是普遍存在的,看简历犀利的一比,一面是能力 ...

  5. JMeter接口测试-接口签名校验

    前言 很多HTTP接口在传参时,需要先对接口的参数进行数据签名加密 如pinter项目的中的签名接口 http://localhost:8080/pinter/com/userInfo 参数为: {& ...

  6. Python接口测试实战1(上)- 接口测试理论

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  7. Python nose单元测试框架结合requests库进行web接口测试

    [本文出自天外归云的博客园] 之前写过一篇关于nose使用方法的博客.最近在做一元乐购产品的接口测试,结合着python的requests库可以很方便的进行web接口测试并生成测试结果.接口测试脚本示 ...

  8. Python接口测试实战4(下) - 框架完善:用例基类,用例标签,重新运行上次失败用例

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  9. Python接口测试实战5(上) - Git及Jenkins持续集成

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

随机推荐

  1. FPGA中的除法运算及初识AXI总线

    FPGA中的硬件逻辑与软件程序的区别,相信大家在做除法运算时会有深入体会.硬件逻辑实现的除法运算会占用较多的资源,电路结构复杂,且通常无法在一个时钟周期内完成.因此FPGA实现除法运算并不是一个&qu ...

  2. 同一台电脑上配置多个解压版tomcat方法(本例安装两个)

    一.在环境变量中设置变量() CATALINA_HOME = tomcat路径一 CATALINA_BASE = tomcat路径一 CATALINA_HOME2 = tomcat路径二 CATALI ...

  3. 3d轮播图(另一种方式,可以实现的功能更为强大也更为灵活,简单一句话,比酷狗优酷的炫)

    前不久我做了一个3d仿酷狗的轮播图,用的技术原理就是简单的jquery遍历+css样式读写. 这次呢,我们换一种思路(呵呵其实换汤不换药),看到上次那个轮播吗?你有没有发现用jquery的animat ...

  4. Robot Framework自动化_环境搭建以及第一个用例

    Robot Framework自动化_环境搭建以及第一个脚本 培训老师:肖能尤 2016/06/07 课程目的 一.Robot framework 环境搭建以及第一个脚本 课程内容 1    安装前准 ...

  5. C语言下double转char*或者std::string,可以精确转换不含多余的0

    char* GetDoubleStr(double value) { char buf[32]={0};//长度可以自定义 sprintf(buf,"%.8f",value);// ...

  6. 【转】搭建自己的 sentry 服务

    1. 安装 docker 首先要确认你的 Ubuntu 版本是否符合安装 Docker 的前提条件.如果没有问题,你可以通过下边的方式来安装 Docker : 使用具有 sudo 权限的用户来登录你的 ...

  7. 分布式系统之CAP理论杂记

    分布式系统的CAP理论:理论首先把分布式系统中的三个特性进行了如下归纳:● 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值.● 可用性(A):在集群中一部分节点故障后,集群整体是否 ...

  8. Windows上设置Mozilla Thunderbird邮件客户端后台运行

    作者:荒原之梦 操作系统: Windows 10 Thunderbird版本: 52.6.0(32-bit) Thunderbird官网页面:https://www.mozilla.org/zh-CN ...

  9. CentOS安装JAVA

    http://hermosa-young.iteye.com/blog/1798026 每次都要搜索一下太麻烦了,留个底,方便以后查询 一般情况下,我们都要将linux自带的OPENJDK卸载掉,然后 ...

  10. Django—models相关操作

    一.在django后台admin管理页面添加自己增加的表结构 通过终端命令:python3 manage.py makemigrations, python3 manage.py migrate 我们 ...