jwt使用实战

  1. what is jwt?
    json web token,主要是用来做认证的,因为他是基于数字签名的 ,所以安全性贼高,是一种协议,本身是json格式,支持跨语言,同时它由三部分组成header(用于说明加密算法和说明是jwt),playload(传输用户需要携带的脱敏业务信息),signature(用来对前两部分进行签名认证的,防止篡改),由于jwt使用使用base64进行对称加密,所以不要传输任何敏感信息,因为这个相当于明文,但是客户端在不知道签名使用的加密盐情况下又是无法修改其信息,所以做到了,相对安全认证,而且不需要使用客户端cookie,所以可以防止csrf
  2. java中怎么开发
    jwt使用实战_第1张图片
    当我们知道了他的原理后,其实它的开发就很简单了,只要组装好它规定的字段就可以了,我们一般使用jjwt这个jar包,用户可以去maven仓库下载。
    操作主要使用JwtBuilder接口,使用Jwts.builder来生成一个DefaultJwtBuilder实例,而它又实现了JwtBuilder接口,所以有下面的方法。
    jwt使用实战_第2张图片
    当前台将这个token发送给后台时,我们需要使用下面的方法解析
    jwt使用实战_第3张图片
    下面提供一个java工具类其中 DateHandle.timeDifference就是一个时间差工具,自己计算下就行
public class TokenHandle {

    private static final String SALT = "xxxxx";

    /**
     * 登录生成token
     * @param claims
     * @return
     */
    public static String generateToken(Claims claims){
        return generateToken(claims, -1);
    }
    /**
     * 登录生成token
     * @param claims
     * @param exp 有效期
     * @return
     */
    public static String generateToken(Claims claims, Integer exp){
        JwtBuilder jwtBuilder = Jwts.builder();
        claims.setId(UUID.randomUUID().toString());
        claims.setIssuedAt(new Date());
        claims.setSubject("用户信息");
        jwtBuilder.setClaims(claims);
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        jwtBuilder.signWith(signatureAlgorithm,SALT);
        if(exp != null && exp > 0){
            jwtBuilder.setExpiration(new Date(System.currentTimeMillis()+exp));
        }
        return jwtBuilder.compact();
    }

    /**
     * 解析获取的token字符串
     * @param token
     * @return
     */
    public static Claims parseToken(String token){
        Claims claims;
        try {
            claims = Jwts.parser().setSigningKey(SALT)
                    .parseClaimsJws(token)
                    .getBody();
        } catch (ExpiredJwtException | UnsupportedJwtException | MalformedJwtException | SignatureException | IllegalArgumentException e) {
            return null;
        }
        return claims;
    }

    /**
     * 判断是否需要刷新token
     * @param claims
     * @return
     */
    public static Boolean needRefreshToken(Claims claims){
        Date expirationDate = claims.getExpiration();
        if(EmptyUtil.isEmpty(expirationDate)){
            return false;
        }
        Long validityPeriod = DateHandle.timeDifference(claims.getExpiration(), claims.getIssuedAt());
        Long differenceTime = DateHandle.timeDifference(new Date(), claims.getExpiration());
        return differenceTime > validityPeriod/2;
    }

    /**
     * 刷新token
     * @param claims
     * @return
     */
    public static String refreshToken(Claims claims){
        JwtBuilder jwtBuilder = Jwts.builder();
        Long validityPeriod = DateHandle.timeDifference(claims.getExpiration(), claims.getIssuedAt());
        claims.setIssuedAt(new Date());
        jwtBuilder.setClaims(claims);
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        jwtBuilder.signWith(signatureAlgorithm,SALT);
        jwtBuilder.setExpiration(new Date(System.currentTimeMillis()+validityPeriod));
        return jwtBuilder.compact();
    }
}

你可能感兴趣的:(java)