JWT令牌的使用

1、什么是jwt

JWT (JSON Web Token) 是一种基于 JSON 的轻量级的开放标准(RFC 7519),用于在不同系统之间安全地传输信息。JWT 由三部分组成,分别是头部(Header)、载荷(Payload)和签名(Signature):

1. **头部(Header)**:包含了两部分信息,即令牌的类型(即JWT)和所使用的签名算法(例如HMAC SHA256或RSA)。

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

2. **载荷(Payload)**:也称为声明(claims),包含了需要传输的数据,例如用户的身份信息、权限等。载荷可以是公开的(Public Claims)、私有的(Private Claims)或注册的(Registered Claims)。它是关于用户和其他一些数据的 JSON 对象,例如:

   {
     "sub": "1234567890",
     "name": "John Doe",
     "admin": true
   }
   这里的载荷包含了用户的标识符(sub)、用户名(name)和是否是管理员(admin)等信息。

3. **签名(Signature)**:用于验证消息的完整性以及消息的发送者是否为预期的发送者。签名的生成需要使用头部、载荷和一个秘密(仅由服务器知道的密钥或私钥)进行加密,以防止被篡改。

2、JWT 优势

JWT 的优势在于它是一种轻量级的认证和授权机制,无需在服务端存储会话状态,而是通过在客户端存储令牌来实现认证和授权。这使得JWT非常适合于分布式系统和微服务架构中的身份验证和授权需求。

3、JWT 具有以下特点:

- **轻量级和紧凑性**:JWT 是一种紧凑且轻量级的传输格式,适合在 HTTP 和 HTML 环境下传输。

- **无状态性**:JWT 是无状态的,服务器不需要在其本地存储会话信息。所有的信息都被包含在 JWT 中,因此减轻了服务器的负担。

- **安全性**:通过使用签名来验证 JWT 的完整性,可以确保数据在传输过程中不被篡改。同时,JWT 也可以使用加密算法来保护其内容。

JWT 主要用于身份认证和信息传递,在 Web 应用中常用于跨域身份验证和单点登录(Single Sign-On,SSO)等场景。

2、使用jwt

1、导入坐标(注:这是在Test测试类下进行测试的)

<!--java-jwt坐标-->
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>4.4.0</version>
</dependency>

<!--单元测试的坐标-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>

2、创建jwt测试类

/**
 * JWT令牌生成
 */
@Test
public void testGen(){
    Map<String,Object> claims= new HashMap<>();
    claims.put("id",1);
    claims.put("username","张三");

    //生成jwt的代码
    String token = JWT.create()
            .withClaim("user",claims)//添加载荷
            .withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60*12))//添加过期时间
            .sign(Algorithm.HMAC256("zhang"));//指定算法,配置秘钥
    System.out.println(token);
}

3、 jwt解码

1、把生成的jwt令牌放入下面token里面解码,下面是解码成功的页面

2、如果篡改了头部和载荷部分的数据,那么验证失败 。

如果秘钥改了,验证失败 。

token过期,验证失败 。

/**
 * jwt解码
 */
@Test
public void testParse(){
    //定义字符串,模拟用户传过来的token
    String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9" +
            ".eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6IuW8oOS4iSJ9LCJleHAiOjE3MTA2MzE1NzJ9" +
            ".u3JavdMiaR4xCb7WQ8-0QZjVi3OqKhRrwD7KWFMlxMY";
    JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("zhang")).build();

    //验证token生成一个解析后的JWT对象
    DecodedJWT decodedJWT = jwtVerifier.verify(token);
    Map<String, Claim> claims = decodedJWT.getClaims();
    System.out.println(claims.get("user"));

    //如果篡改了头部和载荷部分的数据,那么验证失败
    //如果秘钥改了,验证失败
    //token过期
    // .withExpiresAt(new Date(System.currentTimeMillis()))//添加过期时间
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值