我有2个JHipster应用程序在一个子域(app1.domain.tld和app2.domain.tld)上运行。
在两个应用程序中,用户都通过Keycloak登录。顺序是这样的:
如果用户已经登录域(* .domain.tld)的其中一个应用程序,则自动登录用户(不询问用户名和密码)的最佳方法是什么?
在了解JSessionID仅适用于在其上生成的应用程序之前,我曾尝试将JSessionID用作全局令牌。
也许捕获Keycloak身份验证cookie(在步骤2中返回)并在第二个应用程序上进行身份验证会成功吗?
根据我在测试中看到的内容,在第一个应用程序上通过身份验证后,当我转到第二个应用程序时,Angular 401 HTTP拦截器将使用会话令牌重定向到keycloak登录页面。因此,那时Keycloak应该看到我已经登录,并且应该将我重定向到第二个应用程序的主页。
我对吗?
答案 0 :(得分:0)
javascript adapter通过创建从身份验证服务器加载的iframe来解决此问题。
会话状态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