You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置WSO2 APIM禁止生成无限期(-1)令牌并全局启用有限期令牌

全局强制所有API仅接受有限期令牌的实现方案

当然可以通过全局配置实现这个需求,核心思路是在请求到达API接口前,通过全局拦截器/中间件统一校验令牌的有效期,拒绝无令牌或永久有效令牌的请求。下面针对主流技术栈给出具体实现方式:

1. Java Spring Security 场景

  • 自定义全局过滤器拦截所有请求,统一校验令牌过期时间:
    写一个OncePerRequestFilter的实现类,在doFilterInternal方法里提取请求头里的令牌,解析后检查exp(过期时间)字段:
    @Component
    public class ExpiredTokenFilter extends OncePerRequestFilter {
        private static final String SECRET_KEY = "your-secret-key";
    
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            String authHeader = request.getHeader("Authorization");
            if (authHeader == null || !authHeader.startsWith("Bearer ")) {
                response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "No valid token provided");
                return;
            }
            String token = authHeader.substring(7);
            try {
                Claims claims = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
                // 检查令牌是否过期
                if (claims.getExpiration().before(new Date())) {
                    response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Token has expired");
                    return;
                }
            } catch (JwtException e) {
                response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid or expired token");
                return;
            }
            filterChain.doFilter(request, response);
        }
    }
    
    然后在Security配置类里把这个过滤器注册成全局生效:
    @Configuration
    @EnableWebSecurity
    public class SecurityConfig {
        @Autowired
        private ExpiredTokenFilter expiredTokenFilter;
    
        @Bean
        public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
            http.addFilterBefore(expiredTokenFilter, UsernamePasswordAuthenticationFilter.class)
                .authorizeHttpRequests(auth -> auth.anyRequest().authenticated());
            return http.build();
        }
    }
    

2. Node.js Express 场景

  • 编写全局JWT校验中间件,挂载到所有路由之前:
    用jsonwebtoken库解析令牌,校验exp字段,直接把中间件应用到整个应用:
    const jwt = require('jsonwebtoken');
    const SECRET_KEY = process.env.JWT_SECRET || 'your-secret-key';
    
    const checkExpiredToken = (req, res, next) => {
        const authHeader = req.headers.authorization;
        if (!authHeader || !authHeader.startsWith('Bearer ')) {
            return res.status(401).json({ message: 'No token provided' });
        }
        const token = authHeader.split(' ')[1];
        try {
            const decoded = jwt.verify(token, SECRET_KEY);
            // 显式校验过期时间(verify方法其实会自动校验,这里可以自定义错误提示)
            if (Date.now() >= decoded.exp * 1000) {
                return res.status(401).json({ message: 'Token expired, please refresh' });
            }
            req.user = decoded;
            next();
        } catch (err) {
            return res.status(401).json({ message: 'Invalid or expired token' });
        }
    };
    
    // 全局应用这个中间件,所有API都会被校验
    app.use(checkExpiredToken);
    

3. 云服务API网关场景(比如AWS API Gateway)

  • 配置全局Lambda授权器:
    写一个Lambda函数负责校验令牌的过期时间,然后在API Gateway的阶段设置里把这个授权器设为全局默认,这样所有API资源都会自动应用这个校验逻辑,不需要逐个配置。

关键注意点

  • 必须使用包含exp字段的令牌格式,比如JWT,这是校验有效期的基础
  • 全局拦截/中间件要覆盖所有API路径,避免遗漏未校验的接口
  • 统一错误响应格式,让客户端能清晰识别令牌过期的情况,方便触发刷新逻辑

内容的提问来源于stack exchange,提问作者Gerson Monteiro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 13:15:30