JWT 使用入门(一)配置与示例

官网链接:https://github.com/jwtk/jjwt

1、用途✨

JWT主要作用分为以下两种:

  • 1:作为在前后端分离项目中的登录策略
  • 2:单纯作为客户端的请求身份认证,spring-gateway网关进行判断拦截

这里我仅讲解第二种!第一种见链接:

2、实现流程👀

  • 1:服务方编写代码生成token,记录token给消费方
  • 2:消费方每次发来的请求,都要携带该token
  • 3:服务方部署网关对消费方发送来的token进行解密,判断是否有效:有效放行到服务端,否则进行拦截

注:这种不需要存储在服务端的认证方式时无状态认证方式,不同于session+cookie的有状态认证方式,其中好处主要为以下几点:

  • 客户端请求不依赖服务端的信息,多次请求不需要必须访问到同一台服务器
  • 减小服务端存储压力

3、JWT介绍

JWT,全称是Json Web Token, 是一种JSON风格的轻量级的授权和身份认证规范,可实现无状态、分布式的Web应用授权!

3.1、构成

JWT是由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串。第一部分我们称它为头部(header),第二部分我们称其为载荷(payload),第三部分是签证(signature).

3.1.1、header

JWT头部分是一个描述JWT元数据的JSON对象,通常如下所示:

{
  "alg": "HS256",
}

在这里插入图片描述
有的文章说还包含:typ属性表示令牌的类型,JWT令牌统一写为JWT,但是我打印的如上图只有alg。

3.1.2、载荷

一共有7个字段可以设置,如下:

iss: jwt签发者
sub: jwt所面向,使用jwt的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须大于签发时间
nbf: 定义在指定时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击

另外,可以自定义一些字段,如下:

{
  "admin": true
}

3.1.3、签证

生成语法:

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

注:其中secret是密钥,不可泄漏,并且其生成也用到了头部信息和载荷信息。

JWT解析地址:https://jwt.io/#libraries

4、java实现

4.1、引入依赖

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.0</version>
</dependency>

4.2、测试案例

生成代码:

package org.example;

import io.jsonwebtoken.*;
import io.jsonwebtoken.impl.Base64Codec;

import java.util.Date;

// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {
    public static void main(String[] args) {
        // Press Alt+Enter with your caret at the highlighted text to see how
        // IntelliJ IDEA suggests fixing it.

        //testJwt();
        generateJwtToken();
        testParseToken();

    }

    /** 测试生成token1 */
    public static void testJwt() {
        JwtBuilder jwtBuilder = Jwts.builder()
                // 唯一ID {"":""}
                .setId("888")
                // 接受的用户 {"sub":"Rose"}
                .setSubject("Rose")
                // 签发时间 {"iat":"。。。"}
                .setIssuedAt(new Date())
                // 签名算法 及秘钥
                .signWith(SignatureAlgorithm.HS256, "aVBhbkUxcEEyc1dvMmRCeVpM");
        // 签发token
        String token = jwtBuilder.compact();
        System.out.println(token);

        String[] split = token.split("\\.");
        // 头部
        System.out.println(Base64Codec.BASE64.decodeToString(split[0]));
        // 载荷
        System.out.println(Base64Codec.BASE64.decodeToString(split[1]));
        // 算法及秘钥 这个会乱码
        System.out.println(Base64Codec.BASE64.decodeToString(split[2]));
        
    }
	 /** 测试生成token2 */
    public static String generateJwtToken(){
 
        // 头部 map / Jwt的头部承载,第一部分
        // 可不设置 默认格式是{"alg":"HS256"}
        Map<String, Object> map = new HashMap<>();
            map.put("alg", "HS256");
            map.put("typ", "JWT");
 
 
        //载荷 map / Jwt的载荷,第二部分
        Map<String,Object> claims = new HashMap<String,Object>();
 
            //私有声明 / 自定义数据,根据业务需要添加
            claims.put("id","123456");
            claims.put("userName", "admin");
 
            //标准中注册的声明 (建议但不强制使用)
            //一旦写标准声明赋值之后,就会覆盖了那些标准的声明
            claims.put("iss", jwt_iss);
            /*	iss: jwt签发者
                sub: jwt所面向的用户
                aud: 接收jwt的一方
                exp: jwt的过期时间,这个过期时间必须要大于签发时间
                nbf: 定义在什么时间之前,该jwt都是不可用的.
                iat: jwt的签发时间
                jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击
            */
 
 
        //下面就是在为payload添加各种标准声明和私有声明了
        return Jwts.builder() // 这里其实就是new一个JwtBuilder,设置jwt的body
                .setHeader(map)         // 头部信息
                .setClaims(claims)      // 载荷信息
                .setId(UUID.randomUUID().toString()) // 设置jti(JWT ID):是JWT的唯一标识,从而回避重放攻击。
                .setIssuedAt(new Date())       // 设置iat: jwt的签发时间
                .setExpiration(new Date(System.currentTimeMillis() + access_token_expiration * 1000)) // 设置exp:jwt过期时间
                .setSubject(subject)    //设置sub:代表这个jwt所面向的用户,所有人
                .signWith(SignatureAlgorithm.HS256, "aVBhbkUxcEEyc1dvMmRCeVpM");//设置签名:通过签名算法和秘钥生成签名
                .compact(); // 开始压缩为xxxxx.yyyyy.zzzzz 格式的jwt token
    }

    /** 解析token */
    public static void testParseToken() {
        String token = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiJSb3NlIiwiaWF0IjoxNjkwOTY1ODY3fQ.pT-fzrxquCmB5eLqIiPQfdow92c0ZJBHP79-W3KE898";
         //得到的是荷载
        Claims claims = (Claims) Jwts.parser()
                // 解析时的秘钥一定要和签发时秘钥相同,但是发现这了的秘钥为4-7个x都是可以成功解析的
                .setSigningKey("aVBhbkUxcEEyc1dvMmRCeVpM111")
                // .parse(token)
                .parseClaimsJws(token)
                .getBody();
        System.out.println(claims);
        // 得到的是头部
        JwsHeader test = Jwts.parser()
                // 解析时的秘钥一定要和签发时秘钥相同,但是发现这了的秘钥为4-7个x都是可以成功解析的
                .setSigningKey("aVBhbkUxcEEyc1dvMmRCeVpM111")
                // .parse(token)
                .parseClaimsJws(token)
                .getHeader();
        System.out.println(test);
    }
}

