JWT认识与使用

143 阅读1分钟

认识

JWT: JSON Web Token,通过数字签名的方式,以JSON对象为载体,在不同服务终端之间安全地传输信息。

用处: 授权认证,用户登录后,后续请求都携带JWT,后端处理请求前,要先校验JWT,然后再处理。

组成: 用.拼接三部分,分别是

  • Header (头部,记录了整个令牌的类型和签名算法,将信息用base64编码,构成第一部分)
 {
  'typ': 'JWT',//token的类型
  'alg': 'HS256'//第三部分签名加密算法的名称
  //HS256:一种对称加密算法,使用同一个秘钥对signature加密解密
  //RS256:一种非对称加密算法,使用私钥加密,公钥解密
 }
  • Payload (载荷,记录了保存的主体信息,比如你要保存的用户信息就可以放到这里,分为标准注册声明、公共声明、私有声明,用base64编码,构成第二部分)
 {
  'sub': '1234567890',
  'name': 'john',
  'admin': true
 }
  • Signature (签名,按照头部固定的签名算法对整个令牌进行签名,该签名的作用是:保证令牌不被伪造和篡改)
 String encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
 String signature = HMACSHA256(encodedString, 'secret');
 //将生成的结果encodedString用header中声明的算法进行加盐加密,构成第三部分

使用

pom中引入jwt依赖

 private long time = 1000*60*60*24;//设定过期时间
 private String signature = "secret";//用于解密
 
 public void jwt(){
     JwtBuilder jwtBuilder = Jwts.builder();
     String jwtToken = jwtBuilder
             //header
             .setHeaderParam("typ","JWT")
             .setHeaderParam("alg","HS256")
             //payload
             .claim("username","tom")
             .claim("role","admin")
             .setSubject("admin-test")
             .setExpiration(new Date(System.currentTimeMillis() + time))
             .setId(UUID.randomUUID().toString())
             //signature
             .signWith(SignatureAlgorithm.HS256, signature)
             .compact();
 }
 
 public void parse(){
     String token = "abc";
     JwtParser jwtParser = Jwts.parser();
     Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
     Claims claims = claimsJws.getBody();
     claims.get("username");
     claims.get("role");
     claims.getId();
     claims.getSubject();
     claims.getExpiration();
 }