Quarkus令牌刷新过晚求助:非Web应用场景解决方案
解决Quarkus非Web应用Rest Client令牌过期未刷新问题
方案1:使用Service Account专属的提前刷新配置
你的应用属于后端服务,需明确指定OIDC应用类型为service-account,而非默认或hybrid类型。针对该类型,Quarkus提供了quarkus.oidc.token.refresh-before-expiry配置项,可设置令牌到期前自动刷新的时间窗口,避免高负载下请求恰好碰到令牌过期的情况。
配置示例:
quarkus.oidc.application-type=service-account quarkus.oidc.token.refresh-before-expiry=30S
该配置会让Quarkus在令牌剩余有效期不足30秒时自动触发刷新,确保新请求使用的是有效令牌。
方案2:自定义令牌刷新逻辑(进阶)
如果默认配置无法满足需求,可通过自定义ClientRequestFilter或扩展OIDC令牌生产者,手动控制令牌的刷新时机:
- 创建自定义过滤器,在请求发送前检查令牌有效期:
import jakarta.ws.rs.client.ClientRequestContext; import jakarta.ws.rs.client.ClientRequestFilter; import jakarta.ws.rs.core.HttpHeaders; import org.eclipse.microprofile.jwt.JsonWebToken; import java.time.Instant; @Provider public class TokenRefreshFilter implements ClientRequestFilter { @Inject JsonWebToken jwt; @Inject OidcTokenProvider tokenProvider; @Override public void filter(ClientRequestContext requestContext) { // 检查令牌剩余有效期是否小于30秒 if (jwt.getExpirationTime() - Instant.now().getEpochSecond() < 30) { // 主动刷新令牌 JsonWebToken newToken = tokenProvider.refreshToken(); // 更新请求头中的Bearer令牌 requestContext.getHeaders().putSingle(HttpHeaders.AUTHORIZATION, "Bearer " + newToken.getRawToken()); } } }
- 将该过滤器绑定到你的Rest Client接口:
@RegisterRestClient @RegisterProvider(TokenRefreshFilter.class) public interface ExternalApiClient { // 接口方法定义 }
方案3:调整令牌缓存策略
Quarkus默认会缓存OIDC令牌,可通过配置缩短缓存的TTL,确保缓存中的令牌提前失效,触发刷新:
quarkus.oidc.token.cache-ttl=270S
设置为270秒(比5分钟少30秒),这样缓存中的令牌会提前30秒过期,新请求会自动获取新的有效令牌。
内容的提问来源于stack exchange,提问作者CNC-Parade
相关产品推荐
相关产品推荐

