JWT毕设学习笔记

鉴于做毕设,本人学习了一下JWT,防止遗忘,做此笔记;

首先就是:什么是JWT(JSON Web Token)?

它一个轻量级的认证规范,这个规范允许使用JWT在用户和服务器之间传递安全可靠的信息。其本质是一个token,是一种紧凑的URL安全方法,用于在网络通信的双方之间传递。

其次是 :JWT长什么样?

eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJjZXNoaSIsImNyZWF0ZWQiOjE2NzY0NTcyNTY4MDYsImV4cCI6MTY3NjUwMDQ1Nn0.Bq1SK4hf5eKCfmqI0-hCOHFbl60RHMWRNZLe2IjmLukMoAylwVIe_TVL2nXinN9C0y5XFiJtYq8l1hV2L2uK9w

他是一个字符串,由头部、载荷与签名三部分组成,并由.分割

头部是描述JWT的基本信息,包含了所用的算法和类型

例如:

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

我们对此字符串使用Base64进行编码得到:

 public static void main(String[] args) {
        String str = "{\"typ\":\"JWT\",\"alg\":\"HS256\"}\n";
        String encode = Base64.getEncoder().encodeToString(str.getBytes());
        System.out.println(encode);
    }
     eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9Cg==

载荷是存放有用信息的地方。

{"sub":"123456","name":"成长的小猿","admin":true}

我们对此字符串使用Base64进行编码得到:

 public static void main(String[] args) {
        String str = "{\"sub\":\"123456\",\"name\":\"成长的小猿\",\"admin\":true}";
        String encode = Base64.getEncoder().encodeToString(str.getBytes());
        System.out.println(encode);
    }
eyJzdWIiOiIxMjM0NTYiLCJuYW1lIjoi5oiQ6ZW/55qE5bCP54y/IiwiYWRtaW4iOnRydWV9

第三部分是签证;

secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以secret就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了

接下来就要使用JWT了

引入依赖:

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

JWT工具类

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;

public class JWTUtil {

    // 有效期
    public static final Long JWT_TTL = 30*60*1000L;

    // JWT令牌信息
    public static final String JWT_KEY = "chengzhangdexiaoyuan";

    public static String createJWT(String id, String subject, Long ttlMillis) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);

        if (ttlMillis == null) {
            ttlMillis = JWT_TTL;
        }

        long expMillis = nowMillis + ttlMillis;
        Date expDate = new Date(expMillis);

        SecretKey secretKey = generalKey();

        JwtBuilder builder = Jwts.builder()
                .setId(id)                      // 设置唯一编号
                .setSubject(subject)            // 设置主题 可以是JSON数据
                .setIssuer("admin")
                .setIssuedAt(now)               // 设置签发日期
                .setExpiration(expDate)         // 设置过期时间
                // 设置签名 使用HS256算法 并设置SecretKey(字符串)
                .signWith(SignatureAlgorithm.HS256, secretKey);
        return builder.compact();


    }

    /**
     * 生成加密secretKey
     * @return
     */
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.getEncoder().encode(JWT_KEY.getBytes());
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }

    /**
     * 解析令牌数据
     */
    public static Claims parseJWT(String jwt) throws Exception {
        SecretKey secretKey = generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值