博客
关于我
Python处理接口测试的签名
阅读量:403 次
发布时间:2019-03-06

本文共 5198 字,大约阅读时间需要 17 分钟。

一、背景

最近负责的项目接口签名规则做了调整,第一次接触“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 import time 7 import hashlib 8 import requests 9 import operator10 import json11 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 class get_tokenclass():22 23     # 生成字符串24     def str_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         return strnew31 32 33     # 生成signature34     def signature_create(self):35         str_switch = self.str_create()36         signature = hashlib.sha1(str_switch.encode('utf-8')).hexdigest().upper().strip()37         print(signature)38         return signature39 40 41     # 生成token42     def token_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         return token51 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 import requests 7 import unittest 8 import get_token 9 from get_token import get_tokenclass10 import json11 import re12 import hashlib13 import random14 15 16 class Test(unittest.TestCase):17 18     def setUp(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)生成不同的随机requestId28 29 30     def tearDown(self):31         pass32 33 34     # 删除酒店35     def test_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 in tesTCases: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加密等功能。

如:

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

结果:E10ADC3949BA59ABBE56E057F20F883E

不错的文章:

-----------

-----------

转载地址:http://noikz.baihongyu.com/

你可能感兴趣的文章
(C++11/14/17学习笔记):线程启动、结束,创建线程多法、join,detach
查看>>
趣谈win10常用快捷键
查看>>
IDEA出现问题:Received fatal alert: protocol_version 解决方案
查看>>
Airtest自动化测试 Docs airtest.core.android package
查看>>
11.2.6 时间值的小数秒
查看>>
Redis源码分析(七)--- zipmap压缩图
查看>>
【MySQL】(九)触发器
查看>>
Oracle 11G环境配置
查看>>
【Python】(十二)IO 文件处理
查看>>
【Oozie】(三)Oozie 使用实战教学,带你快速上手!
查看>>
师兄面试遇到这条 SQL 数据分析题,差点含泪而归!
查看>>
C语言的数值溢出问题(上)
查看>>
8051单片机(STC89C52)以定时器中断模式实现两倒计时器异步计时
查看>>
vue项目通过vue.config.js配置文件进行proxy反向代理跨域
查看>>
android:使用audiotrack 类播放wav文件
查看>>
ACM/NCPC2016 C Card Hand Sorting(upc 3028)
查看>>
SLAM学习笔记-求解视觉SLAM问题
查看>>
程序员应该知道的97件事
查看>>
shell编程(六)语言编码规范之(变量)
查看>>
vimscript学习笔记(二)预备知识
查看>>