专栏首页从零开始学自动化测试httprunner学习24-sign签名验证

httprunner学习24-sign签名验证

前言

一般公司对外的接口都会用到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>

本文分享自微信公众号 - 从零开始学自动化测试(yoyoketang),作者:上海悠悠

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python笔记44-HTTP对外接口sign签名

    一般公司对外的接口都会用到sign签名,对不同的客户提供不同的apikey ,这样可以提高接口请求的安全性,避免被人抓包后乱请求。 sign签名是一种很常见的方...

    上海-悠悠
  • Selenium2+python自动化33-文件上传(send_keys)

    前言 文件上传是web页面上很常见的一个功能,自动化成功中操作起来却不是那么简单。 一般分两个场景:一种是input标签,这种可以用selenium提供的sen...

    上海-悠悠
  • Selenium2+python自动化28-table定位

    前言 在web页面中经常会遇到table表格,特别是后台操作页面比较常见。本篇详细讲解table表格如何定位。 一、认识table 1.首先看下...

    上海-悠悠
  • 学界 | 批训练、注意力模型及其声纹分割应用,谷歌三篇论文揭示其声纹识别技术原理

    机器之心
  • PHP教程之实战用户模块开发

    setcookie(name,value,expire,path,domain,secure)

    老雷PHP全栈开发
  • 快速了解Python开发环境Spyder

    Spyder (前身是 Pydee) 是一个强大的交互式 Python 语言开发环境,提供高级的代码编辑、交互测试、调试等特性,支持包括 Windows、Lin...

    砸漏
  • 改进的预算连接控制和预算边缘 - 顶点控制

    作者:Ioannis Lamprou,Ioannis Sigalas,Vassilis Zissimopoulos

    罗大琦
  • 倍福PLC安全评估实战

    CX9020是倍福公司生产的PLC,运行Microsoft Windows Embedded Compact 7操作系统,广泛运用在运动控制领域。

    绿盟科技研究通讯
  • GlusterFS之内存池(mem-pool)使用实例分析

    技巅
  • Tomcat利用MSM实现Session共享方案解说

    Session共享有多种解决方法,常用的有四种: 1)客户端Cookie保存 2)服务器间Session同步 3)使用集群管理Session(如MSM) 4)...

    洗尽了浮华

扫码关注云+社区

领取腾讯云代金券