带签名的JWT叫JWS
登录接口需要为登录成功的用户创建并返回JWT,本项目使用开源的JWT工具Java-JWT,配置如下,具体内容可参考官方文档。
在common模块的pom.xml文件中增加如下内容
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<scope>runtime</scope>
</dependency>
在common模块下创建com.atguigu.lease.common.utils.JwtUtil
工具类,内容如下
//构造key
public static SecretKey secretKey = Keys.hmacShaKeyFor("ZCE0qgXsTjReejmxujzTAUHjj3efyiZ0".getBytes());
public static String createToken(Long userId,String userName){
String jwt=Jwts.builder().
setExpiration(new Date(System.currentTimeMillis()+3600000)).//设置过期时间 单位毫秒
setSubject("LOGIN_USER"). //设置主题
claim("userId",userId). //声明自定义属性要用claim
claim("username",userName).
signWith(secretKey) //构造签名:输入密令key 选择签名算法
.compact(); //打包
return jwt;
}
public static void main(String[] args) {
String token = createToken(1L, "zhangsan");
System.out.println(token);
}
token校验器
我们需要为所有受保护的接口增加校验JWT合法性的逻辑。具体实现如下
JwtUtil
中增加parseToken
方法,内容如下 public static Claims parseToken(String token){
if (token==null){
throw new LeaseException(ResultCodeEnum.ADMIN_LOGIN_AUTH);
}
try{
JwtParser jwtParser = Jwts.parserBuilder().setSigningKey(secretKey).build();
return jwtParser.parseClaimsJws(token).getBody();
}catch (ExpiredJwtException e){
throw new LeaseException(ResultCodeEnum.TOKEN_EXPIRED);
}catch (JwtException e){
throw new LeaseException(ResultCodeEnum.TOKEN_INVALID);
}
}
推荐阅读: