什么是JWT
JWT全称是JSON Web Token,
官网地址直达;
JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输
JWT认证的一般流程
在实际的SpringBoot项目中,一般流程大概是:
前端请求后端,获取后端生成的随机token作为JWT的payload生成JWT字符串返回给前端前端之后每次请求都在请求头中的Authorization字段中携带JWT字符串
后端定义一个拦截器,每次收到前端请求时,取出JWT字符串并进行验证,验证通过后解析出payload中用户信息;
这里说一下 jwt认证中拦截器一般应该支持三种方式:
- 将jwt放到url参数上:
前端请求时,将jwt参数放到url上,后台过滤器从url参数上获取指定key的值,然后验证是否合法;
此方法对调用方最是友好;
下面是调用的伪代码:
Map<String,Object> map = new HashMap<>();
map.put("_jwt",token);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
// headers.set(HttpHeaders.AUTHORIZATION,"Bearer " +token);
// headers.set(HttpHeaders.COOKIE,"_jwt=" +token);
Map<String, Object> result = template.getWithUrlParam(
sphere_url +"/getinfo?_jwt={_jwt}"
,map,headers);
System.out.println(result);
- 将jwt字符串放置到cookie中:
在验证凭据放置到cookie中,然后调用时,拦截器获取cookie中的信息并验证;
此方法类似于session验证,对于老系统改造比较合适
伪代码如下:
public Map<String, Object> getWithUrlParam(String url, Map<String, Object> json,HttpHeaders headers) {
HttpEntity<?> requestEntity = new HttpEntity<>(headers);
ResponseEntity<String> exchange = this.restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class,json);
return MapUtil.readValueAsMap(exchange.getBody());
}
- 将jwt字符串放到header的Authorization中
后台拦截器从header中获取信息;
此方法最常见,主要用于前后端分离项目,已经app调用等
调用的伪代码如下:
public Map<String, Object> postWithBodyAndUrlParam(String url, Map<String, Object> json,Map<String, Object> urlParam,,HttpHeaders headers) {
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(json, headers);
ResponseEntity<String> exchange = this.restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class,urlParam);
return MapUtil.readValueAsMap(exchange.getBody());
}