如何在不抛出异常的情况下检查 JWT 令牌是否已过期?

How to check if a JWT Token has expired without throw exceptions?

我正在开发一个 Java 应用程序(使用 Spring 启动),我需要一些帮助: 此应用程序接收我在方法中处理的 JWT 令牌 作为输入。目前的方法如下:

private UsernamePasswordAuthenticationToken myMethod(HttpServletRequest request) {
    
    // Code that gets the 'token' String

    try{
    
    Map<String, String> registry = ((Map<String, String>) (token.getBody().get("registry")));
    String sub = ((String) (parsedToken.getBody().get("sub")));


    UsernamePasswordAuthenticationToken finalToken = new UsernamePasswordAuthenticationToken(sub, null, null);
                            
            
    return finalToken; 

            
    } catch (ExpiredJwtException exception) { // Only here I have the certainty that the token has expired!
            // Code that handles the exception
    }

}

但是,我需要实现一个逻辑,必须在几个地方检查获取的令牌是否已过期,没有运行每次都使用此方法。我必须知道 token 是否已过期的唯一方法是 ExpiredJwtException.

引发的异常

有没有办法知道令牌是否已过期而不通过捕获的异常?例如,如果有一个具有 .isExpired 属性或类似属性的“令牌”class 将非常有用。

我不想处理异常,因为这意味着每次我需要检查令牌是否已过期或不是,我也不想这样。

这可以通过使用声明来实现。下面的示例代码可以提供帮助。

// Get Expiration and compare it with new Date()

public boolean isTokenExpired(String token) {
    return extractExpiration(token).before(new Date());
}


public Date extractExpiration(String token) {
    return extractClaim(token, Claims::getExpiration);
}


public <T> T extractClaim(String token , Function<Claims, T> claimResolver) {
    final Claims claim= extractAllClaims(token);
    return claimResolver.apply(claim);
}


private Claims extractAllClaims(String token) {
    return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
}

如果你使用不同的 JWT 库,你可以很容易地做到这一点。 auth0 JWT library 具有解析和可选地验证令牌的方法:

import com.auth0.jwt.JWT;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;


DecodedJWT jwt = JWT.decode(token);
if( jwt.getExpiresAt().before(new Date())) {
    System.out.println("token is expired");
}