JWT令牌
JWT全称是JSON Web Token,它定义了一种简介的、自包含的格式,用于通信双方以json数据格式安全的传输信息。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
jwt字符串组成:
第一部分:(eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9):Header(头),记录令牌类型,签名算法等,例如:{“alg”:"HS256;“type”:“JWT”} alg:表示算法 type:表示类型
第二部分:(eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ):PayLoad(有效载荷),携带一些自定义信息、默认信息等。例如:{“id”:“1”,“username”:“Tom”}等等
在JWT中会使用Base64(一种基于64个可打印的字符(A-Z a-z 0-9 + /)来表示二进制数据的编码方式。可以把任意数据转化成64个可打印的字符。)
注意:Base64是一种开源的编码方式,也就是说谁都可以通过解码的方式将第二部分的字符串解析,然后获取用户信息。
第三部分:
(SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c):Signature(签名)数字签名,防止Token(令牌)被篡改,确保安全性,将Header,Payload,并加入指定密钥,通过指定签名算法计算得来。
JWT-生成
①引入JWT坐标
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
②设置JWT获取类,保证能获取到加密后的String字符串。
package com.example.bigeventproject.Util;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import java.util.Date;
import java.util.Map;
public class GetToken
{
public String getToken(Map<String,Object> map)
{
String token= JWT.create()
.withClaim("user",map)//添加载荷
.withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60*24*365)//过期时间
).sign(Algorithm.HMAC256("wuyaohui"));//sign是签名的意思,在这里要指定加密算法,在算法中指定密钥
//算法:Algorithm.ECDSA384(密钥),算法都可以通过Algorithm来获取
return token;
}
}
sign是签名的意思,在这里要指定加密算法,在算法中指定密钥
算法:Algorithm.ECDSA384(密钥),算法都可以通过Algorithm来获取
测试一下:
@Test
public void Test()
{
HashMap<String, Object> map=new HashMap<>();
map.put("username","zhangsan");
map.put("id",1);
String token = GetToken.getToken(map);
System.out.println(token);
}
结果
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6InpoYW5nc2FuIn0sImV4cCI6MTcwNzA2ODg5NX0.cxbAjCn2YIs4WhEv0G6khF-K3toxLxUEVYpBz6YpRXE
JWT验证
①写一个获取方法
public static Map<String,Claim> parseToken(String token)
{
JWTVerifier jwtVerifier=JWT.require(Algorithm.HMAC256("wuyaohui")).build();
DecodedJWT decodedJWT=jwtVerifier.verify(token);
return decodedJWT.getClaims();
}
②测试
@Test
public void Test() {
Map<String, Claim> stringClaimMap = GetToken.parseToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6InpoYW5nc2FuIn0sImV4cCI6MTcwNzA2ODg5NX0.cxbAjCn2YIs4WhEv0G6khF-K3toxLxUEVYpBz6YpRXE");
Claim id = stringClaimMap.get("user");
System.out.println(id);
}
注意:stringClaimMap.get(“参数”);这个方法的参数是你生成时加入的载荷名称。