JMeter测试Okta集成应用如何捕获发送RelayState、SAMLResponse值
Bad Request报错的核心原因是SAML流程里的RelayState、SAMLResponse都是单次会话有效的临时参数,录制时抓到的固定值在脚本回放时早已过期,必须动态从Okta返回的前置响应中提取,再传给后续的断言提交接口,硬编码固定值必然校验失败。
先定位参数来源请求:在录制的脚本中逐次查看响应内容,找到Okta认证完成后返回的带自动提交表单的HTML响应——这个响应里会有两个hidden类型的input标签,分别存储RelayState和SAMLResponse的值,确保这个请求在你报错的那个提交SAML断言的请求之前执行。
给上述参数来源请求挂载2个正则表达式提取器,分别抓取两个参数:
提取RelayState的配置:引用名称:RelayState正则表达式:<input type="hidden" name="RelayState" value="(.*?)"模板:$1$匹配数字:1提取SAMLResponse的配置:
引用名称:SAMLResponse正则表达式:<input type="hidden" name="SAMLResponse" value="(.*?)"模板:$1$匹配数字:1
注意:不要对提取到的值提前做URL编码/解码操作,JMeter发送表单类请求时会自动处理编码,手动转码会直接导致参数格式非法。修改报错的SAML提交请求:把请求里原来写死的RelayState、SAMLResponse参数值,替换为
${RelayState}和${SAMLResponse}。如果请求格式是application/x-www-form-urlencoded,直接在参数 tab 填写键值对即可,不要手动把参数拼接到raw请求体里,避免格式错误。验证提取结果:给线程组添加调试取样器,单次运行脚本后在查看结果树中打开调试取样器的响应数据,确认RelayState、SAMLResponse两个变量有非空取值,同时确认后续SAML提交请求携带的参数值和前置响应返回的值完全一致。
- 提交SAML请求时不要勾选参数栏的「编码」选项,SAMLResponse本身是Base64编码值,额外做URL编码会导致Okta端解析失败。
- 如果正则提取不到值,先在参数来源请求的高级设置里把响应编码手动设为
UTF-8,避免因编码问题匹配不到标签。 - 正则提取器必须挂载在返回SAML表单的那个具体请求下,不要直接挂在线程组全局,避免从其他请求的响应里错误取值。
内容的提问来源于stack exchange,提问作者user2583646

