JWT (JSON Web Token) 是一种用于身份验证和授权的安全传输数据的开放标准。
报头通常由两部分组成: Token的类型(即 JWT)和所使用的签名算法(如 HMAC SHA256或 RSA)。
载荷是实际的数据,其中包含声明。声明是关于实体(通常是用户)和其他数据的语句。
有三种类型的声明:
- registered claims,
- public claims
- private claims。
下面是预定义的数据。
2.1、Public claims(公共的声明)
使用 JWT 的人可以随意定义这些声明( 可以自己声明一些有效信息如用户的id,name等,但是不要设置一些敏感信息,如密码 )。但是为了避免冲突,应该在 JWT注册表中定义它们,或者将它们定义为包含抗冲突名称空间的 URI。
2.2、Private claims(私人声明)
这些是创建用于在同意使用它们的各方之间共享信息的习惯声明,既不是注册声明,也不是公开声明( 私人声明是提供者和消费者所共同定义的声明 )。
2.3 注意:
对于已签名的Token,这些信息虽然受到保护,不会被篡改,但任何人都可以阅读。除非加密,否则不要将机密信息放在 JWT 的有效负载或头元素中。
签名用于验证JWT的完整性,确保在传输过程中没有被篡改。
公式:
HMACSHA256(base64UrlEncode(header) + “.” +base64UrlEncode(payload), secret)
Web API:JWT可以作为一种安全且高效的方式来验证请求,保护Web API不被恶意请求和数据盗用。
单点登录(SSO):JWT可以使用户在一次身份验证后,通过使用同一个认证令牌,来访问多个应用程序。这样可以简化用户在不同应用程序之间的登录流程,提高用户体验。
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwtartifactId>
<version>0.12.3version>
dependency>
//私钥,注意私钥长度至少43位,不然生成Token会报错
public static String secret ="123456789a123456789a123456789a123456789a123";
public static String createToken(){
// Header
Map<String, Object> header = new HashMap<>();
header.put("alg", "HS256");
header.put("typ", "JWT");
// Payload
Map<String, Object> payload = new HashMap<>();
payload.put("id", "malu_code");
payload.put("name","码鹿");
payload.put("admin",true);
// 声明Token失效时间
Calendar instance = Calendar.getInstance();
instance.add(Calendar.SECOND,300);// 300s
// 生成Token
String token = Jwts.builder()
.setHeader(header)// 设置Header
.setClaims(payload) // 设置Payload
.setExpiration(instance.getTime())// 设置生效时间
.signWith(SignatureAlgorithm.HS256,secret) // 签名,这里采用私钥进行签名,不要泄露了自己的私钥信息
.compact(); //生成Token
return token;
}
如果可以成功解析、不报异常,那token就是对的。
//私钥,注意私钥长度至少43位,不然生成Token会报错
public static String secret ="123456789a123456789a123456789a123456789a123";
public static boolean parserToken(String token) {
JwtParser jwtParser = Jwts.parser().setSigningKey(secret).build();
try {
Jws<Claims> claimsJws = jwtParser.parseClaimsJws(token);
// 解析head信息
JwsHeader header = claimsJws.getHeader();
// 解析Payload
Claims claims = claimsJws.getBody();
System.out.println(claims);
// 解析Signature
String signature = claimsJws.getSignature();
System.out.println(signature);
}catch (Exception e){
return false;
}
return true;
}