如何在不抛出异常的情况下检查 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");
}
我正在开发一个 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");
}