Keycloak Access Token提前过期问题咨询:10小时有效期仅生效30分钟
结合你描述的情况——令牌的exp声明显示10小时有效期,但实际30分钟后就无法使用,且系统时间无异常——我来梳理几个最可能的触发原因:
会话空闲超时覆盖令牌有效期
Keycloak的SSO会话有两个核心控制参数:Session Idle Timeout(会话空闲超时)和Session Max Lifespan(会话最长生命周期)。哪怕你的Access Tokenexp标注了10小时,如果会话在30分钟内没有任何活动(既没调用API续期,也没用Refresh Token刷新令牌),Keycloak会直接标记该会话为无效。此时即使令牌本身未到过期时间,调用API也会返回401。你可以去Keycloak后台的Realm Settings > Sessions页面,检查Session Idle Timeout是不是被设成了30分钟。令牌被主动吊销
有可能在30分钟内发生了主动吊销操作:比如用户手动登出、管理员在后台终止了该用户的会话,或者你的应用调用了Keycloak的令牌吊销接口(POST /realms/{realm}/protocol/openid-connect/revoke)。这种情况下,不管令牌exp是否到期,Keycloak都会拒绝验证。你可以在Users > 对应用户 > Sessions里查看会话的状态和实际终止时间,确认是否被提前结束。集群节点的会话同步异常
如果你的Keycloak是集群部署,节点间的会话状态同步可能出现了延迟或失败。比如某节点触发了会话超时逻辑,但其他节点还没同步到这个状态——前半小时你调用的是未同步的节点,所以令牌正常可用;之后请求落到了已标记会话无效的节点,就会返回401。可以检查集群的缓存配置(比如Infinispan的同步规则),确认会话数据是否在节点间正确同步。强制令牌 introspect 的配置影响
部分客户端会配置成每次调用API时,都向Keycloak的令牌 introspect 端点(POST /realms/{realm}/protocol/openid-connect/token/introspect)验证令牌状态。如果Keycloak在introspect时发现对应会话已失效(比如因空闲超时),会返回active: false,导致API返回401。这种场景下,令牌本身的exp虽然未到,但会因会话状态被拒绝。
你可以先从检查Realm的会话超时设置和用户的会话状态入手,这两个是触发这类问题最常见的原因。
内容的提问来源于stack exchange,提问作者andrija

