前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >httprunner学习24-sign签名验证

httprunner学习24-sign签名验证

作者头像
上海-悠悠
发布2019-11-15 20:19:05
6470
发布2019-11-15 20:19:05
举报

前言

一般公司对外的接口都会用到sign签名,对不同的客户提供不同的apikey ,这样可以提高接口请求的安全性,避免被人抓包后乱请求。 sign签名是一种很常见的方式 关于sign签名的可以参考前面一篇的介绍https://www.cnblogs.com/yoyoketang/p/11742187.html

接口sign签名

一登陆的接口请求为例,如下接口抓包报文信息,其中sign的签名规则如下

  • 第一步,拼接字符串,首先去除sign参数本身,然后去除值是空的参数p3,剩下p2=v2&p1=v1&method=cancel&pn=vn,
  • 然后按参数名字符升序排序,method=cancel&p1=v1&p2=v2&pn=vn.
  • 第二步,然后做参数名和值的拼接,最后得到methodcancelp1v1p2v2pnvn
  • 第三步,在上面拼接得到的字符串后加上验证密钥apikey,我们假设是abc,得到新的字符串methodcancelp1v1p2v2pnvnabc
  • 第四步,然后将这个字符串换为小写进行md5计算,假设得到的是abcdef,这个值即为sign签名值。 注意,计算md5之前请确保接口与接入方的字符串编码一致,如统一使用utf-8编码或者GBK编码,如果编码方式不一致则计算出来的签名会校验失败。
POST http://127.0.0.1:8000/api/v3/login HTTP/1.1
User-Agent: Fiddler
Content-Type: application/json
Host: 127.0.0.1:8000
Content-Length: 111

{
    "username": "test",
    "password": "123456",
         "sign": "1aca01806e93bb408041965a817666af"

}

HTTP/1.1 200 OK
Date: Sat, 26 Oct 2019 03:38:31 GMT
Server: WSGIServer/0.2 CPython/3.6.0
Content-Type: application/json
Vary: Accept, Cookie
Allow: POST, OPTIONS
X-Frame-Options: SAMEORIGIN
Content-Length: 109

{"code": 0, "msg": "login success!", "username": "test", "token": "a76ba3b8fcbdff82f6a94e5ad5bf8fb934192e5f"}

httprunner脚本

使用httprunner框架写脚本

- config:
    name: logincase
    variables: {}
- test:
    name: login case1
    request:
        url: http://127.0.0.1:8000/api/v3/login
        method: POST
        headers:
            Content-Type: application/json
            User-Agent: python-requests/2.18.4
        json:
            username: test
            password: "123456"
    setup_hooks:
        -   ${setup_request($request)}
    validate:
        - eq: [status_code, 200]
        - eq: [headers.Content-Type, application/json]
        - eq: [content.msg, login success!]
        - eq: [content.code, 0]

setup_hook函数

在debugtalk.py 编写setup_hook函数,对请求的body部分预处理

import hashlib

def sign_body(body, apikey="12345678"):
    '''请求body sign签名'''
    # 列表生成式,生成key=value格式
    a = ["".join(i) for i in body.items() if i[1] and i[0] != "sign"]
    # print(a)
    # 参数名ASCII码从小到大排序
    strA = "".join(sorted(a))
    # print(strA)

    # 在strA后面拼接上apiKey得到striSignTemp字符串
    striSignTemp = strA+apikey

    # 将strSignTemp字符串转换为小写字符串后进行MD5运算

    # MD5加密
    def jiamimd5(src):
        m = hashlib.md5()
        m.update(src.encode('UTF-8'))
        return m.hexdigest()
    sign = jiamimd5(striSignTemp.lower())
    # print(sign)

    return sign

def setup_request(request):
    '''setuphook函数,发请求前预处理'''
    body = request.get("json")
    print(body)
    # 由body请求参数生成sign值
    sign = sign_body(body, apikey="12345678")
    print("sign值:%s" % sign)
    request["json"]["sign"] = sign

if __name__ == '__main__':
    body = {
        "username": "test",
        "password": "123456"
    }
    print(sign_body(body))

运行用例

D:\soft\HELL\DEMO>hrun login_sign_demo.yml
login case1
{'username': 'test', 'password': '123456'}
sign值:1aca01806e93bb408041965a817666af
INFO     POST http://127.0.0.1:8000/api/v3/login
INFO     status_code: 200, response_time(ms): 689.84 ms, response_length: 109 bytes
INFO     start to validate.
.

----------------------------------------------------------------------
Ran 1 test in 0.698s

OK
INFO     Start to render Html report ...
INFO     Generated Html report: D:\soft\HELL\DEMO\reports\1572062969.html

D:\soft\HELL\DEMO>
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 接口sign签名
  • httprunner脚本
  • setup_hook函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档