前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于YAPI的API实时签名方案

基于YAPI的API实时签名方案

原创
作者头像
qugeppl
修改2021-09-17 10:31:55
2K1
修改2021-09-17 10:31:55
举报
文章被收录于专栏:PulseLine

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#%E9%85%8D%E7%BD%AE%E7%8E%AF%E5%A2%83

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

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#%E9%85%8D%E7%BD%AE%E7%8E%AF%E5%A2%83

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的精髓,可以接着自行完善啦!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 基本原理
    • 1.1 流程简述
      • 1.2 准备工作
        • 1.2.1 Yapi中API的请求参数,响应参数如何获取?
        • 1.2.2. Yapi中工具组件能够提供什么支持?
    • 2. 腾讯云签名实践
      • 2.1 签名串生成工具
        • 2.2. Yapi脚本编写
          • 2.3. Yapi发送请求验证
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档