我正在使用jjwt
jwt 令牌创建。使用本地系统时间设置到期日期时,一切正常,即
日期 expDate = new Date(new Date().getTime() + 180000); //java.util.Date
但我尝试使用 UTC 格式的日期时间并用相同的 3 分钟到期日期签署了 jwt 令牌。现在它正在抛出ExpiredJwtException
,即使我在创建令牌后立即进行验证。我正在使用 SimpleDateFormat 将时区设置为 UTC。这是我在 java 中使用 jjwt 创建令牌的代码:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date expDate, issDate;
try {
expDate = (Date) simpleDateFormat.parse(sdf.format(new Date().getTime() + 180000));
issDate = (Date) simpleDateFormat.parse(sdf.format(new Date().getTime()));
JwtBuilder builder = Jwts.builder()
.setExpiration(expDate)
.setIssuedAt(issDate)
.setId(id)
.signWith(signingKey, signatureAlgorithm);
jwtToken = builder.compact();
} catch (ParseException ex) {
}
令牌已成功创建。我也可以在线验证内容。expDate 比 issDate 早 3 分钟。我还在通过传递创建的令牌创建令牌后立即调用用于验证令牌的方法。我的验证方法有:
try {
Jwts.parser().setSigningKey(signingKey).parseClaimsJws(token);
log.info("jwt verification success");
} catch (ExpiredJwtException exJwt) {
log.info("expired jwt : \n{}", exJwt.getMessage());
} catch (JwtException e) {
log.info("tampered jwt");
}
但我越来越ExpiredJwtException
。错误是
expired jwt :JWT 于 2019-05-17T01:24:48Z 过期。当前时间:2019-05-17T07:06:48Z,相差20520836毫秒。允许的时钟偏差:0 毫秒。
从我的日志来看,此时我的令牌中的发行日期和到期日期是:
issued date is: 2019-05-17T07:06:48.000+0545
expiry date is: 2019-05-17T07:09:48.000+0545
这是怎么回事?并感谢您的帮助。