目录
一、什么是JWT
官网解释:
JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。此信息可以验证和信任,因为它是经过数字签名的。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对签名。
虽然JWT可以加密,以在各方之间提供保密性,但我们将重点关注签名令牌。签名令牌可以验证其中包含的声明的完整性,而加密令牌则对其他方隐藏这些声明。当令牌使用公钥/私钥对签名时,签名还证明只有持有私钥的一方才是签名方。
个人简述:
简单来说,就是前后端传输时识别用户身份信息的一种JSON格式的标志,相较于传统的redis加session来保存用户信息有很多改善的地方,也是目前主流的身份识别策略。最简单的问题就是Web端支持session的方式存储用户数据,但APP端、小程序端不支持,这样,使用JWT便可完美解决。
传统的策略:基于服务端,分布式架构中弊端尤为突出,还需解决session共享问题
JWT的策略:基于客户端
二、JWT的用途
1、授权:
JWT是最常见的解决方法。一旦用户登录,每个后续请求将包含JWT,从而允许用户访问该令牌允许的路由,服务和资源。单点登录是当今广泛JWT的一项功能,因为它开销小,而且可以在不同的域中轻松使用。
2、信息交换:
各方之间安全传输信息的好方法。因为可以对JWT进行签名(例如:使用公钥和私钥对),所以可以确保数据的安全性。此外,由于签名是使用标头和有效负载计算的,因此还可以检测到数据是否被篡改。
三、JWT认证流程
四、JWT的优势
五、JWT的数据结构
JWT由三部分组成,依次是1、标头(header);2、有效载荷(payload);3、签名(signature)。
因此,token的形式一般为header.payload.signature。
1、标头
2、有效载荷
这部分里不要放敏感信息!
3、签名
这部分是通过header+payload+你的私钥进行Base64编码生成的签名,外部是无法破解的。
六、JWT的使用案例
1、导入依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.1</version>
</dependency>
2、JWT工具类
package com.dragonwu.util;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.Calendar;
import java.util.Map;
public class JwtUtils {
private static final String SIGNATURE="你的密钥";
/**
* 生成token header.payload.signature
*/
public static String getToken(Map<String,String> map){
Calendar instance=Calendar.getInstance();
instance.add(Calendar.DATE,7);//默认7天后过期
//创建jwt builder
JWTCreator.Builder builder= JWT.create();
//payload
map.forEach((k,v)->{
builder.withClaim(k,v);
});
String token=builder.withExpiresAt(instance.getTime())//指定令牌过期时间
.sign(Algorithm.HMAC256(SIGNATURE));//signature
return token;
}
/**
* 验证token 合法性
* @return DecodedJWT 获取token信息 若验证失败会直接抛出异常
*/
public static DecodedJWT verify(String token){
DecodedJWT verify=JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
return verify;
}
}
3、JWT测试
package com.dragonwu.util;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.HashMap;
import java.util.Map;
public class MyTest {
public static void main(String[] args) {
Map<String,String> map=new HashMap<>();
map.put("username","Jack");
map.put("password","123456");//这里只是案例,一般密码等明杆信息不要放到token的payload里
String token=JwtUtils.getToken(map);//生成token
System.out.println(token);
DecodedJWT verify=JwtUtils.verify(token);//验证token
//输出token里的信息
System.out.println(verify.getClaims());
System.out.println(verify.getClaim("id").asString());
System.out.println(verify.getClaim("username").asString());
}
}
4、运行效果