JWT学习

JWT(Java Web Token)是一种轻量级的身份验证机制,用于在客户端和服务端之间安全地传递信息。本文详细介绍了JWT的工作流程、组成部分(header、payload、signature)以及如何在Java中生成和验证JWT。示例代码展示了如何使用java-jwt库创建和验证JWT,同时提供了JWT工具类的封装以及在Controller中的应用。
摘要由CSDN通过智能技术生成

什么是JWT

JWT就是java web token,JWT的主要作用是被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

流程:

1.用户通过账号密码访问服务器

2.服务器验证账号密码

2.服务器生成Token,并发送给浏览器

3.储存Token,并且每次请求都附加上Token

4.服务器验证Token,并返回数据

JWT的组成:

JWT分为三个部分:header,payload, signature

header包括:什么类型,加密算法;

palyload: 载荷就是存放信息的地方。包含:标准中的注册声明,公共的声明,私有的声明

例如:

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

然后再进行base64位加密。

signature:是一个签证信息。这一部分是header和playload,在进行一次secret(加盐)加密;

如何使用:

一般在请求头上加Authorization。

fetch('api/user/1', {
  headers: {
    'Authorization': 'Bearer ' + token
  }
})

示例:

1.引入依赖

   <!--引入jwt-->
<dependencies>
    <dependency>
        <groupId>com.auth0</groupId>
        <artifactId>java-jwt</artifactId>
        <version>3.4.0</version>
    </dependency>
</dependencies>
</project>

2.生成token和验证token

public class test {

    @Test
   public void contextLoads() {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.SECOND,60);
        String token = JWT.create()
                .withClaim("username", "gtt")    //设置自定义用户名
                .withExpiresAt(calendar.getTime())    //设置过期时间
                .sign(Algorithm.HMAC256("gttt!@#$%^&*"));//设置签名 gttt!@#$%^&*为签名的第三部分secret
        System.out.println(token);
    }
    @Test
    public void  test(){
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256("gttt!@#$%^&*")).build();
        DecodedJWT decodedJWT =verifier.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MjE1MTM0NTMsInVzZXJuYW1lIjoiZ3R0In0.Z71gA4Xh5VnPaUGXNV7NKBAuks_SD55wzI5noLZAG6w");//这个是上面生成的。
        System.out.println("用户名:"+decodedJWT.getClaim("username"));
        System.out.println("过期时间:"+decodedJWT.getExpiresAt());
    }

}

3.封装工具类

public class JWTUtils {
    private static String TOKEN = "gtt2312";
    /**
     * 生成token
     * @param map  //传入payload
     * @return 返回token
     */
    public static String getToken(Map<String,String> map){
        JWTCreator.Builder builder = JWT.create();
        map.forEach((k,v)->{
            builder.withClaim(k,v);
        });
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.HOUR,7*24);//设置过期时间
        builder.withExpiresAt(instance.getTime());
        return builder.sign(Algorithm.HMAC256(TOKEN)).toString();
    }
    /**
     * 验证token
     * @param token
     * @return
     */
    public static void verify(String token){
        JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);
    }
    /**
     * 获取token中payload
     * @param token
     * @return
     */
    public static DecodedJWT getToken(String token){
        return JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);
    }
}

 

4.controller

public class UserController {
    @Autowired
    private UserService userService;
    @GetMapping("/user/login")
    public Map<String,Object> login(User user){
        Map<String,Object> result = new HashMap<>();
        log.info("用户名:[{}]",user.getUsername());
        log.info("密码:[{}]",user.getPassword());

        try {
            //登录
            User loginUser = userService.login(user);
            //判断login是否为空
            //添加payload载荷
            Map<String, String> map = new HashMap<>();
            map.put("username",loginUser.getUsername());
            map.put("password",loginUser.getPassword());
            //生成token
            String token = JWTUtils.getToken(map);
            //向前端返回code状态码msg信息和token
            result.put("code",200);
            result.put("msg","登陆成功!");
            result.put("token",token);
        } catch (Exception e) {
            e.printStackTrace();
            result.put("code",502);
            result.put("msg",e.getMessage());
        }
        return result;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值