使用Keycloak SSO

时间:2018-12-18 19:24:41

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

我对吗?

1 个答案:

答案 0 :(得分:0)

javascript adapter通过创建从身份验证服务器加载的iframe来解决此问题。

keycloak docs

  

会话状态iframe

     

默认情况下,JavaScript适配器会创建一个隐藏的iframe,该iframe用于检测是否已发生Single-Sign Out。这不需要任何网络流量,而是通过查看特殊的状态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