[会写代码的健身爱好者成长史]之JWT

1.什么是jwt

jwt 全称 json web token,通过数组签名的方式,以json作为载体,在不同的服务之前进行安全的传输信息

2.jwt有什么作用

jwt最常见的场景就是授权认证,一旦用户登录之后,后续的每一次请求都会包含jwt,系统在每一次用户请求之前都会验证jwt,通过后在进行处理

3.JWT的组成

JWT由3部分组成,用"."号分割。

1.header

jwt的header承载两部分信息,一个是声明的类型(jwt),一个是声明算法的类型,会将头部header进行base64进行加密

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

base64加密

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

2.payload

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

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

然后还是进行base64加密

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

3.signature

jwt第三部分就是一个签名信息,签名信息也是由3部分组成

1.header的base64加密

2.payload的base64加密

3.secret

这部分首先由base64加密后的header和base64加密后的payload用“ .  ”号连接起来的字符串,然后通过header中的声明的加密算法进行加密,最后就构成了jwt的第三部分

 4.代码实现基本使用

public static String jwt(){
        JwtBuilder jwtBuilder = Jwts.builder();
        String jwt  = jwtBuilder
                //header
                .setHeaderParam("typ", "jwt")
                .setHeaderParam("alg", "HS256")
                //payload
                .claim("userName","jack")
                .claim("role","admin")
                .setSubject("jwt_test")
                //过期时间
                .setExpiration(new Date(System.currentTimeMillis()+1000*60*60*24L))
                .setId(UUID.randomUUID().toString())
                //signature
                //加密的时候根据这个key(abcdefg!@#$)进行加密
                .signWith(SignatureAlgorithm.HS256,"abcdefg!@#$")
                //将header,payload,signature拼接起来
                .compact();
        return jwt;
    }

    public static void main(String[] args) {

        String jwtToken = jwt();
        System.out.println("jwt---->"+jwtToken);
        //解密
        JwtParser jwtParser = Jwts.parser();
        //根据签名对jwtToken进行解析
        Jws<Claims> claimsJws = jwtParser.setSigningKey("abcdefg!@#$").parseClaimsJws(jwtToken);
        //解析完成之后会拿到这个body,里面就是之前加密之前的一些数据
        Claims body = claimsJws.getBody();
        System.out.println(body.getId());
        System.out.println(body.get("userName"));
        System.out.println(body.getExpiration());
        System.out.println(body.getSubject());
        System.out.println(body);

    }

代码运行结果:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值