JWT技术

JWT技术

1. JWT介绍

JWT工具:

JWT(Json Web Token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。

JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上


JWT最重要的作用就是对 token信息的防伪作用。


JWT的原理:

一个JWT由三个部分组成:公共部分私有部分签名部分。最后由这三者组合进行base64编码得到JWT。

  1. 公共部分

    主要是该JWT的相关配置参数,比如签名的加密算法、格式类型、过期时间等等。

  2. 私有部分

    用户自定义的内容,根据实际需要真正要封装的信息。

    userInfo{用户的Id,用户的昵称nickName}

  3. 签名部分

    SaltiP: 当前服务器的Ip地址!{linux 中配置代理服务器的ip}

    主要用户对JWT生成字符串的时候,进行加密{盐值}

    最终组成 key+salt+userInfo -> token!

base64编码,并不是加密,只是把明文信息变成了不可见的字符串。但是其实只要用一些工具就可以把base64编码解成明文,所以不要在JWT中放入涉及私密的信息

2. JWT整合

  1. 引入依赖

    1
    2
    3
    4
    <dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    </dependency>
  2. 添加工具类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    public class JwtHelper {

    //token过期时间,单位ms
    private static long tokenExpiration = 24*60*60*1000;
    //签名秘钥
    private static String tokenSignKey = "123456";

    /**
    * 根据参数生成token
    * @param userId
    * @param userName
    * @return
    */
    public static String createToken(Long userId, String userName) {
    String token = Jwts.builder()
    .setSubject("AR-USER")
    .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration))
    .claim("userId", userId)
    .claim("userName", userName)
    .signWith(SignatureAlgorithm.HS512, tokenSignKey)
    .compressWith(CompressionCodecs.GZIP)
    .compact();
    return token;
    }

    /**
    * 根据token字符串得到用户id
    * @param token
    * @return
    */
    public static Long getUserId(String token) {
    if(StringUtils.isEmpty(token)) return null;
    Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
    Claims claims = claimsJws.getBody();
    Integer userId = (Integer)claims.get("userId");
    return userId.longValue();
    }

    /**
    * 根据token字符串得到用户名
    * @param token
    * @return
    */
    public static String getUserName(String token) {
    if(StringUtils.isEmpty(token)) return "";
    Jws<Claims> claimsJws
    = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
    Claims claims = claimsJws.getBody();
    return (String)claims.get("userName");
    }

    public static void main(String[] args) {
    String token = JwtHelper.createToken(1L, "55");
    System.out.println(token);
    System.out.println(JwtHelper.getUserId(token));
    System.out.println(JwtHelper.getUserName(token));
    }

    }

3. 在service中使用

1
2
3
//使用Jwt生成token
String token = JwtHelper.createToken(userInfo.getId(), name);
map.put("token",token);

本站由 Cccccpg 使用 Stellar 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。