伍佰亿书画网网站,西安建筑信息平台,网站建设十一要点,seo课程培训视频JWT
JSON Web Token#xff08;JSON Web令牌#xff09;
是一个开放标准(rfc7519)#xff0c;它定义了一种紧凑的、自包含的方式#xff0c;用于在各方之间以JSON对象安全地传输信息。此信息可以验证和信任#xff0c;因为它是数字签名的。jwt可以使用秘密〈使用HNAC算法…JWT
JSON Web TokenJSON Web令牌
是一个开放标准(rfc7519)它定义了一种紧凑的、自包含的方式用于在各方之间以JSON对象安全地传输信息。此信息可以验证和信任因为它是数字签名的。jwt可以使用秘密〈使用HNAC算法或使用RSA或ECDSA的公钥/私钥对进行签名。
通过JSON形式作为Web应用中的令牌用于在各方之间安全地将信息作为JSON对象传输。在数据传输过程中还可以完成数据加密、签名等相关处理。
JWT登录流程 使用了JWT技术
流程
1.前端通过表单的方式将用户的登录信息发送到后端
2.后端对登录的信息进行检验合法的话生成JWT并与结果一起返回给前端
3.前端接收到返回结果进行响应并将JWT保存前端可以将返回的结果保存在localStorage浏览器本地缓存或sessionStoragesession缓存上退出登录时前端删除保存的JWT即可
4.后续前端每次请求携带JWT进行后端检查JWT 的合法性存在验证JWT的有效性。例如检查签名是否正确﹔检查Token是否过期;检查Token的接收方是否是自己
5.验证通过后后端使用JWT中包含的用户信息进行其他逻辑操作返回相应结果。
使用练习
1.引入依赖
!--引入JWT--
dependencygroupIdcom.auth0/groupIdartifactIdjava-jwt/artifactIdversion3.10.0/version
/dependency
2.登录成功后生成jwt令牌 MapString, Object claims new HashMap();claims.put(JwtClaimsConstant.EMP_ID, employee.getId());String token JwtUtil.createJWT(jwtProperties.getAdminSecretKey(),jwtProperties.getAdminTtl(),claims);3.在拦截器中配置token解析
//1、从请求头中获取令牌String token request.getHeader(jwtProperties.getAdminTokenName());//2、校验令牌try {log.info(jwt校验:{}, token);Claims claims JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token);Long empId Long.valueOf(claims.get(JwtClaimsConstant.EMP_ID).toString());log.info(当前员工id{}, empId);BaseContext.setCurrentId(empId);//3、通过放行return true;} catch (Exception ex) {//4、不通过响应401状态码response.setStatus(401);return false;}4.封装JWT使用工具类生成token和解密token /*** 生成jwt* 使用Hs256算法, 私匙使用固定秘钥** param secretKey jwt秘钥* param ttlMillis jwt过期时间(毫秒)* param claims 设置的信息* return*/public static String createJWT(String secretKey, long ttlMillis, MapString, Object claims) {// 指定签名的时候使用的签名算法也就是header那部分SignatureAlgorithm signatureAlgorithm SignatureAlgorithm.HS256;// 生成JWT的时间long expMillis System.currentTimeMillis() ttlMillis;Date exp new Date(expMillis);// 设置jwt的bodyJwtBuilder builder Jwts.builder()// 如果有私有声明一定要先设置这个自己创建的私有的声明这个是给builder的claim赋值一旦写在标准的声明赋值之后就是覆盖了那些标准的声明的.setClaims(claims)// 设置签名使用的签名算法和签名使用的秘钥.signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8))// 设置过期时间.setExpiration(exp);return builder.compact();}/*** Token解密** param secretKey jwt秘钥 此秘钥一定要保留好在服务端, 不能暴露出去, 否则sign就可以被伪造, 如果对接多个客户端建议改造成多个* param token 加密后的token* return*/public static Claims parseJWT(String secretKey, String token) {// 得到DefaultJwtParserClaims claims Jwts.parser()// 设置签名的秘钥.setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8))// 设置需要解析的jwt.parseClaimsJws(token).getBody();return claims;}