JWT入门

Posted 丶落幕

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JWT入门相关的知识,希望对你有一定的参考价值。


前言

JWT是什么

json web token

JWT能做什么

  1. 授权
  2. 认证

JWT结构

  1. 标头(Header)
    通常由两部分组成:令牌类型和签名算法
  2. 有效载荷(Payload)
    声明有关实体类(通常是用户)和其他数据声明
  3. 签名(Signature)
    使用编码后的Header和Payload以及我们提供的一个密匙,然后使用header中指定的签名算法进行签名
    Header和Payload不管哪一个被改动,都会导致Signature不一致
    因此JWT通常如下所示:xxxx.yyyy.zzzz Header.Payload.Signature

使用步骤

1.编写测试demo

代码如下(示例):

    @Test
    void contextLoads() {
        Map<String, Object> map = new HashMap<>();
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.MINUTE,30);
        String token = JWT.create()
                .withHeader(map)//header
                .withClaim("userId", 21)//payload
                .withClaim("username", "chen")
                .withExpiresAt(instance.getTime())//设置过期时间
                .sign(Algorithm.HMAC256("chen"));//签名,参数为签名算法,常用的就是hmac256
        System.out.println(token);
    }
    @Test
    void test(){
        //创建验证对象
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256("chen")).build();
        DecodedJWT verify = verifier.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MjI3MjAxODgsInVzZXJJZCI6MjEsInVzZXJuYW1lIjoiY2hlbiJ9.RPOrLT9lov5jBw5TJFfG3_zksEbSeTXUwfgn8bywH4o");
        System.out.println(verify.getClaim("userId").asInt());//不as也能取出来
        System.out.println(verify.getClaim("username").asString());
        System.out.println(verify.getExpiresAt());//剩余时间
    }

2.封装通用模板

代码如下(示例):

    private static final String SING = "~!@#$%^&";
    //生成token
    public static String getToken(Map<String,String> map){
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.DATE,7);//默认7天过期
        JWTCreator.Builder builder = JWT.create();
        //payload
        map.forEach((k,v)->{
            builder.withClaim(k, v);
        });
        //设置过期时间 and 加密
        return builder.withExpiresAt(instance.getTime()).sign(Algorithm.HMAC256(SING));

    }
    //验证token
    public static DecodedJWT verify(String token){
        return JWT.require(Algorithm.HMAC256(SING)).build().verify(token);
    }

总结

单体项目可以在拦截器中验证token
分布式可以在网关中进行校验

以上是关于JWT入门的主要内容,如果未能解决你的问题,请参考以下文章

JWT入门简介

JWT入门

jwt入门学习

JWT实战入门,

JWT入门 笔记

JWT快速入门