什么是JWT?
JWT是JSON Web Token的缩写,通过数字签名的方式,以json对象为载体,在不同的服务终端之间安全的传输信息。(将信息进行封装后以JSON的格式进行传递)
JWT有什么用?
JWT最常见的场景就是授权认证,一旦用户登入,后续每个请求都将包含JWT,系统在每次处理用户请求的之前,都要先进行JWT安全校验,通过之后再进行处理
JWT的组成
JWT由3部分组成,用点拼接
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2MzIyMzA3NzEsImp0aSI6Ijc3OTJkYWU0LTM5M2UtNDVlOC05M2Q1LTc3Zjc1OGQzYzkxYSJ9.laQXoVZ4AKmTlr8dZTuefoWo5Vqcg1P00ibO0pSCRy4
这三部分分别是:
- Header(包含类型和算法名称)
{
'typ':'JWT',
'alg':'HS256'//算法
}
- Payload(载荷【存放有效信息的地方】)
{
'sub':'1234567990',
'name':'john',
'admin':true
}
- Signature(签名)
var encodedString = base64UrLEncode(header) + '.' + base64UrLEncode(payload);//对header和payload进行加密后拼接
var signature = HMACSHA256(encodedString, 'secret');//再次加密,完成第三部分的拼接
使用:
第一步引入pom.xml依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
jdk1.8以上还需要加上如下依赖:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
第二步写代码加密:
package com.ldx.security;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.UUID;
public class Test {
private final static long time=1000*60*60*24;
private final static String signature="admin";
@org.junit.jupiter.api.Test
public void jwt(){
JwtBuilder jwtBuilder= Jwts.builder();//获取构建(加密)jwt的对象
//创建三部分
String jwtToken=jwtBuilder
//header信息(固定写)
.setHeaderParam("typ","JWT")
.setHeaderParam("alg","HS256")
//payload(我们的数据)
.claim("username","tom")
.claim("role","admin")
.setSubject("admin-test")//设置主题
.setExpiration(new Date(System.currentTimeMillis()+time))//设置有效时间
.setId(UUID.randomUUID().toString())
//(signature)设置签名
.signWith(SignatureAlgorithm.HS256,signature)
.compact();//最后调用拼接的方法形成三部分的字符串
System.out.println(jwtToken);
}
}
输出一下结果:(admin信息被封装了)
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2MzIyMzA3NzEsImp0aSI6Ijc3OTJkYWU0LTM5M2UtNDVlOC05M2Q1LTc3Zjc1OGQzYzkxYSJ9.laQXoVZ4AKmTlr8dZTuefoWo5Vqcg1P00ibO0pSCRy4
第三步解密:
public void parse(){
String token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1" +
"NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pb" +
"iIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2MzIyMzA3NzEsImp0aSI6I" +
"jc3OTJkYWU0LTM5M2UtNDVlOC05M2Q1LTc3Zjc1OGQz" +
"YzkxYSJ9.laQXoVZ4AKmTlr8dZTuefoWo5Vqcg1P00ibO0pSCRy4";
JwtParser jwtParser = Jwts.parser();//获取解密jwt的对象
Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
Claims claims = claimsJws.getBody();
System.out.println(claims.get("username"));
System.out.println(claims.get("role"));
System.out.println(claims.getId());
System.out.println(claims.getSubject());
System.out.println(claims.getExpiration());
}
输出解密结果:
基本使用完结