目录
1 JWT介绍
JSON Web Token(JWT),它定义了一种简洁的、自包含的协议格式,JWT可以使用HMAC算法或使用RSA的公钥/私钥对进行签名,防止被篡改。
JWT官网: https://jwt.io
JWT组成
JWT由三个部分组成:JWT头、有效载荷和签名
jwt头
{"typ":"jwt","alg":"HS256"}
在上面的代码中,alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);type属性表示令牌的类型,JWT令牌统一写为JWT(需要额外设置)。
有效载荷payload
有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。
JWT指定七个默认字段供选择(不是必须的):
iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti:JWT ID用于标识该JWT
除以上默认字段外,还可以自定义私有字段,比如:
{"username": "zhangsan","id": "123"}
请注意,默认情况下JWT是未加密的,任何人都可以解读其内容,因此不要构建隐私信息字段,存放保密信息,以防止信息泄露。
签名Signature
签名部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。
首先,需要指定一个密码(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。
然后,使用标头中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
最终生成的jwt的字符串由三部分组成:
header(base64后的)
payload(base64后的)
Signature
例如:
eyJ0eXBlIjoiand0IiwiYWxnIjoiSFMyNTYifQ.eyJ1c2VybmFtZSI6InpoYW5nc2FuIn0.C13IdXCyBs4oALrcttCBQ5LMsl0pTNxwgwqsVW7lSPs
官网上可以查看jwt信息
2 生成jwt
导入jar
<!-- jwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
jwt工具类
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;
/**
* jwt工具类
*/
public class JwtUtils {
// 密钥
private final static String secret = "123456789qwertyui";
/**
* 生成jwt
*
* @param claims
* @return
*/
public static String createJwt(Map<String, Object> claims) {
// 签名算法,表示sha256
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
//构造jwt
JwtBuilder builder = Jwts.builder()//.setHeaderParam("type","jwt") // 设置头
.setClaims(claims) // 设置载荷
.setExpiration(new Date(System.currentTimeMillis() + 1800000)) // 设置过期时间
.signWith(signatureAlgorithm, secret); // 使用指定算法设置签名
//生成jwt
return builder.compact();
}
/**
* 解析,如果不符合,报异常
*
* @param jsonWebToken
* @return
*/
public static Claims parseJWT(String jsonWebToken) {
try {
Claims claims = Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(jsonWebToken).getBody();
return claims;
} catch (Exception ex) {
throw new RuntimeException(ex.getMessage());
}
}
}