模拟登录访问获取token

后台管理系统界面

当进行访问一个网站都会进行登录相关的操作,在想获取该网站token的时候,可以进行登录后拿到该网站的token 可作为的用途我们可以把网站token拿到,做一些接口进行操作。

本文基于VUE+SpringBoot框架进行开发的后台管理系统上进行模拟登录,验证码解码获取 获取token操作。

后台接口的请求处理

当在使用网站时首先进行login页面的查找,因为有些页面会让我们去get请求,从而在本机浏览器环境下生成Cookie信息,生成原因呢?就是他在post请求的时候也会去携带Cookie的数据,如下图所示。

Cookie

有些网站也是很好去模拟登录的,他不需要我们去进行get请求页面生产cookie可以直接进行post数据请求把登录的info信息进行发送过去进行验证登录即可。

直接请求的login接口

在请求网站的时候使用到的代码-> 该环境是在SpringBoot框架下进行操作的。

导入主要使用到的依赖环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/>
</parent>
<!-- Add typical dependencies for a web application -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>

接下来,进行登录页的请求,使用的是restTemplate模板下的exchange方法

1
2
3
4
5
6
7
8
9
ResponseEntity<T> exchange(URI url, HttpMethod method, @Nullable HttpEntity<?> requestEntity,
ParameterizedTypeReference<T> responseType) throws RestClientException;
/**
*
url – the URL 网站的URL
method – the HTTP method (GET, POST, etc) 网站进行请求的方法
requestEntity – the entity (headers and/or body) to write to the request (may be null) 请求头和请求体
responseType – the type of the return value 返回指定类型值
*/

在进行网站模拟请求的时候永远绕不过去的就是验证码环节,因为Java不像python那样有强大的爬虫库可以操作,本次操作是基于第三方API接口进行的操作。

验证码

模拟验证码操作 获取验证码

本次模拟接口是 http://localhost:8501/admin/system/index/generateValidateCode 自己搭建生产的验证码验证服务。

验证码请求数据

在请求该接口的时候获取到 code,message,data三个json数据,我们主要对data的数据codeKey和codeValue进行操作。

该codeValue的数据是base64图片格式数据,我们就得数据拿到发送到我们api处理接口。

1
2
3
4
5
6
7
8
9
10
11
HttpHeaders headers = new HttpHeaders();
headers.add("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 SLBrowser/9.0.3.5211 SLBChan/112");
HttpEntity<MultiValueMap<String,String>> startPage = new HttpEntity<>(headers); // 构建请求头和请求体


URI url = new URI(ValidateCodeUrl); //转换成URI的格式
ResponseEntity<String> response = restTemplate.exchange(url,HttpMethod.GET,startPage,String.class);
ObjectMapper mapper = new ObjectMapper(); //使用FastJson进行处理
JsonNode jsonNode = mapper.readTree(response.getBody());
String codeKey = String.valueOf(jsonNode.get("data").get("codeKey")).replaceAll("\"", "");
String Imgbase = String.valueOf(jsonNode.get("data").get("codeValue")).replaceAll("\"", "");

拿到data中的Imgbase数据,接下来使用API的接口进行操作,可查看官方端口进行查看https://www.jfbym.com/price.html

识别成功

// # 通用数英1-4位 10110

// # 通用数英5-8位 10111 规定接口上传数据必须base64

// # 通用数英9~11位 10112

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public ResponseEntity<String> commonVerify(String imageContent) throws URISyntaxException {
String verify_type;
verify_type = "10110";
HttpHeaders verifyHeader = new HttpHeaders();
verifyHeader.add("Content-Type", "application/json");
JSONObject jsonObject = new JSONObject();
jsonObject.put("image", imageContent);
jsonObject.put("type", verify_type);
jsonObject.put("token", Token);
HttpEntity startEntity = new HttpEntity<>(jsonObject,verifyHeader);

System.out.println("startEntity = " + startEntity);
URI captch = new URI(CustomUrl);
ResponseEntity<String> response = restTemplate.exchange(captch,HttpMethod.POST,startEntity,String.class);
System.out.println(response);
return response;
}

进行模拟登录

在通过commonVerify接口完成验证码的识别后,将获取到的数据进行构建json数据mapper.readTree,在jsonNode中拿去所需要的数据。

返回参数

1
2
3
4
5
6
7
ResponseEntity<String> response1 = commonVerify(Imgbase);
jsonNode = mapper.readTree(response1.getBody());
String captcha = String.valueOf(jsonNode.get("data").get("data")).replaceAll("\"","");

HttpHeaders postHeader = new HttpHeaders();
postHeader.add("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 SLBrowser/9.0.3.5211 SLBChan/112");

在此我们就拿到了codekey和codeValue 再配上我们所添加的username和password 就构建登录请求体数据

在此也需要判断 login请求需要的是json格式还是其余格式。

第一种

根据所需要的格式,去构建HttpEntity的实体类,该操作是请求体和请求头的方式,请求体通过json的形式

1
2
3
4
5
6
7
8
9
10
11
12
postHeader.add("Content-Type", "application/json");
JSONObject jsonObject = new JSONObject();
jsonObject.put("userName", username);
jsonObject.put("password", password);
jsonObject.put("captcha", captcha);
jsonObject.put("codeKey", codeKey);

HttpEntity httpEntity = new HttpEntity<>(jsonObject,postHeader);

url = new URI(loginUrl);
ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class);
System.out.println("exchange = " + exchange);

完成,获取到token数据!!!