Spring Security OAuth2 如何为文件下载生成临时令牌

问题描述

在我的应用程序中,我使用 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>')

我曾尝试使用 TokenEndpointAuthorizationServerTokenServices,但它们不允许我控制新令牌的参数。

生成令牌的正确方法是什么?

解决方法

如何创建一个创建和验证 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;
    }
}