问题描述
在我的应用程序中,我使用 Spring Security Authorization 服务器和 Spring Security Resource 服务器。一切正常,用户登录,获得 access_token 并可以使用它访问 API。
现在我需要允许用户从 URL 下载文件(想想 <button onClick="window.open(/files/1/download")>
。
我的想法是创建一个新的端点,它将向用户发出一个临时的 access_token,然后用户可以将其添加为 URL windows.open('/files/1/download?access_token=<temp-token>')
我曾尝试使用 TokenEndpoint
和 AuthorizationServerTokenServices
,但它们不允许我控制新令牌的参数。
解决方法
如何创建一个创建和验证 JWT 的服务?
@Service
public class TokenProvider {
public String createToken(User user) {
Date now = new Date();
Date expiryDate = new Date(now.getTime() + 5000); // Token will expire in 5 seconds
return Jwts.builder()
.setSubject(Long.toString(user.getId()))
.setIssuedAt(new Date())
.setExpiration(expiryDate)
.signWith(SignatureAlgorithm.HS512,"YOUR-SECRET-KEY")
.compact();
}
public Long getUserIdFromToken(String token) {
Claims claims = Jwts.parser()
.setSigningKey("YOUR-SECRET-KEY")
.parseClaimsJws(token)
.getBody();
return Long.parseLong(claims.getSubject());
}
public boolean validateToken(String authToken) {
try {
Jwts.parser().setSigningKey("YOUR-SECRET-KEY").parseClaimsJws(authToken);
return true;
} catch (SignatureException ex) {
logger.error("Invalid JWT signature");
} catch (MalformedJwtException ex) {
logger.error("Invalid JWT token");
} catch (ExpiredJwtException ex) {
logger.error("Expired JWT token");
} catch (UnsupportedJwtException ex) {
logger.error("Unsupported JWT token");
} catch (IllegalArgumentException ex) {
logger.error("JWT claims string is empty.");
}
return false;
}
}