JWT
JWT是标准化的token,全称为 Json Web Token,是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准(RFC 7519)
从本质上讲JWT也是一种token,只不过JWT是被大家广泛接受的标准
JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息
JWT组成:
JWT由 header、payload、signature 三部分组成,它们之间用圆点(.)连接。如:xxxxxx.yyyyyy.zzzzzz
header:头部,承载了两部分信息,①:声明类型,这里是 jwt ②:声明加密的算法,通常使用HMACSHA256
payload:载荷,即存放有效信息的地方,即请求数据
signature:签名信息,这个签证信息由三部分组成:header (base64后的);payload (base64后的);secret
如一个JWT token解码后的结果:
JWT使用原理:
使用:
一般是在请求头里加入Authorization,并加上Bearer标注:
headers: {
'Authorization': 'Bearer ' + token
}
依赖:
<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.0.0</version>
</dependency>
JwtUtil:
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* JWT工具类
*
* @author yangyongjie
* @date 2022/8/19
*/
public class JwtUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(JwtUtil.class);
private JwtUtil() {
}
/**
* 创建HS256(HmacSHA256) JWT Token
*
* @param headers 头信息
* @param payload 荷载信息
* @param key HS256(HmacSHA256)密钥
* @param expires 有效期,单位毫秒
* @return JWT Token
*/
public static String createToken(Map<String, Object> headers, Map<String, Object> payload, String key, long expires) {
Algorithm algorithm = Algorithm.HMAC256(key);
return JWT.create()
.withHeader(headers)
.withPayload(payload)
.withExpiresAt(new Date(System.currentTimeMillis() + expires))
.sign(algorithm);
}
/**
* 创建HS256(HmacSHA256) JWT Token(默认头),默认有效期1小时
*
* @param payload 荷载信息
* @param key HS256(HmacSHA256)密钥
* @return
*/
public static String createToken(Map<String, Object> payload, String key) {
return createToken(null, payload, key, 60 * 60 * 1000L);
}
/**
* 创建HS256(HmacSHA256) JWT Token(默认头)
*
* @param payload 荷载信息
* @param key HS256(HmacSHA256)密钥
* @param expires 有效期,单位毫秒
* @return
*/
public static String createToken(Map<String, Object> payload, String key, long expires) {
return createToken(null, payload, key, expires);
}
/**
* 验证JWT Token有效性
* 默认会与当前时间比较,若到期时间小于当前时间,则认为失效
*
* @param jwtToken JWT Token
* @param key HS256(HmacSHA256)密钥
* @return 是否有效
*/
public static boolean verifyToken(String jwtToken, String key) {
Algorithm algorithm = Algorithm.HMAC256(key);
JWTVerifier verifier = JWT.require(algorithm)
.build();
try {
verifier.verify(jwtToken);
} catch (TokenExpiredException tee) {
LOGGER.error("token失效" + tee.getMessage(), tee);
return false;
} catch (SignatureVerificationException sve) {
LOGGER.error("token无效" + sve.getMessage(), sve);
return false;
} catch (JWTVerificationException jve) {
LOGGER.error("token校验异常" + jve.getMessage(), jve);
return false;
}
return true;
}
/**
* 解析jwt token 获取payload
*
* @param jwtToken
* @return
*/
public static String parseToken(String jwtToken) {
try {
DecodedJWT jwt = JWT.decode(jwtToken);
String payload = jwt.getPayload();
return payload;
} catch (Exception e) {
LOGGER.error("token解析异常" + e.getMessage(), e);
return null;
}
}
public static void main(String[] args) throws InterruptedException {
Map<String, Object> payload = new HashMap<String, Object>();
payload.put("partnerId", "12344");
String key = "yangyongjie";
String jwtToken = JwtUtil.createToken(payload, key);
System.out.println(jwtToken);
boolean flag = JwtUtil.verifyToken(jwtToken, "123");
System.out.println(flag);
}
}
附录:
https://harttle.land/2015/08/10/cookie-session.html
JWT PDF:https://assets.ctfassets.net/2ntc334xpx65/o5J4X472PQUI4ai6cAcqg/13a2611de03b2c8edbd09c3ca14ae86b/jwt-handbook-v0_14_1.pdf
END.