当前位置:网站首页>JWT-JSON WEB TOKEN
JWT-JSON WEB TOKEN
2022-07-06 06:08:00 【雪峰.贵】
一、JWT是什么?

二、JWT的组成
- Header: 记录令牌的类型,签名的算法名。{“alg”:“HS256”,“type”:“JWT”}
- Payload:记录用户信息。{“username”:“GXF”,“id”:“1”}
- Signature:防止Token被篡改,提高安全性。根据Header和Payload计算出来的一个字符串。
三、Token组成
token=BASE64(Header).BASE64(Payload).BASE64(Signature)
四、Signature的组成
Signature是由Header里的alg指定的算法计算出来。
Signature=指定的算法(BASE64(Header).BASE64(Payload),密钥)
五、使用
- 加依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.10.7</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.10.7</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.10.7</version>
<scope>runtime</scope>
</dependency>
- 加配置
jwt:
secret: 123456 #密钥
# 有效期,单位秒,默认2周
expire-time-in-second: 1209600
- 加工具类
import com.google.common.collect.Maps;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@RequiredArgsConstructor
@SuppressWarnings("WeakerAccess")
@Component
public class JwtOperator {
/** * 秘钥 * - 默认aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrsssttt */
@Value("${secret:aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrsssttt}")
private String secret;
/** * 有效期,单位秒 * - 默认2周 */
@Value("${expire-time-in-second:1209600}")
private Long expirationTimeInSecond;
/** * 从token中获取claim * * @param token token * @return claim */
public Claims getClaimsFromToken(String token) {
try {
return Jwts.parser()
.setSigningKey(this.secret.getBytes())
.parseClaimsJws(token)
.getBody();
} catch (ExpiredJwtException | UnsupportedJwtException | MalformedJwtException | IllegalArgumentException e) {
log.error("token解析错误", e);
throw new IllegalArgumentException("Token invalided.");
}
}
/** * 获取token的过期时间 * * @param token token * @return 过期时间 */
public Date getExpirationDateFromToken(String token) {
return getClaimsFromToken(token)
.getExpiration();
}
/** * 判断token是否过期 * * @param token token * @return 已过期返回true,未过期返回false */
private Boolean isTokenExpired(String token) {
Date expiration = getExpirationDateFromToken(token);
return expiration.before(new Date());
}
/** * 计算token的过期时间 * * @return 过期时间 */
public Date getExpirationTime() {
return new Date(System.currentTimeMillis() + this.expirationTimeInSecond * 1000);
}
/** * 为指定用户生成token * * @param claims 用户信息 * @return token */
public String generateToken(Map<String, Object> claims) {
Date createdTime = new Date();
Date expirationTime = this.getExpirationTime();
byte[] keyBytes = secret.getBytes();
SecretKey key = Keys.hmacShaKeyFor(keyBytes);
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(createdTime)
.setExpiration(expirationTime)
// 你也可以改用你喜欢的算法
// 支持的算法详见:https://github.com/jwtk/jjwt#features
.signWith(key, SignatureAlgorithm.HS256)
.compact();
}
/** * 判断token是否非法 * * @param token token * @return 未过期返回true,否则返回false */
public Boolean validateToken(String token) {
return !isTokenExpired(token);
}
// public static void main(String[] args) {
// // 1. 初始化
// JwtOperator jwtOperator = new JwtOperator();
// jwtOperator.expirationTimeInSecond = 1209600L;
// jwtOperator.secret = "aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrsssttt";
//
// // 2.设置用户信息
// HashMap<String, Object> objectObjectHashMap = Maps.newHashMap();
// objectObjectHashMap.put("id", "1");
//
// // 测试1: 生成token
// String token = jwtOperator.generateToken(objectObjectHashMap);
// // 会生成类似该字符串的内容: eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJpYXQiOjE1NjU1ODk4MTcsImV4cCI6MTU2Njc5OTQxN30.27_QgdtTg4SUgxidW6ALHFsZPgMtjCQ4ZYTRmZroKCQ
// System.out.println(token);
//
// // 将我改成上面生成的token!!!
// String someToken = "eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJpYXQiOjE1NjU1OTQ1NjIsImV4cCI6MTU2NjgwNDE2Mn0.PAvWPcQAZnSlYKNbZr4O1l9aA4LPphuq0OG2QIs7O5E\n";
// // 测试2: 如果能token合法且未过期,返回true
// Boolean validateToken = jwtOperator.validateToken(someToken);
// System.out.println(validateToken);
//
// // 测试3: 获取用户信息
// Claims claims = jwtOperator.getClaimsFromToken(someToken);
// System.out.println(claims);
//
// // 将我改成你生成的token的第一段(以.为边界)
// String encodedHeader = "eyJhbGciOiJIUzI1NiJ9";
// // 测试4: 解密Header
// byte[] header = Base64.decodeBase64(encodedHeader.getBytes());
// System.out.println(new String(header));
//
// // 将我改成你生成的token的第二段(以.为边界)
// String encodedPayload = "eyJpZCI6IjEiLCJpYXQiOjE1NjU1ODk1NDEsImV4cCI6MTU2Njc5OTE0MX0";
// // 测试5: 解密Payload
// byte[] payload = Base64.decodeBase64(encodedPayload.getBytes());
// System.out.println(new String(payload));
//
// // 测试6: 这是一个被篡改的token,因此会报异常,说明JWT是安全的
// jwtOperator.validateToken("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJpYXQiOjE1NjU1ODk3MzIsImV4cCI6MTU2Njc5OTMzMn0.nDv25ex7XuTlmXgNzGX46LqMZItVFyNHQpmL9UQf-aUxxx");
// }
}
边栏推荐
- Eigen稀疏矩阵操作
- 误差的基本知识
- Fault, error, failure of functional safety
- [postman] test script writing and assertion details
- JMeter做接口测试,如何提取登录Cookie
- Huawei BFD configuration specification
- 数学三大核心领域概述:代数
- LAN communication process in the same network segment
- selenium源码通读·9 |DesiredCapabilities类分析
- Eigen sparse matrix operation
猜你喜欢

