JWT的学习

JWT

 

1.什么是JWT

Json web token 也是通过json的格式作为web应用中的令牌,在各方之前通过Json的格式安全的进行传输

2.JWT可以干什么

jwt相当于前后期没有分离的session,认证的功能,session认证就是客户端登录成功然后保存uesrname,uid到session当中,下一次登录的时候就会有一个cookie,直接找到对应的session进行登录,但是这个保存在服务器端,而且下次登录的话还得是这个服务器,对服务器加载很大,并且cookie容易拦截

image-20220315092241612

3.JWT结构

令牌组成

1.header

2.paylode

3.siguature

4.JWT的第一个程序

package com.haihai;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Calendar;
import java.util.HashMap;

@SpringBootTest
class ShuangApplicationTests {

   @Test
   void contextLoads() {

       HashMap<String, Object> map = new HashMap<>();
       Calendar instance = Calendar.getInstance();
       instance.add(Calendar.YEAR,1);

       String token = JWT.create().withHeader(map)
              .withClaim("userid",17)           //header
              .withClaim("username","haihai")   //payload
              .withExpiresAt(instance.getTime())            //过期时间
              .sign(Algorithm.HMAC256("!token"));           //加密算法签名

       System.out.println(token);

  }

   @Test
   public void tt()
  {
       //解码获取
       JWTVerifier build = JWT.require(Algorithm.HMAC256("!token")).build();
       //令牌过没过日期
       DecodedJWT verify = build.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2Nzg5MjczMjMsInVzZXJpZCI6MTcsInVzZXJuYW1lIjoiaGFpaGFpIn0.MWzP14vH6OwTV1LfRSQ3bd1He89sPQBDYj2lz2eP0dE\n");
       System.out.println(verify.getClaim("userid").asInt());
       System.out.println(verify.getClaim("username").asString());
  }

}

5.封装JWT

package com.haihai.utils;

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

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

public class JwtUtils {

   private static final String SING = "!token";

   /**
    * 生成token
    * @param map1
    * @return
    */
   public static String getToken(Map<String,Object> map1)
  {
       HashMap<String, Object> map = new HashMap<>();
       Calendar instance = Calendar.getInstance();
       instance.add(Calendar.DATE,7);                 //七天过期

       JWTCreator.Builder builder = JWT.create();          //header

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


       String token = builder
              .withExpiresAt(instance.getTime())            //过期时间
              .sign(Algorithm.HMAC256(SING));           //加密算法签名

       System.out.println(token);
       return token;
  }

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

  }

   /**
    * 获取信息方法
    */

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



}

封装的思想就是化简直接调用方法

比如里面的加密SING,因为都用到所以直接搞到外面

还有builder中的withclaim()方法可能会传输好多内容,所以一两个肯定是不行的,我们再传入一个map来一个键值对来封装起来

然后就是验证方法了,验证的话直接把token传入,SING已经知道

还有token内容的获取,如果验证通过了就可以直接把token验证完的内容传过去(有点废话)

 

 

posted @ 2022-03-16 10:44  爽爽子的秃头生活  阅读(99)  评论(0)    收藏  举报