一、什么是JWT
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).
该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。
JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
二、示例
- 依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
- java代码实现
/**
* JWT使用示例
*
* @author zpwd6
* @since 2018/12/18 16:53
*/
public abstract class JwtUtil {
private static final String SECRET = "fZiXWX2Cvc1FLSWCcNMGC4I70fqjTayBZCn9Djxf3tXNVlnKAsVB0Sk7q9GlEvIgw"; //加密解密秘钥,该秘钥需要妥善保存,一旦泄露将造成签名可再造
/**
* 通过JWT生成token
*
* @param payload 签名载荷,这里需要注意,该载荷采用Base64编码而不是加密,是可以解码成明文的。所以此值不应该存放用户敏感信息
* @param exp token有效时间,毫秒值
* @return
*/
public static String createToken(Map<String, Object> payload, long exp) {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; //签名算法定义
Date now = new Date();
//创建JwtBuilder,在创建过程中可以根据实际需求添加不同的信息,常用的是header、payload、sign信息。
JwtBuilder builder = Jwts.builder()
.setClaims(payload) //setPayload(payload) 该方法区别在于setClaims把传入值处理成JSON,而setPayload为纯文本
.setId(UUID.randomUUID().toString()) //JWT ID:是JWT的唯一标识,根据业务需要,这个可以设置为一个不重复的值,主要用来作为一次性token,从而回避重放攻击
.setIssuedAt(now) //token签发时间
.signWith(signatureAlgorithm, SECRET); //签名算法和秘钥
//通过JwtBuilder设置过期时间
if (exp > 0) {
builder.setExpiration(new Date(now.getTime() + exp));
}
return builder.compact();
}
/**
* 解析token
*
* @param token token信息
* @return
*/
public static Claims parseJwt(String token) {
Claims claims = Jwts.parser()
.setSigningKey(SECRET)
.parseClaimsJws(token)
.getBody();
return claims;
}
public static void main(String[] args) throws InterruptedException {
Map<String, Object> payload = new HashMap<>();
String userId = UUID.randomUUID().toString();
payload.put("userId", userId);
System.out.println("生成用户ID:" + userId);
String token = createToken(payload, 1000);
System.out.println(token);
Thread.sleep(2000); //过期校验
try {
Claims claims = parseJwt(token);
String parseUser = claims.get("userId", String.class);
System.out.println(parseUser);
} catch (ExpiredJwtException e) {
System.out.println("token过期");
}
}
}
网友评论