Keycloak+Symfony(KnpU OAuth2Client)配置长会话后用户仍30-60分钟被登出的问题排查求助
Keycloak+Symfony(KnpU OAuth2Client)配置长会话后用户仍30-60分钟被登出的问题排查求助
大家好,我现在在做Keycloak和Symfony应用的集成,用的是knpuniversity/oauth2-client-bundle加上自定义认证器。整体流程跑通没问题,但最近遇到个头疼的问题:我和用户都会在30-60分钟左右被自动登出,明明我在Keycloak和Symfony里都配置了很长的会话有效期。
环境信息
- Symfony 7
- KnpU OAuth2ClientBundle
- 最新版Keycloak(Docker部署)
Symfony的security.yaml相关配置
firewalls: main: lazy: true provider: app_user_provider custom_authenticator: - App\Security\AdminFormAuthenticator - App\Security\KeycloakAuthenticator entry_point: App\Security\AdminFormAuthenticator logout: path: app_logout target: app_home remember_me: secret: '%kernel.secret%' lifetime: 2592000 # 30 days path: / always_remember_me: true
令牌刷新逻辑
我已经把刷新令牌存在会话里,会在需要的时候自动刷新访问令牌,核心逻辑如下:
if (!$request->query->has('code') && $session->has('refresh_token')) { $accessToken = $this->refreshAccessToken($client, $session->get('refresh_token')); } else { $accessToken = $this->fetchAccessToken($client); }
Keycloak的会话/令牌配置
我在Keycloak里的相关配置(文字整理,原问题有截图无法贴出):
- SSO Session Idle: 30天
- SSO Session Max: 10天
- Client Session Idle: 30天
- Client Session Max: 10分钟(这个设置看起来有点可疑?)
- Offline Session Idle: 30天
- Access Token Lifespan: 15天
- Refresh Token lifespan: 禁用刷新(默认设置)
- Login timeout: 30分钟
问题现状
尽管配置了这么多“长效”设置,但实际用户会话会在30-60分钟左右过期,我自己测试和用户反馈的情况完全一致。目前我怀疑可能是这几个方向出了问题:
- Keycloak的
Client Session Max=10分钟是不是覆盖了更长的SSO会话设置? - Symfony这边有没有没处理好的地方,比如没正确持久化或刷新令牌?
- Symfony的
remember_me配置在OAuth2集成场景下是不是根本不起作用?
想请教的问题
- 这种30-60分钟就登出的情况,最可能的原因是什么?是不是Keycloak的
Client Session Max=10分钟在搞鬼? - 我是不是需要在Keycloak里开启刷新令牌,并且调整它的有效期?
- Symfony的
remember_me配置在OAuth2集成的场景下是不是完全无关? - 有没有推荐的配置方案,能让Keycloak+Symfony的会话持续几天甚至几周,而不是几十分钟?
另外,如果有人能讲讲Keycloak的这些会话设置和Symfony的会话、刷新令牌逻辑之间的交互关系,那就太感谢了!
内容来源于stack exchange
相关产品推荐
相关产品推荐

