JWT官网: https://jwt.io/
JWT(Java版)的github地址:https://github.com/jwtk/jjwt
什么是JWT
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名
注意redis中存储的jwt过期时间要和jwt工具类生成的jwt过期时间一致
ssm版本的
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.3.0</version>
</dependency>
package com.tale.subject.util;
import java.io.UnsupportedEncodingException;
import java.util.*;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
public class JwtUtil {
private static String SECRET = "token_666"; // 秘钥(公钥)
/**
* 生成token
* @param id
* @param username
* @param type
* @return
* @expireTime
*/
public static String createToken(String id, String username, String type, Date expireTime){
// 签发时间
Date iatDate = new Date();
Map<String, Object> map = new HashMap<String, Object>();
map.put("alg", "HS256");
map.put("typ", "JWT");
String token = null; // 加密
try {
System.out.println("token >>id" + id);
token = JWT.create()
.withHeader(map)
.withClaim("username", username)
.withClaim("id", id)
.withClaim("type", type)
.withExpiresAt(experiesDate) // 设置过期的日期
.withIssuedAt(iatDate) // 签发时间
.sign(Algorithm.HMAC256(SECRET));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return token;
}
/**
* 解密
* @param token
* @return
* @throws Exception
*/
public static Map<String, Claim> verifyToken(String token) {
JWTVerifier verifier = null;
try {
verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
} catch (Exception e) {
e.printStackTrace();
}
DecodedJWT jwt = null;
jwt = verifier.verify(token); // 核实token
return jwt.getClaims(); // 这里解密jwt得到的是一个map
}
}
springboot版本:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
package com.gxuwz.spring.demo.util;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* jwt工具,用于生成jwt和解密jwt
* jwt主要部分:1.claims(主要用于封装用户信息,及角色)
* TODO 未处理角色,即对方知道路径但该角色没有权限应该拦截请求
* 2.加密算法和秘钥
* 3.过期时间
*/
public class JWTUtil {
private static final String SECRET = "tale_secret";
/**
* 生成jwt
* @param id 作为唯一标识
* @param userName 用户名
* @param role 角色
* @expireTime 过期时间
*/
public static String builderJWT(String id, String userName, String role, Date expireTime){
Map<String, Object> jwtInfo = new HashMap<>();
jwtInfo.put("id", id);
jwtInfo.put("userName", userName);
jwtInfo.put("role", role);
String jwt = Jwts.builder().setClaims(jwtInfo)
.setExpiration(expireTime)
.signWith(SignatureAlgorithm.HS256, SECRET) // 加密算法及秘钥
.compact();
return jwt;
}
/**
* 解密jwt
* @param jwt
* @return
*/
public static Claims parseJWT(String jwt){
Claims claim = Jwts.parser().setSigningKey(SECRET)
.parseClaimsJwt(jwt).getBody();
return claim;
}
}
redis方法
/**
* 存储jwt
* @param key
* @param value
* @param expireTime
*/
public boolean setToken(String key, Object value, long expireTime) {
try {
redisTemplate.opsForValue().set(key, value, expireTime, TimeUnit.SECONDS);
}catch (Exception e){
e.printStackTrace();
return false;
}
return true;
}
在登录时生成jwt并存储jwt到redis,登录方法这里就不贴了
网友评论