我正在尝试使用JMeter为Web服务暗示基本身份验证过程。 但每次它都会抛出错误401:未经授权。 我尝试使用HTTP Header管理器来添加授权标头和值。 仍然不起作用。 我还尝试使用HTTP授权管理器。 但仍然没有运气。 有人可以帮忙吗。
我正在尝试使用JMeter为Web服务暗示基本身份验证过程。 但每次它都会抛出错误401:未经授权。 我尝试使用HTTP Header管理器来添加授权标头和值。 仍然不起作用。 我还尝试使用HTTP授权管理器。 但仍然没有运气。 有人可以帮忙吗。
通过调试来自JMeter的请求,我发现HTTP授权管理器模块未正确编码用户名和密码。它在用户名后面放置了一个换行符。
要针对Basic Auth受保护的端点运行JMeter测试,请包括HTTP头管理器并自己添加Basic Auth标头:
从MacOS或Linux:
echo -n "username:password" | base64
从Windows:
请点击此处并对“username:password”字符串进行编码
在HTTP头管理器中,添加一个名称为“Authorization”的条目和值为“Basic [上述编码凭据]”
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编码字符串传递授权标头到服务器
请执行以下操作:
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,这本由该项目的三个开发者编写的书会对你有所帮助。请确保为基础URL提供协议,例如:"http://localhost"而不是"localhost"
"Authorization"
,值为"Basic [上面编码的凭证]"
(但不包括[]
)的条目。像Ryan T所说的那样。添加一个稍微变化的@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));