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

2024-03-03

我有 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 应该看到我已经登录,并且应该将我重定向到我的第二个应用程序的主页。

我对吗 ?


The JavaScript 适配器 https://www.keycloak.org/docs/latest/securing_apps/index.html#_javascript_adapter通过创建一个来解决这个问题iframe https://github.com/keycloak/keycloak/blob/master/adapters/oidc/js/src/main/resources/login-status-iframe.html这是从身份验证服务器加载的。

来自keycloak文档 https://www.keycloak.org/docs/latest/securing_apps/index.html#session-status-iframe:

会话状态 iframe

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

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

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

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

有关 javascript 适配器内部工作原理的更多详细信息,可以找到源代码here https://github.com/keycloak/keycloak/blob/master/adapters/oidc/js/src/main/resources/keycloak.js

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Keycloak SSO 在 2 个应用程序之间保持身份验证 的相关文章

随机推荐