通过fiddler抓包分析keyclock登录过程
1.浏览器访问业务应用,因为没有登录,返回302重定向到keyclock的登录页面,在浏览器输入账号密码进行登录
2.登录成功后,查看fiddler的抓包结果,从业务域名的请求开始看,第一条 访问业务域名请求服务,因为未登录被重定向到sso.dtos.city
3 .fiddler查看下一条请求,这条请求的url是上一条请求response Header中的location
4.再查看下一条请求,这条请求是POST请求,请求中携带了query参数,和body请求,body请求中传入了用户名、密码请求登录
看到查询参数的session_code\excetion\tab_id是随机生成的标识,在前面的请求返回搜索,明确这几个字段是从上一个请求的response body中返回
这个请求的结果还是302,查看response Header的location字段,location字段就是下一步要跳转的url
可以看到携带了session信息跳转到业务域名,证明登录成功
5.fiddler查看下一个请求,是请求业务域名的接口,接口url是上一个请求返回的location
该接口仍是302,继续返回location
6.继续请求访问的业务域名+locationurl
仍返回302,继续访问locationurl
最后访问到业务url,返回200,response body是业务信息,至此,已完全分析完keyclock的登录过程
现在在jmeter调用接口实现登录
1.线程组配置cookie管理器、http信息头默认值
2.第一个接口访问业务域名+/请求,从response Header中提取location字段,该字段是下一个请求的地址
3.GET 调用sso域名+上一步提取的locationurl,且从response body提取session_code、execution、tab_id4.预处理部分是对提取的变量字符串进行处理,删除&字符
String code;
session_code = bsh.args[0];
code = session_code.substring(0,session_code.indexOf("&"));
execution = bsh.args[1];
res_execution= execution.substring(0,execution.indexOf("&"));
tab_id = bsh.args[2];
vars.put("session_code",code);
vars.put("execution",res_execution);
vars.put("tab_id",tab_id.substring(0,tab_id.indexOf("\"")));
5.post 调用sso域名+对应接口,url包含query参数和body参数,传入session_code、execution、tab_id和用户信息
在结果提取locationurl
6.后面几步依次调用返回的locationurl,直到最后访问成功业务域名的数据