JJWT

329 阅读2分钟

在使用JJWT的时候会产生这个错误,它代表HS256的秘钥长度不够

io.jsonwebtoken.security.WeakKeyException: The signing key's size is 192 bits which is not 

secure enough for the HS256 algorithm. 

JJWT只有三部分,头部,载荷,签名。

header只有两个,一个是算法alg,另一个是类型typ

载荷有JWT官方提供的7个,也有自定义claims的

签名(注意长度就行)

账号密码登录流程

配置Token

@Component
public class MessageService {

    static String secretkey="pL2xD5dF8zP4jU5vB4nR6pZ8rH0zS1iC9pE7uZ6yV6lD3xM9dU0yG1sT8eQ8jS9uO";


    public static String tokenSecretKey(){
        return secretkey;
    }

    public static String buildToken(String username, String password) {
        HashMap<String, Object> header = new HashMap<String, Object>();
        header.put("alg", "HS256");
        header.put("typ", "jwt");

        HashMap claims = new HashMap();
        claims.put("username", username);
        claims.put("password", password);

        String token = Jwts.builder()
                /**
                 * @deprecated 头部信息
                 */
                .setHeaderParams(header)
                /**
                 * @deprecated 载荷
                 */
                .setSubject("Authorization Token") // 主题
                .setAudience(username) //用户
                .setIssuer(username) //发行人
                .setIssuedAt(new Date()) // 签发时间
                .setNotBefore(new Date()) // 生效时间
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 7)) //失效时间
                .setClaims(claims) //自定义
                .setId(UUID.randomUUID().toString()) //jwt唯一ID
                /**
                 * @deprecated  签名
                 */
                .signWith(SignatureAlgorithm.HS256, tokenSecretKey())
                .compact();


        return token;
    }

    public static String parseToken(String secretkey, String token) {
        Jws<Claims> claims = Jwts.parser().setSigningKey(secretkey).build().parseClaimsJws(token); //解析Token
        System.out.println(claims.getBody()); // 只能返回自定义的载荷
        System.out.println(claims.getHeader()); //返回JWT头部信息
        System.out.println(claims.getSignature()); // 返回签名
        return "success";
    }


}

Web配置

@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private Interceptor checkUserInfo;

    /**
     * @deprecated 配置跨域
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")  // 所有接口
                .allowedOriginPatterns("*")  // 允许所有域名
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")  // 允许所有常用请求方法
                .allowedHeaders("*")  // 允许所有请求头
                .exposedHeaders("*")  // 暴露所有响应头
                .allowCredentials(true)  // 允许发送cookie
                .maxAge(3600L); // 预检请求有效期一小时
    }

    /**
     * @deprecated 配置拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(checkUserInfo) //添加拦截器
                .addPathPatterns("/**") // 添加路径
                .excludePathPatterns("/login/account"); //排除拦截器
    }
}

拦截器配置

@Component
public class Interceptor implements HandlerInterceptor {


    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * @deprecated  接口执行前执行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        try {
            String AuthorizationHeader = request.getHeader("Authorization");
            String token=stringRedisTemplate.opsForValue().get("token");
            MessageService.parseToken(AuthorizationHeader,token);
            return true;
        }catch (Exception e){
            throw new RuntimeException("身份验证信息过期");
        }
    }

    /**
     * @deprecated 接口执行后执行
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    /**
     * @deprecated 请求结束后执行
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}