一、JWT
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。
一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。
1.头部(Header)
头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以被表示成一个JSON对象。这也可以被表示成一个JSON对象。{"typ":"JWT","alg":"HS256"}。在头部指明了签名算法是HS256算法。 我们进行BASE64编码base64 转图片 在线解码编码,编码后的字符串如下:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
2.载荷(playload)
载荷就是存放有效信息的地方。
定义一个payload:
{"sub":"1231567890","name":"John Doe","admin":true}
然后将其进行base64加密,得到Jwt的第二部分。
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG1gRG9lIiwiYWRtaW1iOnRydWV9
3.签证(signature)
jwt的第三部分是一个签证信息,这个签证信息由三部分组成:
header (base64后的)
payload (base64后的)
secret
这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
将这三部分用.连接成一个完整的字符串,构成了最终的jwt:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG1gRG9lIiwiYWRtaW1iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
二、JJWT签发与验证token
1.创建token
创建一个maven项目,在pom.xml文件中导入依赖
<dependencies>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
</dependencies>
创建测试类,代码如下
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
/**
* 创建token
*/
public class JwtTest1 {
public static void main(String[] args) {
JwtBuilder builder = Jwts.builder().setId("888") //设置唯一编号
.setSubject("小白") //设置主题 可以是JSON数据
.setIssuedAt(new Date()) //设置签发日期
.signWith(SignatureAlgorithm.HS256, "itcast");
//设置签名 使用HS256算法,并设置SecretKey(字符串) //构建 并返回一个字符串
System.out.println(builder.compact());
}
}
2.解析token
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
/**
* 解析token
*/
public class JwtTest2 {
public static void main(String[] args) {
String compactJwt = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE3MjI0MDc1NDd9.veykODIHFPGuLo0hxov51MoVPRqoQWRws5zjA5aPyHE";
Claims claims = Jwts.parser().setSigningKey("itcast").parseClaimsJws(compactJwt).getBody();
System.out.println(claims);
}
}
3.设置过期时间
创建token 并设置过期时间
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
/**
* 创建token 并设置过期时间
*/
public class JwtTest3 {
public static void main(String[] args) {
//当前时间
Date date = new Date();
Date dateOut = new Date(date.getTime() + 1000 * 30);
JwtBuilder builder = Jwts.builder().setId("888") //设置唯一编号
.setSubject("小白")//设置主题 可以是JSON数据
.setIssuedAt(date)//设置签发日期
.setExpiration(dateOut)//用于设置过期时间 ,参数为Date类型数据
.signWith(SignatureAlgorithm.HS256, "itcast");//设置签名 使用HS256算法,并设置SecretKey(字符串) //构建 并返回一个字符串
System.out.println(builder.compact());
}
}
解析TOKEN
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
/**
* 解析TOKEN
*/
public class JwtTest4 {
public static void main(String[] args) {
String compactJwt = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE3MjI0MTExNTIsImV4cCI6MTcyMjQxMTE4Mn0.WdnGg_5TSLHAjV0VYAuZE4Nr9JqP6ZpTOTPz6oyXIpk";
Claims claims = Jwts.parser().setSigningKey("itcast").parseClaimsJws(compactJwt).getBody();
System.out.println(claims);
}
}
4.自定义claims
创建token
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 创建token
*/
public class JwtTest5 {
public static void main(String[] args) {
//当前时间
Date date = new Date();
Date dateOut = new Date(date.getTime() + 1000 * 15);
Map m = new HashMap();
m.put("name", "itcast");
m.put("age", 18);
m.put("sex", "man");
JwtBuilder builder = Jwts.builder().setId("888") //设置唯一编号
.setSubject("小白")//设置主题 可以是JSON数据
.setIssuedAt(date)//设置签发日期
.setExpiration(dateOut)//用于设置过期时间 ,参数为Date类型数据
.setClaims(m)
.signWith(SignatureAlgorithm.HS256, "itcast");//设置签名 使用HS256算法,并设置SecretKey(字符串) //构建 并返回一个字符串
System.out.println(builder.compact());
}
}
解析TOKEN
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
/**
* 解析TOKEN
*/
public class JwtTest6 {
public static void main(String[] args) {
String compactJwt = "eyJhbGciOiJIUzI1NiJ9.eyJzZXgiOiJtYW4iLCJuYW1lIjoiaXRjYXN0IiwiYWdlIjoxOH0.XH2y6-5qAJQ6Rzmyx9PKYwzY5FHXi_dhWRLsyCNLqHE";
Claims claims = Jwts.parser().setSigningKey("itcast").parseClaimsJws(compactJwt).getBody();
System.out.println(claims);
}
}
三、创建JWTUtils工具类
package com.buka;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;
import java.util.UUID;
public class JwtUtils {
public static String encrypt(Map map, Date dateOut) {
//当前时间
Date date = new Date();
JwtBuilder builder = Jwts.builder().setId(UUID.randomUUID().toString()) //设置唯一编号
.setSubject("JWT")//设置主题 可以是JSON数据
.setIssuedAt(date)//设置签发日期
.setExpiration(dateOut)//用于设置过期时间 ,参数为Date类型数据
.setClaims(map)
.signWith(SignatureAlgorithm.HS256, "itbuka");//设置签名 使用HS256算法,并设置SecretKey(字符串) //构建 并返回一个字符串
return builder.compact();
}
public static Map decrypt( String compactJwt) {
Claims claims = Jwts.parser().setSigningKey("itbuka").parseClaimsJws(compactJwt).getBody();
return claims;
}
}