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
- 生成头部header
- 生成荷载payload
- 生成签名signature
signature = encode(base64(header) + '.' + base64(payload), secret) - JWT = header.payload.signatrue
注:encode是header.alg指定的加密算法;secret为密钥,需要妥善保存。
4. 如何验证一个 JWT 的合法性
在得到一个 JWT 串之后,如何验证它携带的信息是否可靠呢(假设该串为:header.payload.signatyre),我们只需要:
- base64 解码 header 得到加密算法 encode;
- 计算vercode = encode(header.payload, secret);
- 验证 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());
本文深入讲解JWT(JSON Web Token)的工作原理,包括其结构、生成与验证过程,并演示了如何在Java中使用jjwt库进行JWT的生成和解析。
1256

被折叠的 条评论
为什么被折叠?



