什么是JWT
网站:https://jwt.io/introduction
JWT对象为一个很长的字符串,字符之间通过"."分隔符分为三个子串。每一个子串表示了一个功能块,总共有以下三个部分:JWT头、有效载荷和签名。
JWT加密后数据通常由三部分构成,分别为Header(头部),Payload(负载),Signature(签名),对应其格式如下:
JWT的组成
JWT头部分是一个描述JWT元数据的JSON对象。
{
"alg": "HS256",
"typ": "JWT"
}
- alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256)
- type属性表示令牌的类型,JWT令牌统一写为JWT
有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改
客户端接收服务器返回的JWT,将其存储在Cookie或Local Storage中。此后,客户端将在与服务器交互中都会带JWT。
如果将它存储在Cookie中,就可以自动发送,但是不会跨域,因此一般是将它放入HTTP请求的Header字段中。
当跨域时,也可以将JWT被放置于POST请求的数据主体中。
JWT令牌的使用
地址:https://github.com/auth0/java-jwt
依赖
<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.18.1</version>
</dependency>
JWT工具类
public class JwtUtils {
/**
* 过期时间
*/
public static final long EXPIRE_TIME = 24 * 60 * 1000;
/**
* 密钥
*/
public static final String SECRET = "3bjaiRo3eEC2uzBSpsyyThNhkpklRUWw";
/**
* 创建token
*
* @param username 登录账号
* @param uid 用户ID
* @return
*/
public static String jwtCreator(String username, String uid) {
Algorithm algorithm = Algorithm.HMAC256(SECRET);
return JWT.create()
.withExpiresAt(new Date(System.currentTimeMillis() + EXPIRE_TIME))
.withAudience(username)
.withJWTId(UUID.randomUUID().toString())
.withClaim("id", uid)
.withIssuer("auth0")
.sign(algorithm);
}
/**
* token 验证
*
* @param token token
* @return
*/
public static boolean jwtVerifier(String token) {
try {
Algorithm algorithm = Algorithm.HMAC256(SECRET);
JWTVerifier verifier = JWT.require(algorithm)
.withIssuer("auth0")
.build();
verifier.verify(token);
} catch (JWTVerificationException exception) {
exception.printStackTrace();
return false;
}
return true;
}
}