jwt生成token和token解析基础详解

 更新时间:2023年11月03日 09:59:01   作者:丰木  
这篇文章主要为大家介绍了jwt生成token和token解析基础,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

1.jwt结构

jwt生成到客户端(浏览器)的token包含"."分开的三个部分:

  • header(Base64Url编码过的)
  • payload(Base64Url编码过的)
  • signature

形如:xxxxx.yyyyy.zzzzz

1.1 例子:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiYW5keSIsImV4cCI6MTY1NTg5NzEwMCwiYWdlIjozMH0.32hfc-oBxGg2Lgk3QR48HCbadsbOfCUxexw9aiQ_FQk

拆为3部分:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.(header)

eyJuYW1lIjoiYW5keSIsImV4cCI6MTY1NTg5NzEwMCwiYWdlIjozMH0.(payload)

32hfc-oBxGg2Lgk3QR48HCbadsbOfCUxexw9aiQ_FQk(signature)

2.header+payload+signature介绍

2.1 header

上面的header部分:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9base64Url解码后:

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

通常说明token的类型、生成token所使用的的算法

The header typically consists of two parts: the type of the token, which is JWT, and the signing algorithm being used, such as HMAC SHA256 or RSA.

2.2 Payload

上面的Payload部分:eyJuYW1lIjoiYW5keSIsImV4cCI6MTY1NTg5NzEwMCwiYWdlIjozMH0base64Url解码后:

{
  "name": "andy",
  "exp": 1655897100,
  "age": 30
}

通常是要客户端请求时带货的内容(比如用户名,比如是否是管理员等,server端生成的时候可以定义内容,形式如map)

The second part of the token is the payload, which contains the claims. Claims are statements about an entity (typically, the user) and additional data. There are three types of claims: registered, public, and private claims.

2.3 Signature

上面的Signature部分:32hfc-oBxGg2Lgk3QR48HCbadsbOfCUxexw9aiQ_FQk它是用来验签的, 验证是否被客户端修改过,它的生成逻辑如下:
就是使用header部分的base64Url、payload部分的base64Url部分、小圆点、以及你的私钥密码,使用指定的算法生成的;因为有密码, 所以是安全的,这也是密码要保护好的原因。

计算逻辑如下:

HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
12345
)

3. java测试用例

/**
     * JWT加密生成token, payload中保存 name/age
     */
    @Test
    public void testJwtToken() {
        // 加密秘钥
        final String SECRET = "12345";

        Calendar c = Calendar.getInstance();
        c.add(Calendar.HOUR, 2);

        String token = JWT.create().withClaim("name", "andy")
                .withClaim("age", 30)
                .withExpiresAt(c.getTime())
                .sign(Algorithm.HMAC256(SECRET));

        System.out.println(token);
    }

    /**
     * JWT解密生成token, 读取payload中保存的 name/age
     */
    @Test
    public void testJwtVerify() {

        String jwtToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiYW5keSIsImV4cCI6MTY1NTg4ODk3MiwiYWdlIjozMH0.LU4AQJkld03kDhatkiiArSJI4liGiANArTvoyswzk5I";
        final String SECRET = "12345";

        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
        DecodedJWT decodedJWT = verifier.verify(jwtToken);
        Claim name = decodedJWT.getClaim("name");
        Claim age = decodedJWT.getClaim("age");
        System.out.println(name);
        System.out.println(age);

    }

以上就是jwt生成token和token解析基础的详细内容,更多关于jwt生成token的资料请关注脚本之家其它相关文章!

相关文章

  • Spring boot异步任务原理全面分析

    Spring boot异步任务原理全面分析

    这篇文章主要介绍了Spring boot异步任务原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Centos中yum方式安装java的实现示例

    Centos中yum方式安装java的实现示例

    这篇文章主要介绍了Centos中yum方式安装java的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 浅析Java和Scala中的Future

    浅析Java和Scala中的Future

    这篇文章主要介绍了Java和Scala中的Future的相关资料,需要的朋友可以参考下
    2017-10-10
  • Java中的事件处理机制详解

    Java中的事件处理机制详解

    这篇文章主要介绍了Java中的事件处理机制详解,Java事件处理是采取"委派事件模型",当事件发生时,产生事件的对象,会把此"信息"传递给"事件的监听者"处理,这里所说的"信息"实际上就是java.awt.event事件类库里某个类创建对象,把它称为"事件的对象",需要的朋友可以参考下
    2023-10-10
  • Java中从键盘输入多个整数的方法

    Java中从键盘输入多个整数的方法

    今天小编就为大家分享一篇Java中从键盘输入多个整数的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • SpringBoot中的事务配置管理详解

    SpringBoot中的事务配置管理详解

    这篇文章主要介绍了SpringBoot中的事务配置管理详解,Spring Boot 默认的事务规则是遇到运行异常(RuntimeException)和程序错误(Error)才会回滚,但是抛出SQLException就无法回滚了,需要的朋友可以参考下
    2024-01-01
  • SpringBoot 2.0 整合sharding-jdbc中间件实现数据分库分表

    SpringBoot 2.0 整合sharding-jdbc中间件实现数据分库分表

    这篇文章主要介绍了SpringBoot 2.0 整合sharding-jdbc中间件,实现数据分库分表,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-06-06
  • Java获取手机号码归属地的实现

    Java获取手机号码归属地的实现

    这篇文章主要介绍了Java获取手机号码归属地的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • SpringDataRedis简单使用示例代码

    SpringDataRedis简单使用示例代码

    这篇文章主要介绍了SpringDataRedis简单使用,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • java synchronized加载加锁-线程可重入详解及实例代码

    java synchronized加载加锁-线程可重入详解及实例代码

    这篇文章主要介绍了java synchronized加载加锁-线程可重入详解及实例代码的相关资料,需要的朋友可以参考下
    2017-02-02

最新评论