【Postman】Monitors 监测API可定时周期运行

黑猫带你学eMMC协议第10篇:eMMC读写操作详解(read & write)
![[postman] collections configuration running process](/img/09/bcd9fd6379fa724671ffd09278442e.png)
[postman] collections configuration running process
![[ram IP] introduction and experiment of ram IP core](/img/34/1c988456e32a8e9840d1d073caefbf.jpg)
[ram IP] introduction and experiment of ram IP core

Baidu online AI competition - image processing challenge: the 8th program of handwriting erasure

二维码的前世今生 与 六大测试点梳理
![[course notes] Compilation Principle](/img/cc/34e86087cc5698f9bed91675369265.jpg)
[course notes] Compilation Principle

HCIA复习

把el-tree选中的数组转换为数组对象

SQLMAP使用教程(三)实战技巧二
随机推荐
《卓有成效的管理者》读书笔记
nodejs实现微博第三方登录
[Thesis code] SML part code reading
Raised a kitten
LeetCode 1200. 最小绝对差
Software test interview questions - Test Type
isam2运行流程
Investment strategy discussion and market scale prediction report of China's solid state high power amplifier industry from 2022 to 2028
Understanding of processes and threads
Seven imperceptible truths in software testing
通过修改style设置打印页样式
「 WEB测试工程师 」岗位一面总结
黑猫带你学UFS协议第4篇:UFS协议栈详解
[postman] the monitors monitoring API can run periodically
IP day 16 VLAN MPLS configuration
P问题、NP问题、NPC问题、NP-hard问题详解
Basic knowledge of error
Reading notes of effective managers
Application du Groupe Li dans gtsam
[postman] collections configuration running process