一 前言
此篇文章的内容也是学习不久,终于到周末有时间码一篇文章分享知识追寻者的粉丝们,学完本篇文章,读者将对token类的登陆认证流程有个全面的了解,可以动态搭建自己的登陆认证过程;对小项目而已是个轻量级的认证机制,符合开发需求;
二 jwt实现登陆认证流程
- 用户使用账号和面发出post请求
- 服务器接受到请求后使用私钥创建一个jwt,这边会生成token
- 服务器返回这个jwt给浏览器
- 浏览器需要将带有token的jwt放入请求头
- 每次手到客户端请求,服务器验证该jwt的token
- 验证成功返回响应的资源给浏览器。否则异常处理
三 相关介绍jwt
3.1jwt 组成
JWT的token由三段信息构成的,将这三段信息文本用.连接一起就构成了JWT字符串;
- Header 头部(包含了令牌的元数据,并且包含签名和或加密算法的类型)
- Payload 负载
- Signature 签名/签证
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1ODI4OTc4NDUsInVzZXJuYW1lIjoienN6eHoifQ.vyiExkFWCCmQA3PFYL0jJfIiYGWubngqB0WcgmtHOxg
3.2 jwt优点
- 简洁(Compact): 可以通过URL,POST参数或者在HTTP header发送,数据量小,传输速度快
- 自包含(Self-contained):负载中包含了所有用户所需要的信息,避免多次查询数据库
- .因为Token是以JSON加密的形式保存在客户端的,所以JWT是跨语本文来源gaodai$ma#com搞$$代**码)网@言支持;
- 不需要在服务端保存会话信息,适用于分布式与微服务;
四 jwt用户登陆发放token
4.1 pom.xml
项目构件如下
- springboot 2.1;
- jwt 3.4.0;
- maven 3.5
- jdk1.8
- postman接口测试
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>
4.2jwt工具类
jwt工具类中有三个方法,分别是生成数字签名用于用户首次登陆时发送jwt给客户端;其次是校验方法,用于拦截器拦截所有规则内的url,每个请求都必须带有服务器发送的jwt,经过验证后才放行请求;最后一个获得用户名的方法用于查询密钥,在验证jwt时作为参数传入;
/* * * @Author lsc * <p> JWT工具类 </p> * @Param * @Return */ public class JwtUtil { // Token过期时间30分钟 public static final long EXPIRE_TIME = 30 * 60 * 1000; /* * * @Author lsc * <p> 校验token是否正确 </p> * @Param token * @Param username * @Param secret * @Return boolean */ public static boolean verify(String token, String username, String secret) { try { // 设置加密算法 Algorithm algorithm = Algorithm.HMAC256(secret); JWTVerifier verifier = JWT.require(algorithm) .withClaim("username", username) .build(); // 效验TOKEN DecodedJWT jwt = verifier.verify(token); return true; } catch (Exception exception) { return false; } } /* * * @Author lsc * <p>生成签名,30min后过期 </p> * @Param [username, secret] * @Return java.lang.String */ public static String sign(String username, String secret) { Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); Algorithm algorithm = Algorithm.HMAC256(secret); // 附带username信息 return JWT.create() .withClaim("username", username) .withExpiresAt(date) .sign(algorithm); } /* * * @Author lsc * <p> 获得用户名 </p> * @Param [request] * @Return java.lang.String */ public static String getUserNameByToken(HttpServletRequest request) { String token = request.getHeader("token"); DecodedJWT jwt = JWT.decode(token); return jwt.getClaim("username") .asString(); } }