You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重新运行Keycloak JavaScript适配器的check-sso?

解决方案

当你通过弹窗完成Keycloak登录后,要触发Check-SSO逻辑更新SPA的认证状态,可按以下方式操作:

方法一:监听弹窗关闭,触发Check-SSO初始化

打开登录弹窗后,通过轮询监听弹窗关闭事件,一旦弹窗关闭,调用Keycloak适配器的init方法并指定onLoad: 'check-sso'参数,完成登录状态检查:

adapter = new Keycloak({
  url: ENV.APP.KEYCLOAK_URL,
  realm: ENV.APP.KEYCLOAK_REALM,
  clientId: ENV.APP.KEYCLOAK_CLIENT_ID,
});

// 打开登录弹窗
const keycloak_window = window.open(
  adapter.createLoginUrl(),
  "_blank",
  "popup=true,width=300,height=300",
);

// 轮询检查弹窗状态
const popupMonitor = setInterval(() => {
  if (keycloak_window.closed) {
    clearInterval(popupMonitor);
    // 执行Check-SSO
    adapter.init({
      checkLoginIframe: false, // 禁用重复的登录iframe检查
      onLoad: 'check-sso',
      // 若配置了静默检查页面,需添加以下参数(建议配置)
      silentCheckSsoRedirectUri: `${window.location.origin}/silent-check-sso.html`
    }).then(authenticated => {
      if (authenticated) {
        // 调用你已有的SPA状态更新代码
        console.log('用户已完成认证,更新应用状态');
      } else {
        console.log('认证未完成或用户取消登录');
      }
    }).catch(err => {
      console.error('Check-SSO执行失败:', err);
    });
  }
}, 500);

方法二:直接调用令牌更新方法

如果仅需验证用户登录状态并获取有效令牌,可直接调用updateToken方法(传入0表示立即检查令牌有效性):

// 弹窗关闭后执行
adapter.updateToken(0).then(refreshed => {
  if (refreshed) {
    // 令牌刷新成功,用户已认证,更新SPA状态
    console.log('用户已认证,令牌已更新');
  } else {
    // 用户未登录或令牌无效
    console.log('用户未完成认证');
  }
}).catch(err => {
  console.error('令牌检查失败:', err);
});

补充:静默检查页面配置

若使用方法一的check-sso模式,建议在项目根目录添加silent-check-sso.html页面,用于Keycloak的静默认证回调:

<!DOCTYPE html>
<html>
<body>
  <script>
    parent.postMessage(location.href, location.origin);
  </script>
</body>
</html>

内容的提问来源于stack exchange,提问作者Raniere Silva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:35:16