• 文章
  • 在线工具

JWT使用介绍以及工具类

JWT使用介绍 JWT工具类 JavaJWT
6222
一、JWT是什么
1.基本介绍
JSON Web Token(JWT)是一个非常轻巧的规范。JSON网络令牌,JWT是一个轻便的安全跨平台传输格式,定义了一个紧凑的自包含的方式在不同实体之间安全传输信息(JSON格式)
2.应用场景

允许我们在用户和服务器之间传递安全可靠的加密字符串信息进行认证和授权校验。

二、原理
1.JWT的构成
加密的字符串由三部分组成:头部+载体+签名
①.头部(Header)
头部用于描述关于该JWT的最基本信息,例如其他类型以及签名所用的算法等。可以被表示成一个json对象。
{"typ":"JWT","alg":"HS256"}


②.载荷(Payload)

载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三部分
1)、以下是标准中注册的声明,建议但不强制使用
iss:jwt签发者
sub:当前令牌描述的说明
aud:接收jwt的一方
exp:jwt的过期时间,这个过期时间必须要大于签发时间
nbg:定义在什么时间之前,该jwt都是不可用的
iat:jwt的签发时间
jti:jwt的唯一身份表示,主要用啦作为一次性token,从而回避攻击
2)、公共的声明(不参与校验)
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息,但不建议添加敏感信息,因为该部分是可以被解密。
3)、私有的声明(不参与校验)
私有声明是提供者和消费者所共同定义的声明,一般不建议存放铭感信息,Base64是对称解密的。
4)定义一个payload:
{"sub":"这里是载体内容","name":"JEEM","admin":"true"}


③.签证(signature)

jwt的第三部分是一个签证信息(校验数据是否正确),这个签证信息由三部分组成
header(base64后的)
payload(base64后的)
secret(秘钥)
这个部分需要base64加密后的header和base64加密后的payload。链接组成的字符串,然后通过header声明的加密方式加盐secret组合加密,然后就构成了jwt的三部分。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. //头部
eyJpc3MiOiLlvKDlvLoiLCJuYW1lIjoiNzg5IiwiZXhwIjoxNTI4MzY0MjU5LCJpYXQiOjE1MjgzNjMwNTl9.//载荷
574koY-c9SqMNNzfvAWQuKEnimWeZAcoFQ5XudNWF3o //签名
注意:secret是秘钥保存在服务端,一定不能泄露。


三、如何使用
1、引入POM
<dependency>
   <groupId>com.auth0</groupId>
   <artifactId>java-jwt</artifactId>
   <version>3.10.3</version>
</dependency>
2、代码使用

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


public class TokenUtil {


//默认过期时间设置(7)
  private static final long expireTime = 1000*60*60*24*7;

  public static String getToken(Object tokenVo, String tokenSecret){
return build(tokenVo, tokenSecret,expireTime);
  }

public static String getToken(Object tokenVo, String tokenSecret, long expireTime){
return build(tokenVo, tokenSecret,expireTime);
  }

private static String build(Object tokenVo, String tokenSecret, long expireTime){

//过期时间和加密算法设置
     Date date=new Date(System.currentTimeMillis()+expireTime);
     Algorithm algorithm = Algorithm.HMAC256(tokenSecret);
     //头部信息
     Map<String,Object> header=new HashMap<>(2);
     header.put("typ","JWT");
     header.put("alg","HS256");
     Map map = new HashMap();
     try {
map = BeanUtils.describe(tokenVo);
     } catch (IllegalAccessException e) {
e.printStackTrace();
     } catch (InvocationTargetException e) {
e.printStackTrace();
     } catch (NoSuchMethodException e) {
e.printStackTrace();
     }

return JWT.create()
.withHeader(header)

         .withClaim("data", map)  //自定义载荷

        .withExpiresAt(date) //过期时间

.sign(algorithm); //加盐

  }

/**
   * 解析token
   */
  public static <T> T getTokenData(String token, Class<T> clazz){
DecodedJWT jwt = JWT.decode(token);
     try {
Map map = jwt.getClaim("data").asMap();
        T vo = clazz.newInstance();
        BeanUtils.populate(vo,map);
        return vo;
     } catch (InstantiationException e) {
e.printStackTrace();
     } catch (IllegalAccessException e) {
e.printStackTrace();
     } catch (InvocationTargetException e) {
e.printStackTrace();
     }
return null;
  }
/**
   * 获取解析后的JWT
   */
  public static DecodedJWT getDecodedJWT(String token){
return JWT.decode(token);
  }
/**
   * 验证token
   * @param token
   */
  public static boolean verifyToken(String token, String tokenSecret){
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(tokenSecret)).build();

     jwtVerifier.verify(token);

     return true;
  }

public static void main(String[] args){
System.out.println(TokenUtil.getToken(new UserTokenVo(),"123456"));
  }
}


评论
或者使用社交账号快捷登录