JMETER中提取accessToken至请求头后认证失败,求排查方案
我先还原下问题场景:
通过接口拿到了完整的认证凭证JSON:
{"data":{"userId":"USR-0000000000000001","accessToken":"TKN-05TS53MFRVK2QYH2HMLD3J25WMH8IH6E767W","refreshToken":"RTK-88TLRIYE4YVJMWH2H4G0UQK83DVCWODFLX4X","expiresIn":"2018-03-16 20:14:00","tokenType":"bearer"}}
用正则表达式提取器拿到accessToken的值后,把它放到Authorization请求头里调用个人信息接口,结果收到了认证失败的错误响应:
{"error":{"errorCode":1001,"errorMessage":"Authentication failed"}}
有没有大佬能帮忙排查下问题,让后续请求能正常使用这个accessToken?
可能的排查方向(结合实战经验整理):
先确认Authorization请求头的格式是否合规
注意返回的tokenType是bearer,标准的Bearer认证头格式是Bearer <你的accessToken>—— 这里Bearer首字母要大写,而且和token之间必须有一个空格。很多人会直接把token值丢进去,漏掉前缀或者空格,这是最常见的认证失败原因。你可以检查下请求头是不是这种格式:Authorization: Bearer TKN-05TS53MFRVK2QYH2HMLD3J25WMH8IH6E767W验证正则提取的token是否完全正确
你可以去查下正则表达式提取器拿到的token值,是不是和原始响应里的TKN-05TS53MFRVK2QYH2HMLD3J25WMH8IH6E767W完全一致?有没有多带引号、空格,或者少了末尾的字符?比如如果正则写的是"accessToken":"(.*?)",要确保提取的内容不包含前后的双引号。可以用JMeter的Debug Sampler查看对应的变量值,确认提取结果。检查token是否已经过期
原始响应里的expiresIn是2018-03-16 20:14:00,如果当前时间已经晚于这个时间点,那这个token已经失效了,自然会认证失败。你可以确认下当前时间是否在有效期内,或者重新调用接口获取新的accessToken再尝试。确认请求头是否真的被传递到了目标接口
有时候可能因为配置问题,Authorization头并没有被正确添加到后续请求里。你可以在JMeter的“查看结果树”里打开请求详情,检查请求头列表里是否存在Authorization,并且它的值是正确的格式和内容。查看接口是否有额外的认证要求
部分接口除了Authorization头,可能还需要搭配其他参数(比如userId)一起传递,你可以去核对下接口文档,看看有没有遗漏的必填认证参数。
内容的提问来源于stack exchange,提问作者Satria

