相逢即是缘,路过点个赞 ^.^php
源码:https://github.com/yulc-coding/java-note/tree/master/jwt css
JWT是一种用于通讯双方之间传递安全信息的简洁的、URL安全的表述性声明规范,常常用在跨域身份验证。由于存在数字签名,所以能够起到防串改的做用前端
相对于传统的session认证,一般将session保存在服务端,须要服务器去维护。而且在服务器集群或请求服务跨域的状况下,须要共享session,使每台服务器都能读取session,好比将session持久化,增长了开销。java
用户登陆后服务器将相关数据生成一个token返回客户端
客户端每次发起请求带上token
服务器获取token后校验token验证合法性git
{
"alg": "Algorithm 加密方法:HS256",
"cty": "Content Type ",
"typ": "Type" ,
"kid": "Key Id"
}
复制代码
{
"iss": "Issuer JWT的签发者",
"aud": "Audience 接收JWT的一方",
"sub": "Subject JWT的主题",
"exp": "Expiration Time JWT的过时时间",
"nbf": "Not Before 在xxx之间,该JWT都是可用的",
"iat": "Issued At 该JWT签发的时间",
"jti": "JWT ID JWT的惟一身份标识",
"xxx": "自定义属性"
}
复制代码
Signature 签名信息 = 加密算法(header + "." + payload, 密钥)github
TOKENweb
base64(Header).base64(Payload).Signature
复制代码
<!-- JWT 支持-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.8.3</version>
</dependency>
<!-- 很好用的一个工具类包 这里用来处理json和AES加密-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.0.3</version>
</dependency>
复制代码
能够传入公有声明的字段,也能够传入自定义的字段算法
/**
* 建立token
*
* @param json 须要放入token的参数,多个参数能够封装成json或者map
* @return token
*/
public static String createToken(JSONObject json) {
try {
// 加密方式
Algorithm algorithm = Algorithm.HMAC256(SECRET);
return JWT.create()
.withSubject(json.toString())
.withIssuer("ylc")
// 设置过时时间为1分钟后
.withExpiresAt(DateUtil.offsetMinute(new Date(), 1))
.withClaim("customString", "自定义参数")
.withArrayClaim("customArray", new Integer[]{1, 2, 3})
.sign(algorithm);
} catch (JWTCreationException exception) {
//Invalid Signing configuration / Couldn't convert Claims.
System.out.println(exception.getMessage());
return null;
}
}
复制代码
包含:
格式校验:header.payload.signature
加密方式校验: Header中的alg值
签名信息Signature校验,防止数据被篡改
载体Payload 中公有声明字段校验,如iss,jti,exp过时时间的校验json
/**
* 校验token 合法性
*
* @param token to verify.
*/
public static boolean verifyToke(String token) {
try {
Algorithm algorithm = Algorithm.HMAC256(SECRET);
JWTVerifier verifier = JWT.require(algorithm)
// 验证签发人是否相同
.withIssuer("ylc")
.build();
/*
* 校验:
* 格式校验:header.payload.signature
* 加密方式校验 Header中的alg
* 签名信息校验,防串改
* 载体Payload 中公有声明字段校验
*/
verifier.verify(token);
return true;
} catch (JWTVerificationException exception) {
//Invalid signature/claims
System.out.println(exception.getMessage());
return false;
}
}
复制代码
能够经过jwt.getClaims() 获取全部声明字段
也能够经过 jwt.getClaim(name) 获取指定名称的声明字段跨域
/**
* 解析token
*
* @param token to decode.
*/
public static void decodeToken(String token) {
try {
DecodedJWT jwt = JWT.decode(token);
Map<String, Claim> claims = jwt.getClaims();
Claim customStringClaim = claims.get("customString");
Claim customArrayClaim = claims.get("customArray");
String issuer = jwt.getIssuer();
String subject = jwt.getSubject();
System.out.println(customStringClaim.asString());
System.out.println(Arrays.toString(customArrayClaim.asArray(Integer.class)));
System.out.println(issuer);
System.out.println(JSONUtil.parseObj(subject));
} catch (JWTDecodeException exception) {
//Invalid token
System.out.println(exception.getMessage());
}
}
复制代码