使用 mod_auth_openidc 注销

问题描述

总的来说,我对 OpenID 和身份验证非常陌生。我的问题如下:我们的应用程序在 apache 2.x 服务器(即我们的 RP)上提供服务,前端从静态目录提供,如果在 /api 上代理,则 OP 为一个 keycloak 实例。总的来说,我们设法让它工作,但我们正在努力注销。注销是通过在 /redirect_uri?logout=<base-app-uri> 发出 GET 请求(当然使用 url-encoding)来触发的。即使我们的 <base-app-uri> 受到保护,我们还是希望在注销时显示登录页面。当访问上述 uri 时,后端 API 成功开始以 401 响应,并且会话在 Keycloak 控制台中消失,但 RP 不会将用户重定向登录页面并继续提供受保护的静态内容。事实上,只有当我删除 mod_auth_openidc_session cookie 时才能实现重定向

解决方法

我会说这是错误的身份验证设计。前端是 SPA 应用,静态内容不应受 mod_auth_openidc 保护。它应该被列入白名单。前端将使用 Authorization Code Flow + PKCE flow 管理自己的身份验证,并将访问令牌附加到每个 API 请求。 SPA(或使用的 SPA 库)处理注销 = 它删除本地应用会话 cookie,并且它还执行 OIDC 注销(重定向到使用的身份提供者)。

API 部分受到正确保护。

恕我直言,还退出登录页面(我猜在这种情况下是 Keycloak 登录表单)不是一个好的用户体验。最好在前端有一个特殊的白名单路由,例如/bye,您可以在其中通知注销成功。