如何检查jwt令牌是否已过期而没有抛出异常?

ryoqjall  于 2021-07-23  发布在  Java
关注(0)|答案(2)|浏览(1014)

我正在开发一个java应用程序(使用springboot),我需要一些帮助:这个应用程序接收一个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 .
有没有办法不经过捕获的异常就知道令牌是否已过期?例如,如果有一个“token”类具有 .isExpired 属性之类的。
我不想去处理异常,因为这意味着我将始终依赖于 try 每次我需要检查令牌是否过期时阻止,我不希望它过期。

jutyujz0

jutyujz01#

如果您使用不同的jwt库,那么就可以很容易地做到这一点。auth0 jwt库具有用于分析和(可选)验证令牌的方法:

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");
}
lx0bsm1f

lx0bsm1f2#

这可以通过使用权利要求书来实现。下面的示例代码可以提供帮助。

// 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();
    }

相关问题