什么是token?什么是JWT?如何基于token进行身份验证?
我们都知道session信息需要保存一份在服务器端。这种方式会带来一些麻烦,比如需要我们保证保存session信息服务器的可用性、不适合移动端等。
有没有一种不需要自己存放session信息就能实现身份验证的方式?使用token就可以!!!JWT就是这种方式实现的,通过这种方式服务器端就不需要保存session数据了,只要在客户端保存服务端返回给用户token就可以了,扩展性得到提升。
JWT本质上就是一段签名的JSON格式的数据。由于他是带有签名的,因此接受者便可以验证他的真实性。
jwt由三个部分组成:
- header:描述JWT的元数据。定义了生成签名的算法以及token的类型
- payload(负载):用来存放实际需要传递的数据
- signature(签名):服务器通过payload、header和一个密钥使用header里面指定的签名算法(默认HMAC SHA256)生成
以登录操作为例,大致流程如下:
用户向服务器发送用户名和密码用于登录系统。
身份验证服务响应并返回了签名的jwt,上面包含了用户是谁的内容。
用户以后每次向后端发送请求都在header中带上了jwt。
服务端检查jwt并从中获取用户的相关信息。
public class JWTUtils {
public static String SERSTR = "this is a key";
public static String createJWTWithJSONType(Object obj) {
System.out.println(obj);
String str = JWT.create()
.withClaim("token", JSON.toJSONString(obj))
.withExpiresAt(new Date(System.currentTimeMillis() + 30*60*1000))
.sign(Algorithm.HMAC256(SERSTR));
System.out.println("Comment:str "+str);
return str;
}
public static DecodedJWT decode(String token) {
DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC256(SERSTR)).build().verify(token);
return decodedJWT;
}
}