JMeter基本认证

55

我正在尝试使用JMeter为Web服务暗示基本身份验证过程。 但每次它都会抛出错误401:未经授权。 我尝试使用HTTP Header管理器来添加授权标头和值。 仍然不起作用。 我还尝试使用HTTP授权管理器。 但仍然没有运气。 有人可以帮忙吗。


从JMeter 4.0开始,您可以使用Http Authorization Manager或JSR223 PreProcessor,如此处所述:https://octoperf.com/blog/2018/04/24/jmeter-basic-authentication/ - Jerome L
11个回答

63

通过调试来自JMeter的请求,我发现HTTP授权管理器模块未正确编码用户名和密码。它在用户名后面放置了一个换行符。

要针对Basic Auth受保护的端点运行JMeter测试,请包括HTTP头管理器并自己添加Basic Auth标头:

手动编码凭据

  • 从MacOS或Linux:

    echo -n "username:password" | base64

  • 从Windows:

    点击此处并对“username:password”字符串进行编码

添加授权标头

在HTTP头管理器中,添加一个名称为“Authorization”的条目和值为“Basic [上述编码凭据]”


天啊,感谢你的回答。虽然它对我有用,但我的唯一抱怨是你需要为像我这样的人降低难度。起初我不理解你告诉我们要做什么,但幸运的是,通过试错和重新阅读你的答案,我终于找到了正确的命令。 - Classified
1
我使用Postman进行初始测试。我只是复制了他们的授权标头和编码值,并将其放入HTTP标头管理器中。虽然有一个网站可以为您进行编码,但知道这一点还是很不错的! - Amber
1
我也可以,@Depy,请将此答案标记为解决方案。 - zypro

49

2017年8月19日对JMeter 3.2进行编辑:

基本上,要绕过基本授权,您需要添加带有值Basic base64(username:password)Authorization标头。问题在于JMeter没有嵌入base64函数。

解决方法如下:

步骤1添加BeanShell预处理器(预处理器--> BeanShell预处理器)

输入图像描述

步骤2将以下脚本添加到预处理器中

import org.apache.commons.codec.binary.Base64;
byte[] encodedUsernamePassword = Base64.encodeBase64("neo4j:1234".getBytes());
vars.put("base64HeaderValue",new String(encodedUsernamePassword));

在此输入图像描述

Step3 添加HTTP头管理器

在此输入图像描述

Step4 添加正确值的授权标头

标头名称 Authorization
标头值 Basic ${base64HeaderValue}(base64HeaderValue变量由BeanShell预处理器初始化)

在此输入图像描述

因此,最终创建http请求时,将通过base64编码字符串传递授权标头到服务器

在此输入图像描述


它对我有用,是一个带有许多图片的好答案 :-). 谢谢! - Bruno Bieri
1
感谢您花费精力发布这个详细的答案。 - Squishi
自JMeter 3.2以后就不再需要了,请参见https://dev59.com/jmcs5IYBdhLWcg3w0HIa#12563623。 - UBIK LOAD PACK

11

请执行以下操作:

  • 1/ 使用所有必需的字段正确配置HTTP授权管理器

  • 2/ 选项1:使用HTTP 4:(默认)

  • 自JMeter 3.2以来,可以在不使用授权管理器的情况下进行进一步配置。

选项2:使用HTTP 3.1:(不推荐使用)

  • 在jmeter.properties中取消注释:

  • httpclient.parameters.file=httpclient.parameters
    
  • 在httpclient.parameters中取消注释:

    http.authentication.preemptive$Boolean=true
    
    如果你正在学习JMeter,这本由该项目的三个开发者编写的会对你有所帮助。

3

请确保为基础URL提供协议,例如:"http://localhost"而不是"localhost"


这就是为什么它对我不起作用的原因。我从我的HTTP请求中复制了基本URL,那里也可以在不提供协议的情况下工作。 - Dirk

1

我正在使用 Jmeter 3.3

在用户选项中选择添加,然后选择 HTTP 授权管理器。

enter image description here

然后添加您的URL、用户ID和密码。保留HTML代码,不要解释。

enter image description here

如果响应类型是json,则添加HTTP头管理器。

enter image description here


1
在HTTP头管理器中,添加一个名称为"Authorization",值为"Basic [上面编码的凭证]"(但不包括[])的条目。像Ryan T所说的那样。

1
您可以轻松地在auth请求中使用JSON Extractor进行身份验证,将令牌存储在变量中,然后只需在需要使用令牌时使用它,为了使用它,您需要使用HTTP header manager,使用该变量,您可以按照屏幕截图进行清晰的说明。
JSON Extractor配置如下: JSON Extractor HTTP header manager配置如下: HTTP header manager

1
如果您收到401响应代码,则添加“HTTP授权管理器”配置元素 在此输入图像描述

0

添加一个稍微变化的@yurko,它使用用户定义变量中的用户名和密码。(适用于Jmeter 3.2之前的版本)

import org.apache.commons.codec.binary.Base64;
String username = vars.get("USERNAME");
String password = vars.get("PASSWORD");
String combineduserpass = username + ":" + password;
byte[] encodedUsernamePassword = Base64.encodeBase64(combineduserpass.getBytes());
vars.put("base64HeaderValue",new String(encodedUsernamePassword));

1
自 JMeter 3.2 起已不再需要,详情请参见 https://dev59.com/jmcs5IYBdhLWcg3w0HIa#12563623。 - UBIK LOAD PACK
谢谢!我好几个月没更新我的了。我很高兴他们让这变得更容易了。 - Marcel Wilson

0
关于上面的第一个答案,你提到的不正确的编码问题现在应该已经得到修复了。因为 Apache 3.1 在 HTTP Auth Manager 中似乎已经正确地对用户名和密码进行了编码。

是的,我正在使用_JMeter 3.2_,并且我只在“HTTP基本身份验证”中添加了清晰的用户名和密码,它会自动转换为HTTP头中的标准_'Authorization Basic [base64编码的用户名:密码]'_。 - Marius Vorster
自JMeter 3.2版本起就不再需要,参见https://dev59.com/jmcs5IYBdhLWcg3w0HIa#12563623。 - UBIK LOAD PACK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接