JWT的Token认证机制
一、什么是JWT
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用 户和服务器之间传递安全可靠的信息。
JWT组成
一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。
-
头部(Header)
头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以 被表示成一个JSON对象。 -
载荷(playload)
载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包 含三个部分 -
签证(signature)
jwt的第三部分是一个签证信息,这个签证信息由三部分组成:
header (base64后的)
payload (base64后的)
secret
二、Java的JJWT实现JWT
什么是JJWT
JJWT是一个提供端到端的JWT创建和验证的Java库。永远免费和开源(Apache License,版本2.0),JJWT很容易使用和理解。它被设计成一个以建筑为中心的流畅界 面,隐藏了它的大部分复杂性
集成
pom
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.6.0</version>
</dependency>
- 1
- 2
- 3
- 4
- 5
测试生成Token
public static String CreateToken(){
JwtBuilder builder= Jwts.builder()
.setId("123")
.setSubject("哈哈")
.setIssuedAt(new Date())
.signWith(SignatureAlgorithm.HS256,"com.bxc") ;
System.out.println( builder.compact() );
return builder.compact();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
执行方法生成token
eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMjMiLCJzdWIiOiLlk4jlk4giLCJpYXQiOjE1OTU2NTYxNjd9.tb_kWw1IEuaJ1ap7GbIaop3Dp35SWbznmlyGkov2GxY
- 1
解析Token
我们刚才已经创建了token ,在web应用中这个操作是由服务端进行然后发给客户端,客户端在下次向服务端发送请求时需要携带这个token(这就好像是拿着一张门票一 样),服务端接到这个token 应该解析出token中的信息(例如用户id),根据这些信息 查询数据库返回相应的结果。
解析:
public static void main(String[] args) {
String token = CreateToken();
ParseJwtToken(token);
}
public static void ParseJwtToken(String Token) {
Claims claims = Jwts.parser().setSigningKey("com.bxc").parseClaimsJws(Token).getBody();
System.out.println("id:" + claims.getId());
System.out.println("用户名:" + claims.getSubject());
System.out.println("生成时间:" + new SimpleDateFormat("yyyy‐MM‐dd HH:mm:ss").format(claims.getIssuedAt()));
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
打印结果:
eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMjMiLCJzdWIiOiLlk4jlk4giLCJpYXQiOjE1OTU2NTY0ODl9.sIBsAUFtXCQxVNoz5fvK5RyOW5mnHR_NkfYRHlviIJ4
id:123
用户名:哈哈
生成时间:2020‐07‐25 13:54:49
- 1
- 2
- 3
- 4
配置Token的过期时间
配置token的过期时间只需在上面创建token的方法内再追加一句:
整体为:
public static String CreateToken() {
long now = System.currentTimeMillis();//当前时间
long exp = now + 1000 * 60;//过期时间为1分钟
JwtBuilder builder = Jwts.builder()
.setId("123")
.setSubject("哈哈")
.setIssuedAt(new Date())
.signWith(SignatureAlgorithm.HS256, "com.bxc")
.setExpiration(new Date(exp));
System.out.println(builder.compact());
return builder.compact();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
再解析时,可查看token的过期时间,在上面解析的方法中追加一行:
System.out.println("过期时 间:"+new SimpleDateFormat("yyyy‐MM‐dd HH:mm:ss").format(claims.getExpiration()));
- 1
自定义claims
们刚才的例子只是存储了id和subject两个信息,如果想存储更多的信息(例如角 色)可以定义自定义claims,还是创建token的方法,添加claim:
整体为:
public static String CreateToken() {
long now = System.currentTimeMillis();//当前时间
long exp = now + 1000 * 60;//过期时间为1分钟
JwtBuilder builder = Jwts.builder()
.setId("123")
.setSubject("哈哈")
.setIssuedAt(new Date())
.signWith(SignatureAlgorithm.HS256, "com.bxc")
.setExpiration(new Date(exp))
.claim("roles", "admin")
.claim("info", "哈哈哈额");
System.out.println(builder.compact());
return builder.compact();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
获取claim信息
还是在上面解析token的方法内,追加:
System.out.println("roles:"+claims.get("roles"));
System.out.println("info:"+claims.get("info"));
- 1
- 2
封装工具类
JWTUtil
@ConfigurationProperties("jwt.config")
@Data
@Component
public class JWTUtil {
private String key;
private long overtime;
public String CreateToken(String userid, String username, String roles) {
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
JwtBuilder builder = Jwts.builder()
.setId(userid)
.setSubject(username)
.setIssuedAt(now)
.signWith(SignatureAlgorithm.HS256, key)
.claim("roles", roles);
if (overtime > 0) {
builder.setExpiration(new Date(nowMillis + overtime));
}
return builder.compact();
}
public boolean VerityToken(String token) {
try{
Claims claims = Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(token)
.getBody();
if (claims != null){
return true;
}
}catch (Exception e){
e.printStackTrace();
}
return false;
}
public String getUserid(String token){
try{
Claims claims = Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(token)
.getBody();
if (claims != null){
return claims.getId();
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
public String getUserName(String token){
try{
Claims claims = Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(token)
.getBody();
if (claims != null){
return claims.getSubject();
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
public String getUserRoles(String token){
try{
Claims claims = Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(token)
.getBody();
if (claims != null){
return claims.get("roles").toString();
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
public String getClaims(String token,String param){
try{
Claims claims = Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(token)
.getBody();
if (claims != null){
return claims.get(param).toString();
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
- 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
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
application.properties配置
jwt.config.key = com.bxc
jwt.config.overtime = 10000
- 1
- 2
文章来源: blog.csdn.net,作者:小毕超,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq_43692950/article/details/107443397
- 点赞
- 收藏
- 关注作者
评论(0)