鉴于做毕设,本人学习了一下JWT,防止遗忘,做此笔记;
首先就是:什么是JWT(JSON Web Token)?
它一个轻量级的认证规范,这个规范允许使用JWT在用户和服务器之间传递安全可靠的信息。其本质是一个token,是一种紧凑的URL安全方法,用于在网络通信的双方之间传递。
其次是 :JWT长什么样?
eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJjZXNoaSIsImNyZWF0ZWQiOjE2NzY0NTcyNTY4MDYsImV4cCI6MTY3NjUwMDQ1Nn0.Bq1SK4hf5eKCfmqI0-hCOHFbl60RHMWRNZLe2IjmLukMoAylwVIe_TVL2nXinN9C0y5XFiJtYq8l1hV2L2uK9w
他是一个字符串,由头部、载荷与签名三部分组成,并由.分割
头部是描述JWT的基本信息,包含了所用的算法和类型
例如:
{"typ":"JWT","alg":"HS256"}
我们对此字符串使用Base64进行编码得到:
public static void main(String[] args) {
String str = "{\"typ\":\"JWT\",\"alg\":\"HS256\"}\n";
String encode = Base64.getEncoder().encodeToString(str.getBytes());
System.out.println(encode);
}
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9Cg==
载荷是存放有用信息的地方。
{"sub":"123456","name":"成长的小猿","admin":true}
我们对此字符串使用Base64进行编码得到:
public static void main(String[] args) {
String str = "{\"sub\":\"123456\",\"name\":\"成长的小猿\",\"admin\":true}";
String encode = Base64.getEncoder().encodeToString(str.getBytes());
System.out.println(encode);
}
eyJzdWIiOiIxMjM0NTYiLCJuYW1lIjoi5oiQ6ZW/55qE5bCP54y/IiwiYWRtaW4iOnRydWV9
第三部分是签证;
secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以secret就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了
接下来就要使用JWT了
引入依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
JWT工具类
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
public class JWTUtil {
// 有效期
public static final Long JWT_TTL = 30*60*1000L;
// JWT令牌信息
public static final String JWT_KEY = "chengzhangdexiaoyuan";
public static String createJWT(String id, String subject, Long ttlMillis) {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
if (ttlMillis == null) {
ttlMillis = JWT_TTL;
}
long expMillis = nowMillis + ttlMillis;
Date expDate = new Date(expMillis);
SecretKey secretKey = generalKey();
JwtBuilder builder = Jwts.builder()
.setId(id) // 设置唯一编号
.setSubject(subject) // 设置主题 可以是JSON数据
.setIssuer("admin")
.setIssuedAt(now) // 设置签发日期
.setExpiration(expDate) // 设置过期时间
// 设置签名 使用HS256算法 并设置SecretKey(字符串)
.signWith(SignatureAlgorithm.HS256, secretKey);
return builder.compact();
}
/**
* 生成加密secretKey
* @return
*/
public static SecretKey generalKey() {
byte[] encodedKey = Base64.getEncoder().encode(JWT_KEY.getBytes());
SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
return key;
}
/**
* 解析令牌数据
*/
public static Claims parseJWT(String jwt) throws Exception {
SecretKey secretKey = generalKey();
return Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(jwt)
.getBody();
}
}