对JWT的理解:
相关信息可以上JWT官网:
JWT官网
还可以查看JWT里面的一些giuhub上的详细信息:
JWT-GitHub
简单来说
JWT分为三个部分:
1 头部 他的封装格式官网里有,我就直接拿来用了
{
"alg": "HS256",
"typ": "JWT"
}
typ是类型,alg是签名算法 (头部信息一般不需要改动,alg会按照签名时的算法的类型而去赋值)
2 有效负荷(也叫有效信息),这个基本上是填写一些基本数据,但是最好不要填写敏感数据,容易泄露,你要填也没事,反正你的锅~
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
里面有一些默认的字段,我们可以用也可以不用,我们也可以额外添加,比如用户名userName等;
3 签名
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-256-bit-secret
)
从上面可以看出这个部分是由 头部信息以及有效负荷+密钥(自己设定,最好复杂一点) 的加密 组成,JWT提供了很多加密算法,默认是HMACSHA256,也就是头部信息中的alg为HS256的情况;
引入jar包
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
主要代码如下:
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long systemTime = System.currentTimeMillis() + 1000*60*60; #获取当前系统时间毫秒数并加一个小时的毫秒数
String format = simpleDateFormat.format(new Date(systemTime));
System.out.println("查看时间"+format);
String token = JWT.create()
.withExpiresAt(new Date(systemTime)) #设置过期时间
.withClaim("userName", "xiaoming") #添加有效负荷数据
.withClaim("userID", 1)
.sign(Algorithm.HMAC384("223")); #设置签名,加入密钥
System.out.println(token);
解析JWT:
#认证
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC384("223")).build(); #这里需要注意,这里的验证算法需要和签名时用的一样,并且密钥也需要相同
#解析
DecodedJWT decodedJWT = jwtVerifier.verify(token);
System.out.println(decodedJWT.getClaim("userName")); #获取jwt负载的信息
在这里说一下,认证和解析是两码事,解析是直接将JWT字符串解析出来,获取里面的一些信息;而认证则是需要比对这个数字签名是否是我这里的。
一下代码依然能够执行
DecodedJWT decode = JWT.decode(token);
System.out.println(decode.getClaim("userName").asString());
输出结果:
另外也放一下解析出token令牌里面的一些信息吧
调用 System.out.println(decode.getClaims()); 这个语句,则可以打印tokne里面的有效负荷的信息,结果如下:
{exp=com.auth0.jwt.impl.JsonNodeClaim@223d2c72, userName=com.auth0.jwt.impl.JsonNodeClaim@8f4ea7c, userID=com.auth0.jwt.impl.JsonNodeClaim@436813f3}
还有其他的get函数,慢慢摸索吧~~,建议多看看github和官网里面的内容,特别是github里面有很详细的介绍.
另外关于 web使用JWT的内容,可以在拦截器里面进行拦截验证,这个以后有机会再写