如何重新运行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
相关产品推荐
相关产品推荐

