使用Keycloak+Pac4j+Shiro时出现白页跳转及invalid_grant错误求助
问题背景
使用Keycloak、Pac4j和Shiro构建的认证系统运行一段时间后出现异常:页面变为空白,且被重定向至以下回调URL:
http://localhost:8080/oauth/callback?client_name=KeycloakOidcClient&session_state=ec6f1a5c-a992-4f66-8d7e-277d05e6cc1a&iss=http%3A%2F%2Flocalhost%3A9009%2Fauth%2Frealms%2Fgixx&code=2e14eabd-7e63-4400-a340-b6062690d97c.ec6f1a5c-a992-4f66-8d7e-277d05e6cc1a.db37becc-2ebe-4d5c-9b28-238e59ba9b73
堆栈追踪显示核心错误:
Bad token response, error=invalid_grant, description=Code not valid
该问题已导致项目停滞,结合提供的shiro.ini配置、Token截图及Keycloak设置,可从以下方向排查:
排查步骤与解决方案
1. 授权码生命周期问题
- 禁止重复提交:OAuth2授权码为一次性使用,若回调请求因网络重试、前端重复触发等多次发送,Keycloak会直接标记该code无效。检查前端是否存在重复跳转逻辑,或服务器端是否对同一code发起多次token请求。
- 调整超时时间:Keycloak默认授权码有效期为60秒,若认证流程耗时超过该阈值,code会失效。可在Keycloak控制台
Realm Settings -> Tokens中修改Access Code Lifespan参数延长有效期,验证是否解决问题。
2. 客户端配置一致性校验
- 匹配核心参数:确认Shiro/Pac4j配置中的
client_id、client_secret与Keycloak客户端设置完全一致,无大小写或拼写错误; - 校验回调URL:Keycloak的
Valid Redirect URIs必须与应用中配置的callbackUrl完全匹配,包括协议(HTTP/HTTPS)、端口、路径,任何差异都会导致授权码验证失败; - 确认客户端类型:授权码流要求Keycloak客户端
Access Type设置为confidential,并确保已生成有效的client_secret。
3. 会话关联与状态参数检查
- 会话有效性验证:Keycloak的授权码与
session_state绑定,若会话在授权码使用前已失效(如用户登出、会话超时),code会变为无效。检查Keycloak的Realm Settings -> Sessions -> Session Idle Timeout设置,同时确认应用端会话与Keycloak会话同步; - Pac4j状态参数处理:确保Pac4j在认证流程中正确维护
state参数,该参数用于CSRF防护,若state丢失或验证失败,会间接引发授权码处理异常。
4. 网络与环境同步问题
- 连通性检查:确认应用服务器与Keycloak服务器之间无网络阻塞,代理或防火墙未拦截token请求(应用向Keycloak的
/token端点发起的请求); - 时间同步:OAuth2流程对时间敏感,若两台服务器时间差超过5分钟,会导致签名或过期验证失败,需确保服务器时间同步。
5. 框架版本兼容性
- 验证Pac4j、Shiro与Keycloak的版本匹配度:不同版本框架可能存在OIDC协议实现差异,建议使用官方推荐的组合,例如Pac4j 5.x搭配Keycloak 17+,Shiro 1.10.x适配对应版本的Pac4j-Shiro适配器。
内容的提问来源于stack exchange,提问作者vished2000
相关产品推荐
相关产品推荐

