使用 Keycloak SSO 在 2 个应用程序之间保持身份验证

Bio*_*eek 5 java spring-security single-sign-on jhipster keycloak

我有 2 个 JHipster 应用程序,每个应用程序都在一个子域(app1.domain.tld 和 app2.domain.tld)上运行。

在这两个应用程序中,用户都通过 Keycloak 登录。顺序如下:

  1. Angular 应用程序将带有凭据的 /authenticate 请求发送到 Keycloak
  2. 如果响应成功,则返回身份验证 cookie
  3. POST 请求被发送到生成 JSessionID cookie 的 Jhipster 后端应用程序
  4. 然后,JSessionID 用于对支持的应用程序的每个请求。

如果用户已经登录域(*.domain.tld)的应用程序之一,自动登录用户(无需询问用户名和密码)的最佳方式是什么?

在了解 JSessionID 仅适用于生成它的应用程序之前,我尝试使用 JSessionID 作为全局令牌...

也许捕获 Keycloak 身份验证 cookie(在步骤 2 中返回)并在第二个应用程序上进行身份验证就可以解决问题?

从我在测试时看到的情况来看,在第一个应用程序上进行身份验证后,当我转到第二个应用程序时,Angular 401 HTTP 拦截器会使用会话令牌重定向到 keycloak 登录页面。因此,那时 Keycloak 应该看到我已经登录,并且应该将我重定向到我的第二个应用程序的主页。

我对吗 ?

rck*_*krd 1

javascript 适配器通过创建iframe解决了这个问题从身份验证服务器加载的

\n

来自keycloak 文档:

\n
\n

会话状态 iframe

\n

默认情况下,JavaScript 适配器会创建一个隐藏的 iframe,用于检测是否发生单点注销。这不需要任何网络流量,而是通过查看特殊状态 cookie 来检索状态。可以通过在传递给 init 方法的选项中设置 checkLoginIframe: false 来禁用此功能。您不应依赖于直接查看此 cookie。它的格式可以改变,并且它\xe2\x80\x99s也与Keycloak服务器的URL相关联,而不是与你的应用程序的URL相关联。

\n
\n

init 函数的成功回调有一个参数,该参数给出用户的身份验证状态。

\n
<script src="keycloak.js"></script>\n<script>\n    var keycloak = Keycloak();\n    keycloak.init().success(function(authenticated) {\n        alert(authenticated ? \'authenticated\' : \'not authenticated\');\n    }).error(function() {\n        alert(\'failed to initialize\');\n    });\n</script>\n
Run Code Online (Sandbox Code Playgroud)\n

如果用户通过身份验证,则将用户重定向到登录页面,因为用户已经通过身份验证,因此无需再次输入登录凭据。如果适配器使用 onload 选项初始化,则可以自动处理此问题check-sso

\n

有关 javascript 适配器内部工作原理的更多详细信息,可以在此处找到源代码

\n