上一篇我们讲解了 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 实战的更多相关文章

  1. JWT实战

    JWT实战 2018年03月02日 22:36:21 阅读数:129 JWT认证流程 先来回顾下JWT的流程,jwt是存储在客户端的,服务器不需要存储jwt;客户端每次发送请求时携带token,然后到 ...

  2. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_4-3.登录检验JWT实战之封装通用方法

    笔记 3.登录检验JWT实战之封装通用方法     讲解:引入相关依赖并开发JWT工具类 1.加入相关依赖 <!-- JWT相关 -->             <dependenc ...

  3. JWT实战:使用axios+PHP实现登录认证

    上一篇文中,我们学习了什么是JWT(Json Web Token),今天我们来结合实例给大家讲述JWT的实战应用,就是如何使用前端Axios与后端PHP实现用户登录鉴权认证的过程. 查看演示 下载源码 ...

  4. SpringBoot整合JWT实战详解

    jwt 介绍就不多说了,下面通过代码演示开发过程中jwt 的使用. (1)在pom.xml中引入对应的jar <dependency> <groupId>io.jsonwebt ...

  5. 基于JWT(Json Web Token)的ASP.NET Web API授权方式

    token应用流程 初次登录:用户初次登录,输入用户名密码 密码验证:服务器从数据库取出用户名和密码进行验证 生成JWT:服务器端验证通过,根据从数据库返回的信息,以及预设规则,生成JWT 返还JWT ...

  6. jwt揭秘(含源码示例和视频)

    JSON Web Tokens,是一种开发的行业标准 RFC 7519 ,用于安全的表示双方之间的声明.目前,jwt广泛应用在系统的用户认证方面,特别是现在前后端分离项目. 1. jwt认证流程 在项 ...

  7. jwt揭秘(含源码示例)

      JSON Web Tokens,是一种开发的行业标准 RFC 7519 ,用于安全的表示双方之间的声明.目前,jwt广泛应用在系统的用户认证方面,特别是现在前后端分离项目. 1. jwt认证流程 ...

  8. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_汇总

    2018年Spring Boot 2.x整合微信支付在线教育网站高级项目实战视频课程 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-1.SpringBoot整合微信支付开发在 ...

  9. 什么是JWT(Json Web Token)

    什么是 JWT (Json Web Token) 用户认证是计算机安全领域一个永恒的热点话题. JWT 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519). 该to ...

随机推荐

  1. git merge 与 git rebase的区别?

    一,git merge 与 git rebase的区别 1,git merge 例如: master分支合并dev分支,git将两个分支dev和master上的所有commit , 按照提交时间的先后 ...

  2. go mod 使用bee工具

    https://github.com/beego/bee/releases bee  windows https://github.com/beego/bee/releases/download/v1 ...

  3. linux(centos8):用uniq去除文本中重复的行(去重)

    一,uniq命令的用途 1, 作用: 从输入文件或标准输入中找到相邻的匹配行, 并写入到输出文件或标准输出 2, 使用时通常会搭配sort使用 说明:刘宏缔的架构森林是一个专注架构的博客,地址:htt ...

  4. node的function函数和路由代码的小例子

    1.node事件循环 事件: const events=require("events"); emt=new events.EventEmitter(); function eve ...

  5. centos7安装oracle版本的jdk

    Hadoop机器上的JDK,最好是Oracle的Java JDK,不然会有一些问题,比如可能没有JPS命令. 如果安装了其他版本的JDK,卸载掉!!! 1,查看是否已经安装了jdk java -ver ...

  6. vue响应式原理整理

    vue是数据响应性,这是很酷的一个地方.本文只为理清逻辑.详细请看官方文档 https://cn.vuejs.org/v2/guide/reactivity.html vue的data在处理数据时候, ...

  7. 支持向量机(SVM)必备概念(凸集和凸函数,凸优化问题,软间隔,核函数,拉格朗日乘子法,对偶问题,slater条件、KKT条件)

    SVM目前被认为是最好的现成的分类器,SVM整个原理的推导过程也很是复杂啊,其中涉及到很多概念,如:凸集和凸函数,凸优化问题,软间隔,核函数,拉格朗日乘子法,对偶问题,slater条件.KKT条件还有 ...

  8. java前后端开发需掌握的框架及技术

    一.Java开发 1.J2EE架构及主流框架,spring4.spring boot.spring MVC.spring Security.spring cloud.struct2.hibernate ...

  9. JUC---08ForkJion(分支合并)

    一.什么是ForkJion Fork/Join框架是Java7提供的并行执行任务框架,思想是将大任务分解成小任务,然后小任务又可以继续分解,然后每个小任务分别计算出结果再合并起来,最后将汇总的结果作为 ...

  10. 用GitHub Pages搭建博客(二)

    本篇介绍基本GitHub Pages的搭建流程 GitHub账号及仓库创建 登录GitHub,录入用户名.邮箱.密码,创建成功后登录进入. 注册时,邮箱建议不使用QQ邮箱.因为一些第三方部署类网站不支 ...