参考链接:
https://blog.csdn.net/qq_37138756/article/details/103499429

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个简单的 Java 代码示例,演示如何使用 JWT(JSON Web Token)。 首先,需要使用 Java JWT 库,该库提供了创建和验证 JWT 的 API。可以使用 Maven 或 Gradle 将该库添加到项目中。 ```xml <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.18.1</version> </dependency> ``` 接下来,可以使用以下代码创建和验证 JWT。 ```java import com.auth0.jwt.JWT; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.JWTVerificationException; import com.auth0.jwt.interfaces.DecodedJWT; import java.util.Date; public class JwtUtils { // JWT 有效期为 1 小时 private static final long EXPIRATION_TIME = 60 * 60 * 1000; // JWT 密钥 private static final String SECRET = "my-secret"; /** * 创建 JWT * * @param userId 用户 ID * @return JWT */ public static String createToken(long userId) { // JWT 过期时间 Date expireDate = new Date(System.currentTimeMillis() + EXPIRATION_TIME); // 构造 JWT return JWT.create() .withClaim("userId", userId) .withExpiresAt(expireDate) .sign(Algorithm.HMAC256(SECRET)); } /** * 验证 JWT * * @param token JWT * @return 是否验证通过 */ public static boolean verifyToken(String token) { try { DecodedJWT jwt = JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token); // 验证通过 return true; } catch (JWTVerificationException e) { // 验证失败 return false; } } /** * 获取 JWT 中的用户 ID * * @param token JWT * @return 用户 ID */ public static long getUserId(String token) { DecodedJWT jwt = JWT.decode(token); return jwt.getClaim("userId").asLong(); } } ``` 上述代码定义了一个 JwtUtils 类,其中包含三个方法: 1. `createToken(long userId)`:创建 JWT,其中 userId 是用户 ID。 2. `verifyToken(String token)`:验证 JWT,其中 token 是 JWT。 3. `getUserId(String token)`:从 JWT 中获取用户 ID,其中 token 是 JWT。 需要注意的是,上述代码中的密钥 "my-secret" 应该替换为一个更安全的密钥。此外,可以根据需要修改 JWT 的有效期和其他声明。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Studying_swz

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

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

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

打赏作者

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

抵扣说明:

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

余额充值