JWT详解 springboot集成JWT 案例教程

目录

一、什么是JWT

二、JWT的用途

三、JWT认证流程

四、JWT的优势

五、JWT的数据结构

六、JWT的使用案例


一、什么是JWT

官网解释:

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。此信息可以验证和信任,因为它是经过数字签名的。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对签名。

虽然JWT可以加密,以在各方之间提供保密性,但我们将重点关注签名令牌。签名令牌可以验证其中包含的声明的完整性,而加密令牌则对其他方隐藏这些声明。当令牌使用公钥/私钥对签名时,签名还证明只有持有私钥的一方才是签名方。

个人简述:

简单来说,就是前后端传输时识别用户身份信息的一种JSON格式的标志,相较于传统的redis加session来保存用户信息有很多改善的地方,也是目前主流的身份识别策略。最简单的问题就是Web端支持session的方式存储用户数据,但APP端、小程序端不支持,这样,使用JWT便可完美解决。

传统的策略:基于服务端,分布式架构中弊端尤为突出,还需解决session共享问题

JWT的策略:基于客户端

二、JWT的用途

1、授权:

JWT是最常见的解决方法。一旦用户登录,每个后续请求将包含JWT,从而允许用户访问该令牌允许的路由,服务和资源。单点登录是当今广泛JWT的一项功能,因为它开销小,而且可以在不同的域中轻松使用。

2、信息交换:

各方之间安全传输信息的好方法。因为可以对JWT进行签名(例如:使用公钥和私钥对),所以可以确保数据的安全性。此外,由于签名是使用标头和有效负载计算的,因此还可以检测到数据是否被篡改。

三、JWT认证流程

四、JWT的优势

五、JWT的数据结构

JWT由三部分组成,依次是1、标头(header);2、有效载荷(payload);3、签名(signature)。

因此,token的形式一般为header.payload.signature

1、标头

2、有效载荷

这部分里不要放敏感信息!

 3、签名

这部分是通过header+payload+你的私钥进行Base64编码生成的签名,外部是无法破解的。

六、JWT的使用案例

1、导入依赖

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

2、JWT工具类

package com.dragonwu.util;


import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Calendar;
import java.util.Map;

public class JwtUtils {

    private static final String SIGNATURE="你的密钥";

    /**
     * 生成token header.payload.signature
     */
    public static String getToken(Map<String,String> map){
        Calendar instance=Calendar.getInstance();
        instance.add(Calendar.DATE,7);//默认7天后过期

        //创建jwt builder
        JWTCreator.Builder builder= JWT.create();

        //payload
        map.forEach((k,v)->{
            builder.withClaim(k,v);
        });

        String token=builder.withExpiresAt(instance.getTime())//指定令牌过期时间
                .sign(Algorithm.HMAC256(SIGNATURE));//signature
        return token;
    }

    /**
     * 验证token 合法性
     * @return DecodedJWT 获取token信息 若验证失败会直接抛出异常
     */
    public static DecodedJWT verify(String token){
        DecodedJWT verify=JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
        return verify;
    }

}

3、JWT测试

package com.dragonwu.util;

import com.auth0.jwt.interfaces.DecodedJWT;

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

public class MyTest {

    public static void main(String[] args) {
        Map<String,String> map=new HashMap<>();
        map.put("username","Jack");
        map.put("password","123456");//这里只是案例,一般密码等明杆信息不要放到token的payload里
        String token=JwtUtils.getToken(map);//生成token
        System.out.println(token);
        DecodedJWT verify=JwtUtils.verify(token);//验证token

        //输出token里的信息
        System.out.println(verify.getClaims());
        System.out.println(verify.getClaim("id").asString());
        System.out.println(verify.getClaim("username").asString());
    }
}

4、运行效果

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值