从 Grafana Iframe 注销 - Keycloak

Signout from Grafana Iframe - Keycloak

我有一个带有 Keycloak 身份验证系统的 Angular 应用程序 (keycloak-angular)

我有一个允许使用 OAuth Keycloak 进行身份验证的 Grafana 服务器

我有一个 Keycloak 服务器,它有一个名为 master 的领域,还有两个 cliendID,一个用于我的 angularApp,一个用于我的 grafana 服务器。

在我的 angular 应用程序中,我显示了一些来自我的 Grafana 服务器的 iframe,并且根据我的实际配置,我的 iframe 直接使用 OAuth 进行身份验证(没有登录屏幕)。

我的 angular 应用程序中有一个注销按钮来处理 Keycloak 注销,它将我重定向到 keycloak 登录屏幕。

我的问题是,当我执行 keycloak 注销时,iframe 会话被保存,如果之后我使用不同的用户登录,我的 grafana iframe 仍将通过前一个用户的身份验证。

如果我在 grafana 应用程序或 grafana iframe 中注销,或转到 http://grafana-server:3000/logout ,我将注销到 Grafana,并且 grafana iframe 会话将切换到新用户(登录我的 angular 应用程序的用户)。

我希望 grafana iframe 在我从我的 Angular 应用程序注销时执行注销,这样下一个登录的用户将不会有前一个用户的会话。

Grafana OAuth 部分:

[auth.generic_oauth]
name = OAuth
enabled = true
allow_sign_up = true
client_id = grafana
client_secret = my-secret
scopes = openid email profile
email_attribute_name = email:primary
email_attribute_path = 
login_attribute_path =
name_attribute_path =
role_attribute_path =
id_token_attribute_name =
auth_url = http://keycloak-server/auth/realms/master/protocol/openid-connect/auth
token_url = http://keycloak-server/auth/realms/master/protocol/openid-connect/token
api_url = http://keycloak-server/auth/realms/master/protocol/openid-connect/userinfo
allowed_domains =
team_ids =
allowed_organizations =
tls_skip_verify_insecure = false
tls_client_cert =
tls_client_key =
tls_client_ca =
auto_sign_up = true 

这是 grafana 客户端的 keycloak conf 的屏幕截图。

后台通道注销 url 似乎是解决方案,但我找不到如何正确使用它。

我试图将此 url 设置为“/logout”; "http://grafana-server:3000/logout" ...我不知道如何让它工作。

OIDC logout 有 redirect_uri 参数,用户在注销后被重定向,因此也可以使用它从 Grafana 注销。所需流量:

  1. Angular logout 将浏览器重定向到 OIDC logout https://keycloak-server/auth/realms/{realm-name}/protocol/openid-connect/logout?redirect_uri=<grafana logout url> (当然 grafana logout url 是 URL 参数所以它必须是 URL编码)

  2. Keycloak 在 OIDC 注销成功后将浏览器重定向到 <grafana logout url>(“您的”http://grafana-server:3000/logout),因为它是通过 redirect_uri参数

  3. Grafana 执行注销(浏览器中的 Grafana 用户会话将被销毁)并且浏览器将被重定向到 Grafana 登录页面(当然可以使用 signout_redirect_url 配置自定义)

我最后的结果是:

let redirectUrl =`${environment.keycloak.url}/realms/${environment.keycloak.realm}/protocol/openid-connect/logout?redirect_uri=${encodedGrafanaLogoutUrl}`
keycloakService.logout(redirectUrl) 

当我注销时,我的浏览器被重定向到 grafana 注销 url,但不会再次将我重定向到 angular 应用程序。

为此,我将 grafana 配置文件的 设置为 angular 应用程序的 url。

它有效,我在注销后被重定向到该应用程序。所以我终于不用后台注销了

问题是现在,从 Grafana 网络应用程序注销会将我重定向到 angular 应用程序。