You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:13:24