LoadRunner报错401(Unauthorized)

发表于:2020-11-09 09:50

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Ying501    来源:博客园

  LoadRunner报错401(Unauthorized):
  用Charles抓包对比手动操作系统和运行LoadRunner脚本后的两次请求,发现LoadRunner 的请求头部信息中缺少Authorization信息:
  手动操作系统的 请求:
  运行LoadRunner脚本后,缺少Authorization信息:
   
  下面介绍两种方法
  方法一:(可能只对LR11.03有效)
  1、参考(https://blog.csdn.net/smooth00/article/details/65629918),发现可能是由HTTP BasicAuthenticator认证机制决定的,在脚本的web_set_user("cloudem", "cloudem","172.XX.XX.XX:8080");后面加了一句web_set_sockets_option("INITIAL_BASIC_AUTH","1"); 然后回放脚本,仍然报401错误(也许只对LR11.03有效)
  IC认证的过程
  1) 客户端向服务器请求数据,请求的内容可能是一个网页或者是一个其它的MIME类型,此时,假设客户端尚未被验证,则客户端提供如下请求至服务器:
  Get /index.html HTTP/1.0
  Host:www.google.com
  2) 服务器向客户端发送验证请求代码401,服务器返回的数据大抵如下:
  HTTP/1.0 401 Unauthorised
  Server: SokEvo/1.0
  WWW-Authenticate: Basic realm="google.com"
  Content-Type: text/html
  Content-Length: xxx
  3) 当符合http1.0或1.1规范的客户端(如IE,FIREFOX)收到401返回值时,将自动弹出一个登录窗口,要求用户输入用户名和密码。
  4) 用户输入用户名和密码后,将用户名及密码以BASE64加密方式加密,并将密文放入前一条请求信息中,则客户端发送的第一条请求信息则变成如下内容:
  Get /index.html HTTP/1.0
  Host:www.google.com
  Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx
  注:xxxx....表示加密后的用户名及密码。
  5) 服务器收到上述请求信息后,将Authorization字段后的用户信息取出、解密,将解密后的用户名及密码与用户数据库进行比较验证,如用户名及密码正确,服务器则根据请求,将所请求资源发送给客户端
  web_set_user("cloudem", "cloudem","172.XX.XX.XX:8080");也可写成:
  web_set_user("cloudemr",lr_decrypt("5f92936211cde794ba0exxxx"),"172.XX.XX.XX:8080");//lr_decrypt("5f92936211cde794ba0exxxx")对密码进行加密
   
  方法二:
  1、参考https://www.jianshu.com/p/ce1c18986397、
    https://www.cnblogs.com/jilu1219/p/6599712.html、
    http://www.cnblogs.com/preftest/archive/2011/06/12/2079178.html、
    http://www.51testing.com/html/41/15103841-3707341.html
  使用Base64Encoder (Base64编码/解码工具)制作所需的HTTP验证基础表头信息,然后使用web_add_header功能添加到对应请求中:
  主要步骤:
  a:在脚本存放位置的根目录中新建txt文件,将下列代码拷贝到txt文件中,然后将txt文件重命名为base64.h
   base64.h:
  static unsigned char base64encode_lut[] ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";// 编译字符表
  char base64decode_lut[] = {// 解释字符表
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0,62, 0, 0, 0,63,52,53,54,55,56,57,58,59,60,61, 0, 0,
      0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,
      15,16,17,18,19,20,21,22,23,24,25, 0, 0, 0, 0, 0, 0,26,27,28,
      29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,
      49,50,51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
  void base64encode(char *src, char *dest, int len){// 执行Base64编码
      int i=0, slen=strlen(src);
      for(i=0;i<slen && i<len;i+=3,src+=3) {
          *(dest++)=base64encode_lut[(*src&0xFC)>>0x2];
          *(dest++)=base64encode_lut[(*src&0x3)<<0x4|(*(src+1)&0xF0)>>0x4];
          *(dest++)=((i+1)<slen)?base64encode_lut[(*(src+1)&0xF)<<0x2|(*(src+2)&0xC0)>>0x6]:'=';
          *(dest++)=((i+2)<slen)?base64encode_lut[*(src+2)&0x3F]:'=';
      }
      *dest='\0';
  }
  void base64decode(char *src, char *dest, int len){// 执行Base64解码
      int i=0, slen=strlen(src);
      for(i=0;i<slen&&i<len;i+=4,src+=4) {
          char c1=base64decode_lut[*src], c2=base64decode_lut[*(src+1)], c3=base64decode_lut[*(src+2)], c4=base64decode_lut[*(src+3)];
          *(dest++)=(c1&0x3F)<<0x2|(c2&0x30)>>0x4;
          *(dest++)=(c3!=64)?((c2&0xF)<<0x4|(c3&0x3C)>>0x2):'\0';
          *(dest++)=(c4!=64)?((c3&0x3)<<0x6|c4&0x3F):'\0';
      }
      *dest='\0';
  }
  int b64_encode_string( char *source, char *lrvar ){// 对字符串进行base64编译
      int dest_size;
      int res;
      char *dest;
      dest_size = 1 + ((strlen(source)+2)/3*4);
      dest = (char *)malloc(dest_size);
      memset(dest,0,dest_size);
      base64encode(source, dest, dest_size);
      lr_save_string( dest, lrvar );
      res = strlen(dest);
      free(dest);
      return res;
  }
  int b64_decode_string( char *source, char *lrvar ){// 解码base64字符串
      int dest_size;
      int res;
      char *dest;
      dest_size = strlen(source);
      dest = (char *)malloc(dest_size);
      memset(dest,0,dest_size);
      base64decode(source, dest, dest_size);
      lr_save_string( dest, lrvar );
      res = strlen(dest);
      free(dest);
      return res;
  }

  b:打开脚本,在loadrunner中左侧 action 模块上,右击,选择“add file to script”,选中base64.h文件,导入
  c:在loadrunner的globlas.h 的include files模块 加入 #include "base64.h",如下:
  // Include Files
  #include "lrun.h"
  #include "web_api.h"
  #include "lrw_custom_body.h"
  #include "base64.h"  //添加内容
  d:在脚本中添加如下信息:
  Action()
  {
    //添加内容1
    int res;  
      lr_rendezvous("login");
      lr_start_transaction("login");
    //录制后自动带入的脚本,如果没有,则需要添加:
    //web_set_user( "{Username}","{Password}", "{Domain}:{port}" );用户名、密码抓包能看出来,下图可以看到,Domain服务器地址,port端口
      web_set_user("cloudemr",lr_decrypt("5f92936211cde794ba0exxxx"),"172.xx.xx.xx:80"); 
    
    //添加内容2
    //b64_encode_string( "{Username}:{Password}","BasicAuth" );用户名、密码抓包能看出来,下图可以看到,将用户名、密码加密后传给BasicAuth
     b64_encode_string( "cloudemr:cloudemr","BasicAuth" );  
    //添加内容3:添加头部信息,放在所需要的请求上面
    //Authorization:Basic XXXXXXXXXXXXXXXXXX=  :XXXXXXXXXXXXXXXXXX=值取{BasicAuth}的值
      web_add_header("Authorization",lr_eval_string("Basic {BasicAuth}"));
   
     web_custom_request("token", 
      "URL=http://172.xx.xx.xx/app-emr-dxtest/oauth/token?verifyCode=undefined&grant_type=password&username=xxxx&password=xxxx&hospitalNo=793&orgId=undefined", 
      "Method=POST", 
      "Resource=0", 
      "RecContentType=application/json", 
      "Referer=http://172.xx.xx.xx/user/login?redirectUrl=/", 
      "Snapshot=t5.inf", "Mode=HTML", 
      "EncType=application/json;charset=UTF-8", 
      "Body={\"username\":\"xxxx\",\"password\":\"xxxx=\",\"hospitalNo\":793,\"remember\":true,\"grant_type\":\"password\"}", 
      
      LAST);
  抓包所示Authentication用户名、密码信息:
  
  e:运行后该请求不再报401错误

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号