生成JWT
解析JWT
第一步:创建SpringBoot项目
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <version>1.18.22</version>
- </dependency>
- <dependency>
- <groupId>io.jsonwebtoken</groupId>
- <artifactId>jjwt-api</artifactId>
- <version>0.11.2</version>
- </dependency>
- <dependency>
- <groupId>io.jsonwebtoken</groupId>
- <artifactId>jjwt-impl</artifactId>
- <version>0.11.2</version>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>io.jsonwebtoken</groupId>
- <artifactId>jjwt-jackson</artifactId>
- <version>0.11.2</version>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-security</artifactId>
- </dependency>
复制代码
- <code>jwt:
- # 为JWT基础信息加密和解密的密钥,长度需要大于等于43
- # 在实际生产中通常不直接写在配置文件里面。而是通过应用的启动参数传递,并且需要定期修改
- secret: oQZSeguYloAPAmKwvKqqnifiQatxMEPNOvtwPsCLasd
- # JWT令牌的有效时间,单位秒,默认2周
- expiration: 1209600
- header: Authorization
- prefix: hc
复制代码
第二步:创建JWT工具类
复制代码 第三步:SpringSecurity配置文件注入PasswordEncoder
- @Configuration
- public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
- @Bean
- public PasswordEncoder passwordEncoder() {
- return new BCryptPasswordEncoder();
- }
- }
复制代码
第四步:工具类测试
- @SpringBootTest
- public class JwtUtilTest {
- @Resource
- private JwtUtil jwtUtil;
- @Resource
- private PasswordEncoder passwordEncoder;
- @Test
- void fun(){
- System.out.println(passwordEncoder);
- SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);
- System.out.println(secretKey);
- }
- //生成token
- @Test
- void generateToken(){
- //用户信息
- String encode = passwordEncoder.encode("1234");
- User user = new User("zhangsan", encode, AuthorityUtils.createAuthorityList());
- String token = jwtUtil.generateToken(user);
- System.out.println(token);
- }
- @Test
- void getClaimsFromToken(){
- //用户信息
- String encode = passwordEncoder.encode("1234");
- User user = new User("zhangsan", encode, AuthorityUtils.createAuthorityList());
- String token = jwtUtil.generateToken(user);
- System.out.println(token);
- Claims claims = jwtUtil.getClaimsFromToken(token);
- System.out.println(claims);
- }
- @Test
- void getSubjectFromToken(){
- //用户信息
- String encode = passwordEncoder.encode("1234");
- User user = new User("zhangsan", encode, AuthorityUtils.createAuthorityList());
- String token = jwtUtil.generateToken(user);
- System.out.println(token);
- String username = jwtUtil.getSubjectFromToken(token);
- System.out.println(username);
- }
- @Test
- void getExpirationFromToken(){
- //用户信息
- String encode = passwordEncoder.encode("1234");
- User user = new User("zhangsan", encode, AuthorityUtils.createAuthorityList());
- String token = jwtUtil.generateToken(user);
- System.out.println(token);
- Date date = jwtUtil.getExpirationFromToken(token);
- System.out.println(new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(date));
- }
- @Test
- void isTokenExpired(){
- //用户信息
- String encode = passwordEncoder.encode("1234");
- User user = new User("zhangsan", encode, AuthorityUtils.createAuthorityList());
- String token = jwtUtil.generateToken(user);
- System.out.println(token);
- Boolean res = jwtUtil.isTokenExpired(token);
- System.out.println(res);
- }
- @Test
- void validateToken(){
- //用户信息
- String encode = passwordEncoder.encode("1234");
- User user = new User("zhangsan", encode, AuthorityUtils.createAuthorityList());
- String token = jwtUtil.generateToken(user);
- System.out.println(token);
- User user2 = new User("zhangsan", "", AuthorityUtils.createAuthorityList());
- Boolean res = jwtUtil.validateToken(token,user2);
- System.out.println(res);
- }
- //模拟篡改
- @Test
- void fake(){
- // 将我改成你生成的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));
- //用户信息
- String encode = passwordEncoder.encode("1234");
- User user = new User("zhangsan", encode, AuthorityUtils.createAuthorityList());
- // 测试6: 这是一个被篡改的token,因此会报异常,说明JWT是安全的
- jwtUtil.validateToken("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJpYXQiOjE1NjU1ODk3MzIsImV4cCI6MTU2Njc5OTMzMn0.nDv25ex7XuTlmXgNzGX46LqMZItVFyNHQpmL9UQf-aUx",user);
- }
- }
复制代码
来源:https://blog.caogenba.net/lianghecai52171314/article/details/122429240
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |