JWT token 生成工具

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_38233650/article/details/94301615

1.简介:

    Jwt 是一种生成token,或者解析token 返回对象的工具,现在流行的都是前后端分离项目,用之前的shiro,或者sercurity 去做权限是会遇到无法做前端的权限,所以就采用token 这种方式,服务器返回token  给前端,前端通过token 访问资源,前端通过cookie保存。

2.为什么是jwt?

WT本质上是一个字符串,一个完整的JWT由三部分组成,头部(header), 荷载(Payload), 和签名(Signature),中间用.隔开,如下是一个典型的JWT:eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE1NjE4Njk2MjMsInVzZXIiOiIxMjM0NSIsInN1YiI6InhsIn0.5szo9Rfp_6b3cszas3-g0V719IIWAN97ZIZhx49-CK1mLGJlbYd__idPuT1EEsMSq92FV7vneEo9IrrZw9XH6g

3. 如何生成 JWT

  1. 生成头部header
  2. 生成荷载payload
  3. 生成签名signature
    signature = encode(base64(header) + '.' + base64(payload), secret)
  4. JWT = header.payload.signatrue

注:encode是header.alg指定的加密算法;secret为密钥,需要妥善保存。

4. 如何验证一个 JWT 的合法性

在得到一个 JWT 串之后,如何验证它携带的信息是否可靠呢(假设该串为:header.payload.signatyre),我们只需要:

  1. base64 解码 header 得到加密算法 encode;
  2. 计算vercode = encode(header.payload, secret);
  3. 验证 vercode 和 signatyre 是否匹配

5. 应用

JWT可作为Token,用于单点登陆;相比普通的Token,它的优势在于服务器无需使用额外的存储空间来保存Token,因为使用生成JWT时的secret,就可以验证JWT的合法性。
JWT的安全性建立在加密方密钥的安全性之上。若服务端使用JWT作为Token来鉴别用户身份,而密钥泄漏的话,得到密钥的人便可以为任意用户生成合法的Token,进而冒充他们与服务端交互。

6.jwt 生成和解析

<dependency>
     <groupId>io.jsonwebtoken</groupId>
     <artifactId>jjwt</artifactId>
     <version>0.9.1</version>
 </dependency>

//生成token 
Map<String, Object> map = new HashMap<>(1);
map.put("user", "12345"); //后面可以换成用户实体
String str =  Jwts.builder()
            .setClaims(map)
            .setSubject("xl") //用户名
            .setExpiration(new Date(System.currentTimeMillis() + 3600*1000)) //token保留的时间
            .signWith(SignatureAlgorithm.HS512, "123456") //
            .compact();
    System.out.println(str);
//解析token
Claims   claims =  Jwts.parser()
         .setSigningKey("123456")
         .parseClaimsJws("eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE1NjE4Njk2MjMsInVzZXIiOiIxMjM0NSIsInN1YiI6InhsIn0.5szo9Rfp_6b3cszas3-g0V719IIWAN97ZIZhx49-CK1mLGJlbYd__idPuT1EEsMSq92FV7vneEo9IrrZw9XH6g")
         .getBody();
 System.out.println(claims.getSubject());

猜你喜欢

转载自blog.csdn.net/qq_38233650/article/details/94301615