JWT实现Token会话校验

前述:

最近新项目,会话相关不是我搞的,但是比较好奇,就翻了翻,发现用到了JWT。
之前没听过更没用过。所以更好奇了。要扩充知识的广度。所以专门了解一下。

JWT是啥?

比较官方的表述是这样的:

JWT(JSON WEB TOKEN):JSON网络令牌,JWT是一个轻便的安全跨平台传输格式,定义了一个紧凑的自包含的方式在不同实体之间安全传输信息(JSON格式)。它是在Web环境下两个实体之间传输数据的一项标准。实际上传输的就是一个字符串。广义上讲JWT是一个标准的名称;狭义上JWT指的就是用来传递的那个token字符串

我的理解是:

JWT就是一个加密解密器,可以根据密钥将要加密的信息加密为一个AAAA.BBBB.CCCC格式的密文。我们可以拿这个密文作为token。也可以拿这个密文再调用JWT解密,获取被加密的信息。从而实现登陆生成token,再根据token获取会话信息的功能(token内存储了会话信息,所以即使服务器重启,也可以获取到会话信息)

JWT的结构

JWT主要有三部分,Header、Payload、Signature。

Head专业叫:标头。里面表明了令牌类型(我们肯定是JWT了),还有所使用的签名(sign)算法(如HS256)。会使用Base64将Head编码。

Payload专业叫:有效负载。其实就是以key、value的形式,存放了我们要存储的会话信息,如:userId,userName等。会使用Base64编码将Payload编码。

Signature就是:签名了。是将Head(编码后)+Payload(编码后)+密钥(自己定义的)。然后使用Head中定义的签名算法进行签名。这个就是保证JWT没被改变。就是加签、验签的概念。

JWT使用

Jar

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.4.0</version>
</dependency>

生成

    public static String createToken(Map<String, String> claims, String secret, Long expire) {
        try {
            if (claims == null || claims.size() == 0) {
                throw new RuntimeException("claims不能为空");
            }
            if (secret == null || secret.length() == 0) {
                throw new RuntimeException("jwtSecret不能为空");
            }
            if (expire == null) {
                throw new RuntimeException("expireTime不能为空");
            }
            Map<String, Object> header = new HashMap<>(3);
            header.put("alg", "HS256");
            header.put("typ", "JWT");
            Algorithm algorithm = Algorithm.HMAC256(secret);
            JWTCreator.Builder builder = JWT.create()
                    .withHeader(header)
                    .withIssuer(ISSUER)
                    .withExpiresAt(new Date(System.currentTimeMillis() + expire));
            claims.forEach(builder::withClaim);
            return builder.sign(algorithm);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

解析

    public static final String ISSUER = "这是自定义的JWT解密用户";
    public static String jwtSecret = "这是一个自定义的密钥";

    public static void parseToken(String token) {
        Algorithm algorithm = Algorithm.HMAC256(jwtSecret);
        JWTVerifier verifier = JWT.require(algorithm)
                .withIssuer(ISSUER)
                .build();
        DecodedJWT decodedJWT = verifier.verify(token);
        //获取会话信息
        Long userId = decodedJWT.getClaim("userId").asLong();
        return;
    }

 总结

以上就是关于JWT的最最最基础的使用,我目前也是首次才了解(十分汗颜),所以稍微写篇文章记录下。

后面再针对JWT的具体实现看一下。

参考文档:
Springboot集成JWT做认证授权_lylyf520的博客-CSDN博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值