如何配置WSO2 APIM禁止生成无限期(-1)令牌并全局启用有限期令牌
全局强制所有API仅接受有限期令牌的实现方案
当然可以通过全局配置实现这个需求,核心思路是在请求到达API接口前,通过全局拦截器/中间件统一校验令牌的有效期,拒绝无令牌或永久有效令牌的请求。下面针对主流技术栈给出具体实现方式:
1. Java Spring Security 场景
- 自定义全局过滤器拦截所有请求,统一校验令牌过期时间:
写一个OncePerRequestFilter的实现类,在doFilterInternal方法里提取请求头里的令牌,解析后检查exp(过期时间)字段:
然后在Security配置类里把这个过滤器注册成全局生效:@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); } }@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
相关产品推荐
相关产品推荐

