JWT实战
1. 使用方式
这里使用maven配置进行JWT的整合,首先看Maven配置:
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
创建一个简单的JWT测试,并使用静态秘钥进行加密:
public static void main(String[] args) {
JWTCreator.Builder builder = JWT.create();
// 你可以在这里放任何你想放置的文本
Map<String, String> claimMap = new HashMap<>();
claimMap.put("name", "小猴子的技术笔记");
claimMap.forEach(builder::withClaim);
// 设置一小时之后过期
builder.withExpiresAt(new Date(System.currentTimeMillis() + 3600000L));
Algorithm algorithm = Algorithm.HMAC256("#$@!FX()!JF%JS$KLS*KFH##%#QPCIXMSJ");
String sign = builder.sign(algorithm);
System.out.println(sign);
}
得到结果:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5bCP54y05a2Q55qE5oqA5pyv56yU6K6wIiwiZXhwIjoxNzE3NjY1NTY4fQ.YJY9_OlQHbtZA3LYTkeeabrWxNTkY-loTL78JK3TCak
可以看到结果就是按照"."进行分割组成的,一共三个部分。我们找个在线解析JWT的工具,把我们生成的数据放进去看看:
可以看到我们的JWT能够成功的被解析出来,palyload中的内容也被展示出来,因此比较重要的信息千万不要放在palyload中,因为他并不是安全的。
2. 验证JWT的合法性
public static void main(String[] args) {
Algorithm algorithm = Algorithm.HMAC256("#$@!FX()!JF%JS$KLS*KFH##%#QPCIXMSJ");
DecodedJWT verify = JWT.require(algorithm).build().verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5bCP54y05a2Q55qE5oqA5pyv56yU6K6wIiwiZXhwIjoxNzE3NjY1NTY4fQ.YJY9_OlQHbtZA3LYTkeeabrWxNTkY-loTL78JK3TCak");
System.out.println(verify);
}
通过debug模式能够看到已经成功解析出来:
这里解析填写了我们的秘钥,因为是静态的秘钥,因此我们千万不能够泄露这个秘钥,否则我们的Token也就不安全了。
我们把秘钥估计写错几位,看看会产生什么情况:
public static void main(String[] args) {
Algorithm algorithm = Algorithm.HMAC256("333#$@!FX()!JF%JS$KLS*KFH##%#QPCIXMSJ");
DecodedJWT verify = JWT.require(algorithm).build().verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5bCP54y05a2Q55qE5oqA5pyv56yU6K6wIiwiZXhwIjoxNzE3NjY1NTY4fQ.YJY9_OlQHbtZA3LYTkeeabrWxNTkY-loTL78JK3TCak");
System.out.println(verify);
}
这里抛出了一个叫做SignatureVerificationException 的异常信息,结合我们之前预先讲过的JWT可能会抛出的异常中的第2个:签名异常。我们可以使用try-catch的方式捕获这个异常然后进行我们的业务处理:
public static void main(String[] args) {
try {
Algorithm algorithm = Algorithm.HMAC256("333#$@!FX()!JF%JS$KLS*KFH##%#QPCIXMSJ");
DecodedJWT verify = JWT.require(algorithm).build().verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5bCP54y05a2Q55qE5oqA5pyv56yU6K6wIiwiZXhwIjoxNzE3NjY1NTY4fQ.YJY9_OlQHbtZA3LYTkeeabrWxNTkY-loTL78JK3TCak");
System.out.println(verify);
} catch (SignatureVerificationException signatureVerificationException) {
signatureVerificationException.printStackTrace();
System.out.println("签名异常");
}
}
其他的异常也是使用类似的方法进行捕获,然后自定义业务处理逻辑即可。上面的例子只是简单的演示了一下如何使用,在实际的生产中我们更多的是把他封装成一个工具类来进行使用。