JWT入门

目录

JWT与TOKEN联系

1.JWT简介

2.JWT用处

3.JWT组成

4.例子


JWT与TOKEN联系

JWT(JSON Web Token)是一种基于 JSON 格式的轻量级安全令牌,通常用于在网络应用间安全地传递信息。而“token”一词则是一个更广泛的术语,用来指代任何形式的令牌,用于在计算机系统中进行身份验证或授权。JWT 是 token 的一种具体实现方式,提供了一种基于 JSON 结构的令牌标准,用于在客户端和服务器之间传递信息,并在许多网络应用中广泛使用。

1.JWT简介

Json Web Token,通过数字签名的方式,以JSON对象为载体,不需中间服务器验证的情况下,允许在源和接收方之间可靠传输,确保信息的完整性和真实性

2.JWT用处

授权认证,一旦用户登录,后续每个请求都包含有JWT,系统在每次处理请求之前,都先进行JWT安全校验。

3.JWT组成

由3部分组成,用"."拼接

三部分分别是:

  • Header

    • token类型

    • 加密算法名称

  • Payload 载荷,存放有效信息

    • 标准中注册的声明 ---信息安全的分类

    • 公共的声明

    • 私有的声明

  • Signature 签名

    • 将加密后的Header和加密后的Payload用点拼接,再将结果通过header中声明的加密算法进行加密

4.例子

        <!--jwt依赖-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>       

package com.jwt;

import com.sun.javafx.binding.StringFormatter;
import io.jsonwebtoken.*;

import java.util.Date;
import java.util.UUID;

public class Test {

    // 24h
    private long time = 1000 * 60 * 60 * 24;
    private String signature = "admin";
    /**
     * 测试JWT令牌的生成和配置。
     * 使用JJWT库创建一个包含特定头部、载荷和签名的JWT令牌。
     * 头部配置了令牌的类型和算法。
     * 载荷包含了用户名、密码和主题等信息。
     * 设置了令牌的过期时间和唯一标识。
     * 使用HS256算法对令牌进行签名以确保完整性。
     */
    @org.junit.Test
    public void jwtTest() {
        // 创建JWT令牌构建器
        JwtBuilder jwtBuilder = Jwts.builder();
        // 构建并配置JWT令牌
        String jwtToken = jwtBuilder
                // 设置头部参数,定义令牌类型和算法
                // header
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS256")
                // 设置载荷信息,包含用户名和密码
                // payload
                .claim("username", "admin")
                .claim("password", "123456")
                // 设置主题
                .setSubject("admin-Test")
                // 设置令牌过期时间
                .setExpiration(new Date(System.currentTimeMillis() + time))
                // 设置令牌的唯一标识
                .setId(UUID.randomUUID().toString())
                // 设置令牌的发行时间
                .setIssuedAt(new Date())
                // 使用HS256算法和签名密钥对令牌进行签名
                // signature
                .signWith(SignatureAlgorithm.HS256, signature)
                // 将令牌紧凑化为最终的字符串表示形式
                .compact();
        System.out.println(jwtToken);
    }
    /**
     * 解析JWT令牌。
     * 该方法演示了如何使用JJWT库解析一个JWT令牌,并从中提取出声明信息。
     * JWT令牌被设计为一种安全的数据传输方式,其中包含了用户信息或其他需要传递给服务端的信息。
     * 在这个例子中,我们解析令牌以获取用户名、密码、令牌ID、主题和过期时间等信息。
     */
    @org.junit.Test
    public void parse(){
        // 定义一个JWT令牌字符串
        String jwtToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiIxMjM0NTYiLCJzdWIiOiJhZG1pbi1UZXN0IiwiZXhwIjoxNzE5ODM1Mzc4LCJqdGkiOiJiOGI2M2QxYy1iODhiLTQ4MDAtOWEyYi0yOTVkY2Q3NDNjMTQiLCJpYXQiOjE3MTk3NDg5Nzh9.Espy5I1IjwuPmnkHx-6TTie_VUP2zLDnasxfNDilclI";

        // 创建JWT解析器
        JwtParser jwtParser = Jwts.parser();

        // 设置解析器的签名密钥,并解析JWT令牌为Jws<Claims>对象
        Jws<Claims> claimsJws = jwtParser.setSigningKey(signature)
                .parseClaimsJws(jwtToken);

        // 提取声明信息
        Claims claims = claimsJws.getBody();

        // 打印提取的声明信息:用户名、密码、令牌ID、主题和过期时间
        System.out.println(claims.get("username"));
        System.out.println(claims.get("password"));
        System.out.println(claims.getId());
        System.out.println(claims.getSubject());
        System.out.println(claims.getExpiration());
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伏颜.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值