JWT鉴权

一、JWT

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。

一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。

1.头部(Header)

头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以被表示成一个JSON对象。这也可以被表示成一个JSON对象。{"typ":"JWT","alg":"HS256"}。在头部指明了签名算法是HS256算法。 我们进行BASE64编码base64 转图片 在线解码编码,编码后的字符串如下:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

2.载荷(playload)

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

定义一个payload:

{"sub":"1231567890","name":"John Doe","admin":true}

然后将其进行base64加密,得到Jwt的第二部分。

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG1gRG9lIiwiYWRtaW1iOnRydWV9

3.签证(signature)

jwt的第三部分是一个签证信息,这个签证信息由三部分组成:

header (base64后的)

payload (base64后的)

secret

这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

将这三部分用.连接成一个完整的字符串,构成了最终的jwt:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG1gRG9lIiwiYWRtaW1iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

二、JJWT签发与验证token

1.创建token

创建一个maven项目,在pom.xml文件中导入依赖

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

创建测试类,代码如下

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

import java.util.Date;

/**
 * 创建token
 */
public class JwtTest1 {
    public static void main(String[] args) {
        JwtBuilder builder = Jwts.builder().setId("888") //设置唯一编号
                .setSubject("小白") //设置主题  可以是JSON数据
                .setIssuedAt(new Date()) //设置签发日期
                .signWith(SignatureAlgorithm.HS256, "itcast");
        //设置签名 使用HS256算法,并设置SecretKey(字符串) //构建 并返回一个字符串
        System.out.println(builder.compact());
    }
}

2.解析token

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;

/**
 * 解析token
 */
public class JwtTest2 {
    public static void main(String[] args) {
        String compactJwt = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE3MjI0MDc1NDd9.veykODIHFPGuLo0hxov51MoVPRqoQWRws5zjA5aPyHE";
        Claims claims = Jwts.parser().setSigningKey("itcast").parseClaimsJws(compactJwt).getBody();
        System.out.println(claims);
    }
}

3.设置过期时间

创建token 并设置过期时间
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

/**
 * 创建token 并设置过期时间
 */
public class JwtTest3 {
    public static void main(String[] args) {
        //当前时间
        Date date = new Date();
        Date dateOut = new Date(date.getTime() + 1000 * 30);
        JwtBuilder builder = Jwts.builder().setId("888") //设置唯一编号
                .setSubject("小白")//设置主题  可以是JSON数据
                .setIssuedAt(date)//设置签发日期
                .setExpiration(dateOut)//用于设置过期时间 ,参数为Date类型数据
                .signWith(SignatureAlgorithm.HS256, "itcast");//设置签名 使用HS256算法,并设置SecretKey(字符串) //构建 并返回一个字符串
        System.out.println(builder.compact());
    }
}
解析TOKEN
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;

/**
 * 解析TOKEN
 */
public class JwtTest4 {
    public static void main(String[] args) {
        String compactJwt = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE3MjI0MTExNTIsImV4cCI6MTcyMjQxMTE4Mn0.WdnGg_5TSLHAjV0VYAuZE4Nr9JqP6ZpTOTPz6oyXIpk";
        Claims claims = Jwts.parser().setSigningKey("itcast").parseClaimsJws(compactJwt).getBody();
        System.out.println(claims);
    }
}

4.自定义claims

创建token
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 创建token
 */
public class JwtTest5 {
    public static void main(String[] args) {
        //当前时间
        Date date = new Date();
        Date dateOut = new Date(date.getTime() + 1000 * 15);
        Map m = new HashMap();
        m.put("name", "itcast");
        m.put("age", 18);
        m.put("sex", "man");
        JwtBuilder builder = Jwts.builder().setId("888") //设置唯一编号
                .setSubject("小白")//设置主题  可以是JSON数据
                .setIssuedAt(date)//设置签发日期
                .setExpiration(dateOut)//用于设置过期时间 ,参数为Date类型数据
                .setClaims(m)
                .signWith(SignatureAlgorithm.HS256, "itcast");//设置签名 使用HS256算法,并设置SecretKey(字符串) //构建 并返回一个字符串
        System.out.println(builder.compact());
    }
}
解析TOKEN
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;

/**
 * 解析TOKEN
 */
public class JwtTest6 {
    public static void main(String[] args) {
        String compactJwt = "eyJhbGciOiJIUzI1NiJ9.eyJzZXgiOiJtYW4iLCJuYW1lIjoiaXRjYXN0IiwiYWdlIjoxOH0.XH2y6-5qAJQ6Rzmyx9PKYwzY5FHXi_dhWRLsyCNLqHE";
        Claims claims = Jwts.parser().setSigningKey("itcast").parseClaimsJws(compactJwt).getBody();
        System.out.println(claims);
    }
}

三、创建JWTUtils工具类

package com.buka;

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

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

public class JwtUtils {
    public static String encrypt(Map map, Date dateOut) {
        //当前时间
        Date date = new Date();
        JwtBuilder builder = Jwts.builder().setId(UUID.randomUUID().toString()) //设置唯一编号
                .setSubject("JWT")//设置主题  可以是JSON数据
                .setIssuedAt(date)//设置签发日期
                .setExpiration(dateOut)//用于设置过期时间 ,参数为Date类型数据
                .setClaims(map)
                .signWith(SignatureAlgorithm.HS256, "itbuka");//设置签名 使用HS256算法,并设置SecretKey(字符串) //构建 并返回一个字符串
        return builder.compact();
    }

    public static Map decrypt( String compactJwt) {
        Claims claims = Jwts.parser().setSigningKey("itbuka").parseClaimsJws(compactJwt).getBody();
        return claims;
    }
}
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

HLJ洛神千羽

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

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

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

打赏作者

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

抵扣说明:

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

余额充值