深入了解java-jwt生成与校验

 更新时间:2019年06月14日 10:16:18   作者:fleyX  
这篇文章主要介绍了深入了解java-jwt生成与校验,Json web token(JWT)是为了网络应用环境间传递声明而执行的一种基于JSON的开发标准(RFC 7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登陆(SSO)场景。,需要的朋友可以参考下

什么是 JWT

这里是jwt 官方地址,想了解更多的可以在这里查看。

jwt 全称是JSON Web Token,从全称就可以看出 jwt 多用于认证方面的。这个东西定义了一种简洁的,自包含的,安全的方法用于通信双方以 json 对象的形式传递信息。其中简洁,安全,传递信息和 web 系统非常契合。

jwt 实际上就是一个字符串,由以下三个部分构成(通过.分隔):

  • Header 头部
  • Payload 负载
  • Signature 签名

因此一个 jwt 字符串都是如下的形式:

Header.Payload.Signature

Header

header 大多数情况下是只包含两个属性的 json 字符串,token 的类型(“JWT”)和用到的算法(比如 HS256,RS256,ES256 等)如下:

{
"alg": "HS256",
"typ": "JWT"
}

然后用 Base64 将其编码就等到了 jwt 的第一部分

Payload
payload 顾名思义用于携带数据的,这里的数据有三种类型:

  • Registered claims:一组预定义的声明,写在 jwt 标准中,所有对其的实现都要准守。但不是强制要求携带。有以下几个字段:iss(签发者),iat(创建时间),exp(过期时间),aud(签发者),sub(面向的用户)
  • public claims:随意定义,通常存放用户 id,用户类别等非铭感信息

这些数据也是 json 的形式,用 Base64 编码后就得到了 JWT 的第二个部分。

Signature

签名就是通过设定的秘钥和签名算法来对 header 和 payload 进行签名得到一个签名字符串,将这三个字符串组合起来就是 JWT 了。

java 中使用

通过java-jwt来实现,首先引入依赖:

<dependency>
<!-- 截止当前最新版本为3.7 -->
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.7.0</version>
</dependency>

签名

使用 HMC256,代码入下:

private static final Algorithm ALGORITHM= Algorithm.HMAC256("security");
public static String encode() {
//通过秘钥生成一个算法
String token = JWT.create()
//设置签发者
.withIssuer("test")
//设置过期时间为一个小时
.withExpiresAt(new Date(System.currentTimeMillis()+60*60*1000))
//设置用户信息
.withClaim("name","小明")
.withClaim("age",20)
.sign(ALGORITHM);
return token;
}

验证

验证代码如下:

//校验类
private static final JWTVerifier JWT_VERIFIER= JWT.require(ALGORITHM).withIssuer("test").build();
public static void decode(String token) {
DecodedJWT decodedJWT = JWT_VERIFIER.verify(token);
//如果校验失败会抛出异常
//payload可从decodeJWT中获取
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • springboot通过SchedulingConfigurer实现多定时任务注册及动态修改执行周期(示例详解)

    springboot通过SchedulingConfigurer实现多定时任务注册及动态修改执行周期(示例详解)

    这篇文章主要介绍了springboot通过SchedulingConfigurer实现多定时任务注册及动态修改执行周期,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Java AQS 线程安全同步队列的实现

    Java AQS 线程安全同步队列的实现

    AQS 同步队列是很多的 Java 线程安全对象的实现,例如 ReentrantLock, Semaphore, CountDownLatch, ReentrantReadWriteLock 等等,本文就介绍了Java AQS 线程安全同步队列的实现,感兴趣的可以了解一下
    2023-08-08
  • Springcloud整合stream,rabbitmq实现消息驱动功能

    Springcloud整合stream,rabbitmq实现消息驱动功能

    官方定义SpringCloud Stream 是一个构建消息驱动微服务的框架。我们只需要搞清楚如何与Spring Cloud Stream 交互就可以方便使用消息驱动的方式。本文将通过Springcloud整合stream,rabbitmq实现消息驱动功能,需要的可以参考一下
    2022-02-02
  • Java日常练习题,每天进步一点点(24)

    Java日常练习题,每天进步一点点(24)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • Java中如何避免sql注入实例详解

    Java中如何避免sql注入实例详解

    SQL注入是最常见的攻击方式之一,它不是利用操作系统或其它系统的漏洞来实现攻击的,而是程序员因为没有做好判断,被不法用户钻了SQL的空子,下面这篇文章主要给大家介绍了关于Java中如何避免sql注入的相关资料,需要的朋友可以参考下
    2022-01-01
  • clickhouse 批量插入数据及ClickHouse常用命令详解

    clickhouse 批量插入数据及ClickHouse常用命令详解

    这篇文章主要介绍了clickhouse 批量插入数据及ClickHouse常用命令,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • idea 修改项目名和module名称的操作

    idea 修改项目名和module名称的操作

    这篇文章主要介绍了idea 修改项目名和module名称的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 如何通过XML方式配置AOP过程解析

    如何通过XML方式配置AOP过程解析

    这篇文章主要介绍了如何通过XML方式配置AOP过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • JavaSE实现电影院系统

    JavaSE实现电影院系统

    这篇文章主要为大家详细介绍了JavaSE实现电影院系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Springmvc如何返回xml及json格式数据

    Springmvc如何返回xml及json格式数据

    这篇文章主要介绍了Springmvc如何返回xml及json格式数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09

最新评论