JWT 简介
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。
jwt 的官方地址:
http://www.mvnjar.com/com.auth0/java-jwt/3.2.0/detail.html
下载最新的 jar 包:java-jwt-3.2.0.jar
JWT的组成
一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷(Playload)与签名。
示例代码:
package test;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class TokenUtilJWT {
//公共密钥客户端不会知道
public static String SECRET="FreeMaNong";
public static String createToken() {
//签名发布时间
Date iatDate=new Date();
System.out.println(iatDate);//英文时间
//设置签名过期时间 1分钟
Calendar nowTime=Calendar.getInstance();
nowTime.add(Calendar.MINUTE,1);
Date expiresDate=nowTime.getTime();
//System.out.println(expiresDate);
Map<String,Object> map=new HashMap<String, Object>();
map.put("alg","HS256");//设置算法 为HS256
map.put("typ","JWT");//设置类型为JWT
String token = "";
try {
token = JWT.create().withHeader(map)
.withClaim("name","Free码农")
.withClaim("age","28")
.withClaim("org","今日头条")
.withClaim("username","chenyu")
.withIssuedAt(iatDate) //设置签发时间
.withExpiresAt(expiresDate) //设置过期时间 过期时间大于签发时间
.sign(Algorithm.HMAC256(SECRET));//用公共密钥加密
System.out.println("----------- 生成Token --------- createToken() ");
System.out.println(token);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (JWTCreationException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return token;
}
public static Map<String,Claim> verifyToken(String token) {
System.out.println("-------- -- 验证Token --------- verifyToken()");
JWTVerifier verifier = null;
DecodedJWT jwt=null;
try {
//用公共密钥解密验证
verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
jwt = verifier.verify(token);
}catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}catch (Exception e){
throw new RuntimeException("登录凭证已过去,请重新登录");
}
return jwt.getClaims();
}
public static void main(String[] args) {
String token = createToken();
//System.out.println("Token:"+token);
Map<String,Claim> claims=verifyToken(token);
System.out.println(claims.get("name").asString());
System.out.println(claims.get("age").asString());
System.out.println(claims.get("username").asString());
System.out.println(claims.get("org")==null?null:claims.get("org").asString());
//测试过期token
//String GuoQiToken="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhdXRoMCJ9.izVguZPRsBQ5Rqw6dhMvcIwy8_9lQnrO3vpxGwPCuzs";
//Map<String,Claim> claims2=verifyToken(GuoQiToken);
}
}
运行结果:
Thu Sep 13 10:37:37 CST 2018
----------- 生成Token --------- createToken()
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvcmciOiLku4rml6XlpLTmnaEiLCJuYW1lIjoiRnJlZeeggeWGnCIsImV4cCI6MTUzNjgwNjMxNywiaWF0IjoxNTM2ODA2MjU3LCJhZ2UiOiIyOCIsInVzZXJuYW1lIjoiY2hlbnl1In0.TR3xxlkXdUuVviIX8Ad_UJGJCKTARBTtnzjkax6rgp4
-------- -- 验证Token --------- verifyToken()
Free码农
28
chenyu
今日头条
运行可能会报错:
1、
Caused by:
java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonProcessingException
2、
Caused by:
java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.JsonSerializer
3、
Caused by:
java.lang.ClassNotFoundException: com.fasterxml.jackson.annotation.JsonView
4、
java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString([B)Ljava/lang/String;
at com.auth0.jwt.JWTCreator.sign(JWTCreator.java:330)
at com.auth0.jwt.JWTCreator.access$100(JWTCreator.java:24)
at com.auth0.jwt.JWTCreator$Builder.sign(JWTCreator.java:311)
解决:
加入以下三个jar包就好了:
jackson-core-2.7.0.jar、jackson-databind-2.7.0.jar、jackson-annotations-2.7.0.jar
第4个异常是因为jar版本太低了,把
commons-codec-1.2.jar 换成 commons-codec-1.6.jar 高一些的版本就好了。
所用 jar包下载参考链接: https://download.csdn.net/download/xuanjiewu/10662531
原文链接:https://blog.csdn.net/xuanjiewu/article/details/82664686
本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。
还没有人抢沙发呢~