软件测试

接口测试心得--签名处理(Python)

一、背景

最近负责的项目接口签名规则做了调整,第一次接触“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:签名(必填项)

1 """

2 Created on 2019年04月03日3 @author:4 """

5

6 importtime7 importhashlib8 importrequests9 importoperator10 importjson11

12 appKey = "n3nuk67byade3c3qgrccjhosvmqfzt7z5wavp3ig"

13

14 appSecret = "b3a3056ef7ffb441332892ed76998b2e"

15

16 time_stamp =str(int(time.time()))17

18 url = "http://10.10.10.100:8080/rest/v1/token/get"

19

20

21 classget_tokenclass():22

23 #生成字符串

24 defstr_create(self):25 if operator.lt(appKey[0], appSecret[0]) == bool(1): #py3中operator类和py2中cmp()函数的作用相似,通过比较2个值的大小,返回布尔类型

26 strnew = time_stamp + appKey +appSecret27 else:28 strnew = time_stamp + appSecret +appKey29 print(strnew)30 returnstrnew31

32

33 #生成signature

34 defsignature_create(self):35 str_switch =self.str_create()36 signature = hashlib.sha1(str_switch.encode('utf-8')).hexdigest().upper().strip()37 print(signature)38 returnsignature39

40

41 #生成token

42 deftoken_creat(self):43 signature =self.signature_create()44 params = {"appKey":appKey, "timestamp":time_stamp, "signature":signature}45 res = requests.get(url=url,params=params)46 print(res.url)47 print(json.loads(res.content.decode('utf-8')))48 token = json.loads(res.content.decode('utf-8'))['result']['token'] #字节型的response转换成字符串型,再转换成字典型

49 print(token)50 returntoken51

52

53 if __name__ == '__main__':54 tc =get_tokenclass()55 #str_create()

56 #signature_create()

57 tc.token_creat()58 #tc.str_create()

59 #tc.signature_create()

测试用例:

测试用例用unittest框架来组织

1 """

2 Created on 2019年04月03日3 @author:4 """

5

6 importrequests7 importunittest8 importget_token9 from get_token importget_tokenclass10 importjson11 importre12 importhashlib13 importrandom14

15

16 classTest(unittest.TestCase):17

18 defsetUp(self):19 token_class =get_tokenclass()20 self.apiToken =token_class.token_creat()21 self.sign =token_class.signature_create()22 self.timeSTAP =get_token.time_stamp23 self.appKey =get_token.appKey24 self.appSecret =get_token.appSecret25 self.base_url = "http://10.10.10.100:8080"

26 self.headers = {"Content-type": "application/json", "Connection": "close"}27 self.requestId = str(random.randint(0, 99999)) #每次请求(每个case)生成不同的随机requestId

28

29

30 deftearDown(self):31 pass

32

33

34 #删除酒店

35 deftest_001(self):36 params ={37 "header": {38 "appKey": self.appKey,39 "apiToken": self.apiToken,40 "requestId": self.requestId,41 "timestamp": self.timeSTAP,42 "sign": self.sign43 },44 "body": {45 "hotels": [46 "aaa",47 "bbb"

48 ]49 }50 }51 body_list1 = str(params["body"])52 body_list2 = body_list1.replace(body_list1[25:32], "udid")53 body_list3 = re.sub("[[]", "", body_list2)54 body_list = re.sub("[]]", "", body_list3)55 list_sig = self.timeSTAP + self.apiToken + self.appSecret + self.appKey +body_list56 signature = hashlib.sha1(list_sig.encode('utf-8')).hexdigest().upper().strip()57 params["header"]["sign"] =signature58 res = requests.post(url=self.base_url+"/partner/hotel/remove", data=json.dumps(params), headers=self.headers) #第二次签名验证

59 response = json.loads(res.content.decode('utf-8'))60 self.assertEqual(response["msg"], "SUCCESS")61

62

63 if __name__ == '__main__':64 mySuit =unittest.TestSuite()65 tesTCases = ["test_001", "test_002", "test_003", "test_004", "test_005", "test_006", "test_007"]66 for cs intesTCases:67 mySuit.addTest(Test(cs))68 #mySuit.addTest(Test("test_003"))

69 myRun =unittest.TextTestRunner()70 myRun.run(mySuit)

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

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

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

附上链接:

-----------

-----------

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

如:

importhashlib

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

结果:E10ADC3949BA59ABBE56E057F20F883E

附上几篇不错的文章:

-----------

-----------

内容来源于网络,如有侵权请联系客服删除

