目前,许多系统的API都通过accessKey+secretKey生成签名的方式来完成认证。对于这样的接口请求,我们可以先使用脚本生成一个签名后,再将其添加到MeterSphere的自定义变量中。但是大部分系统的签名信息都与当前时间或请求参数有关,如果每次都需要去执行额外的脚本进行生成就显得十分麻烦。
接下来,我们就以MeterSphere自己的API接口为例,介绍一下如何在MeterSphere中通过预执行脚本的功能,自动为接口请求生成认证签名。
MeterSphere API认证机制
如图所示,我们可以在MeterSphere的“个人信息”→“API keys” 页面中创建API认证密钥。在通过API调用MeterSphere接口时,需要在请求头中传入accessKey及signature请求头。其中,accessKey即为创建API Key时生成的Access Key,signature通过如下加密算法得出。
加密算法:AES
加密模式:CBC
填充方式:PKCS5Padding
加密字符串:Access Key | 当前时间戳(生成的签名只在特定的时间范围内有效,默认30分钟)
加密密钥:创建API Key时生成的Secret Key
AES IV:创建API Key时生成的Access Key
操作步骤
在MeterSphere创建接口测试,并在场景配置中添加API认证需要用到的accessKey和secretKey作为自定义变量。
在该场景中添加一个HTTP请求,调用GET/project/listAll获取项目列表接口。在该请求的预执行脚本中,添加以下代码生成签名,并将签名值存入signature变量中。
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
String accessKey = "${accessKey}";
String secretKey = "${secretKey}";
public static String aesEncrypt(String src, String secretKey, String iv) throws Exception {
byte[] raw = secretKey.getBytes("UTF-8");
SecretKeySpec secretKeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv1 = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, iv1);
byte[] encrypted = cipher.doFinal(src.getBytes("UTF-8"));
return Base64.encodeBase64String(encrypted);
}
try {
//调用加密算法生成签名
String signature = aesEncrypt(accessKey + "|" + System.currentTimeMillis(), secretKey, accessKey);
//将签名值存入 signature 变量中
vars.put("signature",signature);
} catch (Exception e) {
e.printStackTrace();
}
在该请求中添加accessKey及signature两个请求头,accessKey的值为在场景中配置的accessKey变量,signature的值为上一步通过预执行脚本计算出来的签名。
在该场景中再次添加一个HTTP请求作为对比,同样调用GET /project/listAll 接口,不添加accessKey及signature请求头。
保存并执行该接口测试,在生成的报告中可以看到,添加了认证请求头的接口调用成功,没有添加认证请求头的接口调用失败。
关于 MeterSphere
MeterSphere是一站式的开源企业级持续测试平台,致力于通过开源技术创新加速高质量的软件交付,推动中国测试行业整体效率的提升。
MeterSphere项目遵循GPL v2.0 开源许可协议,涵盖测试跟踪、接口测试、性能测试、 团队协作等功能,兼容JMeter等开源标准,有效助力开发和测试团队充分利用云弹性进行高度可扩展的自动化测试。