0%

如何使用JWT


参考博文:https://www.jianshu.com/p/576dbf44b2ae



一、介绍

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。



二、JWT样式格式

1
2
3
4
5
6
7
8
9
10
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

//第一部分我们称它为头部(header)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

//第二部分我们称其为载荷(payload, 类似于飞机上承载的物品)
yJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

//第三部分是签证(signature)
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c


三、如何使用JWT

关于JWT在此我就不做过多的介绍,下面直接看,如何通过代码实现JWT


1.导入依赖

1
2
3
4
5
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.2.0</version>
</dependency>

2.创建Token实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//JWTToken
public class JWTToken implements AuthenticationToken {

private String token;

public JWTToken(String token) {
this.token = token;
}

@Override
public Object getPrincipal() {
return token;
}

@Override
public Object getCredentials() {
return token;
}
}

3.书写工具类(包括加密解密)

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
//JWTUtil.java
public class JWTUtil {
//超时时间
private static final long EXPIRE_TIME = 5 * 60 * 1000;

/**
* 生成签名
*
* @param username 用户名
* @param secret 密码
* @return 密钥
*/
public static String sign(String username, String secret) {
try {
Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
Algorithm algorithm = Algorithm.HMAC256(secret);
return JWT.create().withClaim("username", username)
.withExpiresAt(date)//添加超时时间
.sign(algorithm);
} catch (UnsupportedEncodingException e) {
return null;
}
}

/**
* 获取token中的用户名,无需secret解密,也可以类似的获取token中其他在payload中的数据
* @param token 密钥
* @return 用户名
*/
public static String getUsername(String token) {
try {
DecodedJWT jwt = JWT.decode(token);
return jwt.getClaim("username").asString();
} catch (Exception e) {
return null;
}
}

/**
* 校验token是否正确
*
* @param token 密钥
* @param username 用户名
* @param secret 密码
* @return 是否正确
*/
public static boolean verify(String token, String username, String secret) {
try {
Algorithm algorithm = Algorithm.HMAC256(secret);
JWTVerifier verifier = JWT.require(algorithm)
.withClaim("username", username)
.build();
DecodedJWT jwt = verifier.verify(token);
return true;
} catch (TokenExpiredException e) {
return false;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return false;
}
}
}

总结: JWT只是一个单独的工具,要和其他的框架或者自行实现一些其他功能才能真的将JWT应用在后台开发中,后面我将总结如何使用Shiro + JWT实现一个简单的权限认证功能。