JWT 实战
上一篇我们讲解了 JWT 的基本原理和结构 你了解JWT吗?,接下来我们具体实战一下!
1. 引入依赖
<!--引入jwt-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
2. 编写工具类
@Slf4j
public class JwtUtils { private static final String SIGN = "!Q@WXDjksWE$"; /**
* 生成 Token header.payload.signature
*/
public static String getToken(Map<String, String> map) {
// 指定令牌的过期时间为 7 天
Calendar instance = Calendar.getInstance();
instance.add(Calendar.DATE, 7); // 创建 Jwt builder
JWTCreator.Builder builder = JWT.create(); // 循环添加 payload
map.forEach((k, v) -> builder.withClaim(k, v)); // 指定过期时间 签名 指定加密算法和密钥
String token = builder.withExpiresAt(instance.getTime()).sign(Algorithm.HMAC256(SIGN));
log.info("token = {}", token);
return token;
} /**
* 1)验证 Token 合法性【签名一样,token合法,过期校验】
* 2)如果 Token 校验过程中出现错误,直接抛异常
* - SignatureVerificationException: 签名不一致异常
* - TokenExpiredException: 令牌过期异常
* - AlgorithmMismatchException: 算法不匹配异常
* - InvalidClaimException: 失效的payload异常
*/
public static void verify(String token) {
JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
} /**
* 获取 token 中信息【先校验 token 合法性,然后再拿 token 中信息】
*/
public static DecodedJWT getTokenInfo(String token) {
DecodedJWT verify = JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
return verify;
} }
3. 测试用例
@SpringBootTest
@Slf4j
public class TestJwt { @Test
public void testJwt() {
/**
* JWT 中 header 默认就是 {"alg": "HS256", "typ": "JWT"} 一般不做改变
*/
HashMap<String, Object> map = new HashMap<>();
// 指定令牌的过期时间为 20s
Calendar instance = Calendar.getInstance();
instance.add(Calendar.SECOND, 1000); // 获取令牌
String token = JWT.create()
.withHeader(map)
.withClaim("userId", 21) // payload
.withClaim("username", "zhangsan") // payload
.withExpiresAt(instance.getTime()) // 指定令牌的过期时间
.sign(Algorithm.HMAC256("!Q@WXDjksWE$")); // 签名,指定加密算法和密钥 log.info("token = {}", token);
} @Test
public void testValid() {
// 创建验证对象
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("!Q@WXDjksWE$")).build(); // 校验,获取校验后的结果对象信息【需要将上一个 test 执行的 token 字符串传入,进行校验】
DecodedJWT verify = jwtVerifier.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MDMzMzU3NzUsInVzZXJJZCI6MjEsInVzZXJuYW1lIjoiemhhbmdzYW4ifQ.
bLzXG8-QpcwmQSEBEtkoZVBySG2XO5I462fFwTN8MLQ"); log.info("header = {}", verify.getHeader());
log.info("userId = {}, usernmae = {}", verify.getClaims().get("userId").asInt(), verify.getClaims().get("username").asString());
log.info("过期时间 = {}", verify.getExpiresAt());
} }
4. 执行结果

