我在 nginx 服务器后面使用 keycloak 和 oauth2-proxy。完整的身份验证流程由这个免费工具处理。 所以我的 Angular 前端和 NestJS 后端在请求标头中获取了访问请求令牌,但身份验证完全由 oauth2-proxy 和 keycloak 处理。
现在我需要
id_token
/id_token_hint
。获得此信息的唯一方法是使用 url:
http://localhost:8080/realms/myrealm/protocol/openid-connect/token
与范围:openid。 (供您参考:我不使用grant_typeauthorization_code,因为完整的身份验证流程通过keycloak + oauth2-proxy。我的后端/前端从不直接发送登录/身份验证请求)
这非常有效,我得到了一个 id_token。问题:如果我将此 id_token 用于 keycloak(18+)注销过程,将显示 注销确认对话框。问题:请求创建一个新的 keycloak 客户端会话。
是否可以在不创建新会话的情况下获取客户端当前会话的id_token?
oauth2-proxy
v7.6.0现在包括--backend-logout-url
它来自PR #1876
会话感知注销,后端注销 url 方法
:调用以执行后端注销的 URL,--backend-logout-url
将替换为实际的{id_token}
(如果会话中可用)id_token
您的问题是无法访问
id_token
,因为身份验证和会话管理完全由位于应用程序和 Keycloak 前面的 oauth2-proxy
处理。这种安排使得执行需要 id_token
的操作变得困难,例如从 Keycloak 进行会话感知注销,而不启动新会话或直接向客户端应用程序公开令牌。
--backend-logout-url
选项允许指定oauth2-proxy
将调用的URL以启动后端注销过程。{id_token}
,其中 oauth2-proxy
将自动替换为当前会话中的实际 id_token
。这种动态替换可确保使用正确的令牌,而无需更广泛地公开它或要求将其存储在客户端。
由于
oauth2-proxy
管理会话令牌(包括刷新和过期),因此通过此工具集成注销过程可确保注销请求本质上了解会话上下文。这与 oauth2-proxy
根据需要管理和使会话失效的功能相匹配。
通过在
oauth2-proxy
中处理令牌插入和注销 URL 调用,应用程序无需直接管理令牌或实现会话感知注销的自定义逻辑。这降低了应用程序代码库内的复杂性,并通过最大限度地减少敏感令牌的暴露来增强安全性。
指定包含
id_token
的后端注销 URL 的功能允许与各种身份验证提供程序(如 Keycloak)直接集成,并支持不同的注销机制,包括需要令牌进行验证的机制。这种灵活性确保了更广泛的兼容性并简化了与现有身份验证基础架构的集成。