zl程序教程

您现在的位置是:首页 >  前端

当前栏目

Jwt认证方式多种

认证 方式 JWT 多种
2023-06-13 09:16:41 时间

什么是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());
    }