5. 总结
1)JWT (Json Web Token) 令牌格式:【token = head.payload.signature】
2)校验Token顺序:a. 校验签名算法是否一样; b. 校验签名是否一样【即:head patload secret 是否一样】;c. 校验Token是否有效【前后是否一致 equals】;d. 校验Token是否过期。
JWT 实战的更多相关文章
- JWT实战
JWT实战 2018年03月02日 22:36:21 阅读数:129 JWT认证流程 先来回顾下JWT的流程,jwt是存储在客户端的,服务器不需要存储jwt;客户端每次发送请求时携带token,然后到 ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_4-3.登录检验JWT实战之封装通用方法
笔记 3.登录检验JWT实战之封装通用方法 讲解:引入相关依赖并开发JWT工具类 1.加入相关依赖 <!-- JWT相关 --> <dependenc ...
- JWT实战:使用axios+PHP实现登录认证
上一篇文中,我们学习了什么是JWT(Json Web Token),今天我们来结合实例给大家讲述JWT的实战应用,就是如何使用前端Axios与后端PHP实现用户登录鉴权认证的过程. 查看演示 下载源码 ...
- SpringBoot整合JWT实战详解
jwt 介绍就不多说了,下面通过代码演示开发过程中jwt 的使用. (1)在pom.xml中引入对应的jar <dependency> <groupId>io.jsonwebt ...
- 基于JWT(Json Web Token)的ASP.NET Web API授权方式
token应用流程 初次登录:用户初次登录,输入用户名密码 密码验证:服务器从数据库取出用户名和密码进行验证 生成JWT:服务器端验证通过,根据从数据库返回的信息,以及预设规则,生成JWT 返还JWT ...
- jwt揭秘(含源码示例和视频)
JSON Web Tokens,是一种开发的行业标准 RFC 7519 ,用于安全的表示双方之间的声明.目前,jwt广泛应用在系统的用户认证方面,特别是现在前后端分离项目. 1. jwt认证流程 在项 ...
- jwt揭秘(含源码示例)
JSON Web Tokens,是一种开发的行业标准 RFC 7519 ,用于安全的表示双方之间的声明.目前,jwt广泛应用在系统的用户认证方面,特别是现在前后端分离项目. 1. jwt认证流程 ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_汇总
2018年Spring Boot 2.x整合微信支付在线教育网站高级项目实战视频课程 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-1.SpringBoot整合微信支付开发在 ...
- 什么是JWT(Json Web Token)
什么是 JWT (Json Web Token) 用户认证是计算机安全领域一个永恒的热点话题. JWT 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519). 该to ...
随机推荐
- springboot入门系列(三):SpringBoot教程之RabbitMQ示例
SpringBoot教程之RabbitMQ示例 SpringBoot框架已经提供了RabbitMQ的使用jar包,开发人员在使用RabbitMQ的时候只需要引用jar包简单的配置一下就可以使用Rabb ...
- Typora图片一键传——picgo使用兰空图床
Typora picgo使用兰空图床 最近smms图床免费版的速度眼看着越来越慢,特别是到晚上,图片几乎是在原地打转,于是我想替换掉Typora中picgo默认使用的smms图床,网上的教程清一色地只 ...
- linux 查看nginx的安装路径等信息
做个随笔,记录一下. 想查看nginx的配置文件,但不知道nginx是安装在哪个目录下? ps -ef | grep nginx Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的 ...
- 小白也能看懂的JVM内存区域
前言 最近在准备面试题刷到了JVM这块,作为一个小白,巩固知识点最好的方式就是亲手写出来并分享:相信我的理解,同样是小白的你,一定有很大的帮助.不信,请你往下看! JVM内存区域简介 如果有人问Jav ...
- pyqt5为控件设置提示信息
# 显示控件提示消息 import sys from PyQt5.QtWidgets import QHBoxLayout,QMainWindow,QApplication,QToolTip,QPus ...
- C语言,产生一组数字,并将其写入txt文档中
#include<stdio.h> /*产生一组连续的数字,并将其写到txt文档中*/ /*说明:本程序在在win10 系统64位下用Dev-C++ 5.11版本编译器编译的*/int m ...
- GoSDK的安装及环境变量配置 入门详解 - 精简归纳
GoSDK的安装及环境变量配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 29 转载请注明出处!️ 目录 GoSDK的安装及环境变量配置 入门详解 - 精简归纳 一.进入G ...
- 群晖DS218+部署mysql
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- PHP定界符的用法
当面临大段的负责的文本输入的时候,建议使用定界符. 例如: $age = 28; $str = <<<cont 第一行数据 第二行数据 特殊字符 ' " asdf abc ...
- Python替换字符串中的空格
这是来源剑指offer的第二题,直接调用replace函数进行空格替换即可. 当我又想试试挨个字符比较进行替换时程序报错了: 错误原因是在python中字符串是一个不可变的数据类型,如果进行替换字符可 ...