python调用加签名的接口_接口测试心得--签名处理(Python)相关推荐

  1. python实现简单的api接口-简单实现Python调用有道API接口(最新的)

    # ''' # Created on 2018-5-26 # # @author: yaoshuangqi # ''' import urllib.request import urllib.pars ...

  2. 用Python调用华为云API接口发短信

    [摘要] 用Python调用华为云API接口实现发短信,当然能给调用发短信接口前提条件是通过企业实名认证,而且有一个通过审核的短信签名,话不多说,showcode #!/usr/bin/python3 ...

  3. 使用Python调用有道翻译接口实现翻译任务

    使用Python调用有道翻译接口实现翻译任务 首先直接上代码,可以直接复制调用 import hashlib import random import timeimport requestsclass ...

  4. 使用Python调用baidu翻译的接口,实现转换android stuido 中的values/strings.xml 解放生产力,自动翻译生成文件

    调用baidu翻译的接口,实现转换android stuido 中的values/strings.xml 解放生产力,自动翻译生成文件 因为使用的是合法免费的接口,每秒只能请求一次,测试结果翻译330 ...

  5. hfss和python接口_【技术分享】python和HFSS联合仿真微带天线的教程

    我们知道 HFSS 是一款电磁 仿真 商用软件,用其进行天线的设计十分方便.而该软件也预留了可以运行脚本的接口,使用者可以使用脚本对软件进行控制,实现模型的建立.求解等等.由于后期可能会用到联合仿真, ...

  6. 用 python 调用百度翻译 v2transapi 接口

    一.获得接口 url 打开百度翻译:百度翻译 右键检查 或者 F12 打开控制台.点击网络这一项: 输入文字:哈哈,点击图中的过滤按钮,选择全部 可以看到,v2transapi?from=zh& ...

  7. python调用qq发送短信_使用腾讯云发送短信

    使用腾讯云发送短信 第一次注册使用白送你200条,美滋滋 在腾讯云平台申请 点点点操作就完事了,要想发送短信,必须要申请签名和模板.签名类型可以使用网站,公众号,小程序,app 填好信息,上传指定的截 ...

  8. python调用cmd命令释放端口_详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  9. python调用shell脚本的参数_使用python执行shell脚本 并动态传参 及subprocess的使用详解

    最近工作需求中 有遇到这个情况 在web端获取配置文件内容 及 往shell 脚本中动态传入参数 执行shell脚本这个有多种方法 最后还是选择了subprocess这个python标准库 subpr ...

  10. python十个运维实战项目_干货 | 这4个Python实战项目,让你瞬间读懂Python!

    Python是一种极具可读性和通用性的编程语言.Python这个名字的灵感来自于英国喜剧团体Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Python易于设置, ...

最新文章

  1. 当专业动画师用GAN帮自己“偷懒”,几分钟就完成了几周的工作
  2. db2关闭下一句sql的日志_MySQL性能管理及架构设计:SQL查询优化、分库分表
  3. 【轉】Android编程之SparseArrayE详解
  4. python画折线图详解-手把手教你Python yLab的绘制折线图的画法
  5. Linux加载Linux的引导程序,Linux的引导-引导加载程序:LILO和GRUB
  6. Cannot start compilation:the output path is not specifired for module “xxx“.Specify the output path
  7. 比开源快30倍的自研SQL Parser设计与实践
  8. java的基础语法和数据类型,IDEA
  9. [转载] java:比较运算符
  10. 如何使用JavaScript控制台:超越console.log()
  11. 数据结构练习(08)链表中倒数第k个结点
  12. VXLAN Ethernet Virtual Private Network集中式和分布式网关实验(华为设备)
  13. 详解BetterZip对压缩包注释的一些相关小功能
  14. 微服务框架自带uuid生成器
  15. 使用OpenOffice实现Word转Html
  16. fifo的rdata_异步FIFO设计与实现
  17. 【研报笔记】光大技术择时系列1:基于阻力支撑相对强度(RSRS)的市场择时
  18. 向oracle中插入图片和读取图片
  19. 虚云法师:但尽凡心,别无圣解
  20. 51单片机小项目--超声波避障小车

热门文章

  1. 两台CP1H-X40DT-D扩展8轴100K脉冲输出
  2. 欧姆龙 CJ1W-SCU yN+x功能
  3. 证明Stingy SAT问题为NP完全问题
  4. QQ空间如何设置被删除的好友不能访问空间
  5. JavaWeb学习——springBoot基础(无图,待补)
  6. Office 2007 PIA Demo
  7. 在安卓中使用SVG矢量图
  8. Python自动化测试PO模型封装过程详解
  9. 代理销售云服务器利润多少,云服务器利润
  10. 数字孪生,AR / VR为工业自动化企业带来哪些变化与好处