基于YAPI的API实时签名方案

2021-09-17 10:31:55 浏览数 (2)

YAPI是团队内在做部门的研发效能提升时,找到的一款比较好的开源组件 https://hellosean1025.github.io/yapi/

他支持“接口管理”以及“单接口测试”、“多接口的集成测试”,还有周期性的“自动化测试”,我们团队引入后,对其做了存储通用性,以及SSO方面的扩展,插件位于Npm,大家可搜索"yapi-plugin-pl"找到相关插件 https://www.npmjs.com/search?q=yapi-plugin-pl

关于平台的使用,可以参考官方文档,本篇文章针对使用Yapi做API测试时,期望对每条请求增加特定算法的签名参数(header或者body中),尤其是实时签名,提供了特别好的解决方案。

1. 基本原理

1.1 流程简述

Yapi是使用NodeJS来开发的,所以只要会基本js的人差不多都能看懂它。当然,下面说的脚本,也都是指用js编辑的,优雅点的话,最好使用es6的写法来写。

      Yapi对所有做测试时发出的请求,以及收到的返回结果,都对外暴露了一种用脚本(可以是一大长串代码块执行某种逻辑,最后把值赋给请求或者响应中的参数)来修改它们的方式:

script的暴露是跟随一个project的。所以,这个项目下的所有请求,无论在单独“发送”或是集合测试时候,每一条请求都会执行这里的脚本。

1.2 准备工作

1.2.1 Yapi中API的请求参数,响应参数如何获取?

https://hellosean1025.github.io/yapi/documents/project.html#配置环境

官方文档中关于这里的说明可以总结为:

1、yapi的api请求信息在公共变量context里(每一个API都会有自己的context, 所以context指的就是当前执行到的那个API)

代码语言:javascript复制
context = {
  pathname: '/api/user',
  query: {
    id: 1
  },
  requestHeader: {
    xxx: 'xxx'
  },
  method: 'POST',
  requestBody: {
    type:1
  },
  responseData: {
    a:1
  },
  responseHeader: {
    content-type: 'application/json'
    ...
  }
}

2、那么在脚本中拿到他的方式就是:

代码语言:javascript复制
API请求Path  ---context.pathname
 
API请求Query ---context.query.xxx
API请求Header---context.requestHeader.xxx
API请求Method---context.method
API请求Body  ---context.requestBody.xxx
 
API响应Header---context.responseHeader.xxx
API响应Body  ---context.responseData.xxx

1.2.2. Yapi中工具组件能够提供什么支持?

https://hellosean1025.github.io/yapi/documents/project.html#配置环境

1、还是官方文档的说明,里面的“工具函数"提供了简单的说明

对比此次举例的腾讯云V3签名的NodeJS版本,发现也是crypto来完成的,

https://cloud.tencent.com/document/api/400/41661#NodeJS

而Yapi暴露的方式里是使用CryptoJS来做的,所以基本上只要掌握了CryptoJS如何使用即可达到目的

2、CryproJS在Yapi里如何引用

Yapi的文档里给了一个这样的用法说明,但很显然对于腾讯云签名这件事来说,肯定不足够。

代码语言:javascript复制
var ciphertext = context.utils.CryptoJS.****

于是更多的用法在这里  https://github.com/brix/crypto-js/

还有这里https://cryptojs.gitbook.io/docs/

2. 腾讯云签名实践

本过程只为表明方法可行性(核心签名算法是否能走通),不包含完整的签名流程,完整流程可参考此处自行补充(其他流程大都是字符串拼接,参数排序,可直接查询js语法编写)。

2.1 签名串生成工具

  • 生成签名串

https://console.cloud.tencent.com/api/explorer?Product=cvm&Version=2017-03-12&Action=DescribeImportImageOs&SignVersion=

目标是验证可行性,那么对“签名串生成工具”打印出的过程参数,我们采取写死的方式,作为Yapi脚本签名算法的输入,期望是Yapi得出的签名串和“签名串生成工具”签名值一样。

2.2. Yapi脚本编写


  • 脚本中编写入口参数

Yapi→Group→Project→设置→请求配置

将一些值写死到脚本里,其中参数的命名和官方nodejs算法中保持一致致 https://cloud.tencent.com/document/api/400/41661#NodeJS

  • 对照官方nodejs算法,修改yapi中的算法方法

下面的代码是方便大家copy用的

代码语言:javascript复制
function sha256(message, secret = '',encoding) {
    const hmac = context.utils.CryptoJS.HmacSHA256(message,secret);
    if (encoding === 'hex'){
        return hmac.toString(context.utils.CryptoJS.enc.Hex);
    }
    return hmac;
}
 
 
function getHashHex(message) {
    const hash = context.utils.CryptoJS.SHA256(message);
    return hash.toString(context.utils.CryptoJS.enc.Hex);
}
  • 将值写入Header来验证

2.3. Yapi发送请求验证

恭喜,你已经掌握了Script的精髓,可以接着自行完善啦!

0 人点赞