**摘要: ** JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。常规的用户识别基于Session+Cookie。这种方式解决了http无状态协议的用户识别的问题。JWT是Auth0提出的通过对JSON进行加密签名来实现授权验证的方案。
一、jwt组成
一个JWT实际上就是一个字符串,它由三部分组成,头部(header)、载荷(Claims)与签名。
base64编码之后的jwt看起来是一串字符串,由3个 .
分隔,分别对应:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLnlKjmiLciLCJpc3MiOiLnrb7lj5HogIUiLCJleHAiOjE0OTYyOTY0MTEsInVzZXJpZCI6MTIzNH0.YCduQ8f_IfEef-Uw5noRl_mXU1G15bkc2Zx3m67n6gE
将上面的字符串分别base64解密后
Header
{ "typ":"JWT", "alg":"HS256" }
Claims
{ "sub":"用户", "iss":"签发者", "exp":1496296411, "userid":1234 }
签名
``'nC|GS�g�f]MFזsfqn�`
Claims中字段说明,这几个字段都是JWT标准定义的
iss: 该JWT的签发者
sub: 该JWT所面向的用户
aud: 接收该JWT的一方
exp(expires): 什么时候过期,这里是一个Unix时间戳
iat(issued at): 在什么时候签发的
还可以自己添加所需的字段,比如后面userid。
二、JWT运用
在使用过程中,服务端通过用户登录验证之后,将base64(Header)+.
+base64(Claim)信息加密后得到第三段签名,然后将三部分返回给客户端,在后续请求中,服务端只需要对用户请求中包含的JWT进行解码,即可验证是否可以授权用户获取相应信息。
通过上面的说明可以看出,jwt可以省去读取session的步骤,减轻服务端压力。服务端只需要通过秘钥验证客户端携带的jwt来验证是否是已登录客户。
三、JWT 的java实现
- 首先在pom.xml引入java-jwt的依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.2.0</version>
</dependency>
/**创建JWT*/
public static String createJwt() throws IllegalArgumentException, UnsupportedEncodingException{
Algorithm al = Algorithm.HMAC256("secretkey");
String token = JWT.create()
.withIssuer("签发者")
.withSubject("用户")
.withClaim("userid", 1234)
.withExpiresAt(new Date(System.currentTimeMillis()+360000))
.sign(al);
return token;
}
/**验证jwt*/
public static void verifyJwt(String token) {
try {
Algorithm algorithm = Algorithm.HMAC256("secretkey");
JWTVerifier verifier = JWT.require(algorithm)
.build();
DecodedJWT jwt = verifier.verify(token);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (JWTVerificationException e) {
e.printStackTrace();
System.out.println("校验失败");
}
}
如果验证失败则抛出异常。
网友评论