JWT简介
JSON WEB Token,通过数字签名的方式,以JSON对象为载体,在不同的服务终端之间安全的传输信息。
JWT的作用
JWT最常见的场景就是授权认证,一旦用户登录,后续的每个请求都将包含JWT,系统在每次处理用户请求之前,都要先进行JWT安全校验,通过之后在进行处理。
JWT的组成
JWT由三部分组成,用.拼接
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NTY3NDA3MTgsImp0aSI6ImY3YjY4NWUyLTA5ZmUtNDhiOC1iNDQ2LTZlOWNhMjYwMWQzMCJ9.jGJzYV22JE9ETOugsZN8Do8N4ZDwUsTkXbBQOQPY7_s
- Header
包含token类型和加密算法名称,并进行Base64编码
{
'typ': 'JWT',
'alg': 'HS256'
}
- Payload
有效载荷,存放有效信息的地方,并进行Base64编码
{
"sub": '123456',
"name": 'tom',
"admin": true
}
- Signature
加密信息,加密方式如下代码所示
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
var signature = HMACSHA256(encodedString, 'secret');
pom.xml文件引入依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!-- jdk1.8以上版本需要引入(不包含1.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>
编写生成JWT数据、解析JWT数据
package com.test.allstart.utils;
import io.jsonwebtoken.*;
import org.junit.Test;
import java.util.Date;
import java.util.UUID;
public class Jwt {
private long time = 1000*60*60*24; // 一天的毫秒数
private String signature = "admin"; // 加密密钥
/**
* 生成JWT数据
*/
@org.junit.Test // 单元测试注解
public void jwt(){
// 创建jwt对象
JwtBuilder jwtBuilder = Jwts.builder();
String jwtToken = jwtBuilder
// header
.setHeaderParam("typ","JWT")
.setHeaderParam("alg","HS256")
// payload
.claim("username","tom")
.claim("role","adminAce")
.setSubject("admin-test") // 设置主题
.setExpiration(new Date(System.currentTimeMillis()+ time)) // 设置有效时间
.setId(UUID.randomUUID().toString())
// signature
.signWith(SignatureAlgorithm.HS256, signature)
.compact();
System.out.println(jwtToken);
}
/*
* 解析JWT数据
*/
@org.junit.Test
public void jwtParse(){
String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9" +
".eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbkFjZSIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NTY3NDExNjQsImp" +
"0aSI6IjJkODA4MGU4LWJhN2UtNGZiNS04MTViLTM4N2U3Y2MwOTlmYyJ9.6pKISySzxvADAVh-eyHb4jkw3V0Et34jPjQZ-DPi5Nk";
JwtParser jwtParser = Jwts.parser();
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());
}
}