1.什么是JWT?
json web token,通过数字签名的方式,以json为载体,在不同的服务之间安全的传输信息的一种技术,替代了cookie和session,保证数据共享和数据的安全性
2. JWT的组成格式?
由Header(头信息),PayLoad (用户信息),signature(签名)三个部分组成
2.1 Header头信息主要声明加密算法:(具体算法对称不对称加密不作为研究内容)
通常直接使用 HMAC HS256这样的算法
{
"typ":"jwt"
"alg":"HS256" //加密算法
}
然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
2.2 PayLoad(数据)
{
"username":"zhangsan",
"name":"张三",
...
}
对其进行base64加密,得到Jwt的第二部分。
eyJ1c2VybmFtZSI6InpoYW5nc2FuIiwibmFtZSI6IuW8oOS4iSIsImFnZSI6MTgsInNleCI6IuWlsyIsImV4cCI6MTY0NzE0NTA1MSwianRpIjoiMTIxMjEyMTIxMiJ9
2.3 Signature 自定义信息
这个签证信息由三部分组成(由加密后的Header,加密后的PayLoad,加密后的签名三部分组成)
- header (base64后的)
- payload (base64后的)
- secret
base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐加密,然后就构成了jwt的第三部分,每个部分直接使用"."来进行拼接
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InpoYW5nc2FuIiwibmFtZSI6IuW8oOS4iSIsImFnZSI6MTgsInNleCI6IuWlsyIsImV4cCI6MTY0NzE0NTA1MSwianRpIjoiMTIxMjEyMTIxMiJ9.5tmHCpcsS_VuZ2_z5Rydf2OpsviBGwB-fJE5aS7gKqE
3.流程
4. 怎么使用JWT
引入Pom依赖:注:使用的jdk1.8版本 高版本会报缺少jar包
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
@Test
//加密
public void jwt(){
//定义数据
HashMap map = new HashMap();
map.put("userId",String.valueOf(123456));
map.put("phone",String.valueOf(15051369));
long l = System.currentTimeMillis();
//创建Jwt 三部分
JwtBuilder builder = Jwts.builder();
//设置密钥
String token = builder.signWith(SignatureAlgorithm.HS256, "xiaowang")
//设置数据
.setClaims(map)
//设置失效时间
.setExpiration(new Date(l + 10000))
.compact();
System.out.println(token);
}
@Test
//解密
public void parse(){
//获取解密器
//解密器需要获取我们本地的秘钥 signature将生成的token进行解密,拿到一个Claims
//核心是获取payLoad里的用户信息调用getBody方法获取payLoad
Jws<Claims> claimsJws = Jwts.parser().setSigningKey("xiaowang")
.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJwaG9uZSI6IjE1MDUxMzY5IiwiZXhwIjoxNjU4ODIxOTkxLCJ1c2VySWQiOiIxMjM0NTYifQ.yw4h6zfHUW4gdkXvZwQZFvGC94TqT371DF-n-DB_OXw");
//得到数据信息
String userId = (String) claimsJws.getBody().get("userId");
String phone = (String) claimsJws.getBody().get("phone");
System.out.println(userId + "====" + phone);
}