jmeter常规鉴权

jmeter常规鉴权

  • jemter测试外部接口
    • 常规鉴权流程
    • 直接上代码
    • 请求参数中添加获取的数据
    • 后续改进

jemter测试外部接口

外部接口一般都会有鉴权逻辑,在jmeter中用beanshell脚本生成,需要的数据

常规鉴权流程

例如:公用参数companyId,timestamp,randomStr,sign
每个接口都需要使用公用参数
另外有一个加密key
流程:

  1. 把除了sign以外所有参数,按字典序排序后,拼接成字符串str,示例:key1=val1&key2=val2
  2. 把步骤1得到的字符串str做base64编码得到字符串base64String(编码时定字符集为utf-8)
  3. 使用 作为加密key对base64String做HMAC-SHA1哈希,得到字节数组hmacSha1byte
  4. 把步骤3得到的字节数组hmacSha1byte做md5得到32位字符串,并转换为大写,即为签名sign

companyId和加密key是后台提供,固定的,所以添加到用户自定义变量中
jmeter常规鉴权_第1张图片

直接上代码

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.net.util.Base64;
import java.util.ArrayList;
import java.util.List; 
import java.util.Collections;

String timestamp = "${__time()}"; //生成时间戳
String randomStr="${__RandomString(5,abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,)}";//随机生成字符串

//把参数放到集合里,并对集合进行排序
List list= new ArrayList();
list.add("companyId=${companyId}");
list.add("timestamp="+timestamp);
list.add("randomStr="+randomStr);
Collections.sort(list);   //list按字典排序
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++"+list);

//将集合里的数据转化为字符串,中间用&拼接
String str =new String();
for (String s: list) {
            str=str+s+"&";
            }        
str = str.substring(0, str.length() - 1);//去掉字符串最后一个字符&
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++"+str);

//将字符串base64编码
byte[] encodedBytes = Base64.encodeBase64(str.getBytes("UTF-8"));
String encoded = new String(encodedBytes);
//System.out.println("+++++++++++++++++++++++++++++++++++++++++++++"+encoded);

//将编码后的字符串,进行做HMAC-SHA1哈希,注意这里的哈希得到的结果是byte类型的,如果需要得到字符串,把hmacSha1替换为hmacSha1Hex就能够得到字符串结果
byte[] sha1Hex=org.apache.commons.codec.digest.HmacUtils.hmacSha1("${serverCode}",encoded);

//将哈希后的数据进行MD5操作,并转换为大写
String sign = DigestUtils.md5Hex(sha1Hex);//执行MD5加密操作
String sig=sign.toUpperCase();//将字符串转换为大写
//System.out.println("+++++++++++++++++++++++++++++++++++++++++++++"+sig);

//把生成的数据设置为jmeter的变量,在取样器中可以直接使用
vars.put("timestamp",timestamp);  
vars.put("randomStr",randomStr);
vars.put("sign",sign);

请求参数中添加获取的数据

代码放在beashell预置处理器中
jmeter常规鉴权_第2张图片

后续改进

目前只是写在beanshell中的,后续可以封装,打成jar包,进行公用

你可能感兴趣的:(接口测试)