Keycloak+oauth2-proxy:如何获取当前会话的id_token而不新建会话?
我在Nginx服务器后部署了Keycloak与oauth2-proxy,完整认证流程由这两款开源工具处理。我的Angular前端和NestJS后端可从请求头中获取access-request-token,但认证操作完全由oauth2-proxy和Keycloak负责。
目前我需要获取id_token/id_token_hint,当前仅能通过调用URL:http://localhost:8080/realms/myrealm/protocol/openid-connect/token并指定scope: openid来实现。说明:我并未使用authorization_code类型的grant_type,因为完整认证流程均通过Keycloak+oauth2-proxy完成,我的前后端从未直接发送登录/认证请求。

该方式能成功获取id_token,但使用此id_token执行Keycloak 18+版本的登出流程时,会弹出登出确认对话框,且请求会创建新的Keycloak客户端会话。
请问是否可以获取客户端当前会话的id_token,且不会创建新会话?
可以通过以下方式获取当前用户会话的id_token,且不会创建新会话:
1. 配置oauth2-proxy直接转发id_token
oauth2-proxy支持将当前会话关联的id_token通过请求头传递给后端服务,只需调整配置:
- 在oauth2-proxy的启动参数或配置文件中,开启
pass_access_token = true,同时将scope设置为包含openid(例如scope = "openid email profile")。 - 启用
set_xauthrequest = true,此时oauth2-proxy会在转发给后端的请求中添加X-Auth-Request-ID-Token请求头,前端或后端直接读取该头即可拿到当前会话的id_token。
这种方式完全复用oauth2-proxy已建立的用户会话,不会触发Keycloak创建新会话。
2. 从oauth2-proxy会话cookie提取
oauth2-proxy会将用户会话信息存储在默认名为_oauth2_proxy的cookie中,其中包含id_token。但该cookie默认是加密的,需使用oauth2-proxy配置的cookie_secret解密后才能解析出id_token。相比第一种方式,这种需要额外解密操作,推荐优先使用请求头转发方案。
当前方式创建新会话的原因
你当前调用Keycloak的token接口时,使用的grant_type并未复用oauth2-proxy已建立的用户会话,而是创建了一个新的客户端级会话,这就是登出时弹出确认框且生成新会话的原因。
内容的提问来源于stack exchange,提问作者Flo

