Keycloak 未使用 checkLoginIframe true 登录,刷新令牌未定义

问题描述

我正在尝试使用 Angular 10(Keycloak 服务器版本为 7.0.1)设置 Keycloak 客户端,但我在使用 checkLoginIframe 选项时遇到了一些问题。

我有一个 check-sso Keycloak 情况,客户端不需要一直进行身份验证,但是,每次我尝试执行登录时,在重定向到我的应用程序后都会收到错误消息。错误是: [KEYCLOAK] 无法刷新令牌。

在网络选项卡中,我可以看到客户端向 Keycloak 服务器发送请求以刷新令牌,但调用主体具有未定义的刷新令牌,因此响应为 400。

我还注意到“init”Keycloak 函数的结果为 true,但 Keycloak 实例的“authenticated”字段仍然设置为 false。

我尝试将 checkLoginIframe 设置为 false 并且它可以工作,但是应用程序在实例化之前执行了许多重定向并且应用程序所在的路由丢失(因此用户重定向到主页)

initializeKeycloak(): Observable<any> {
    const keycloak = new Keycloak('/assets/keycloak.json');
    // const keycloak = new Keycloak('/assets/keycloak.json');
    let initOptions = {
      onLoad: 'check-sso',silentCheckSsoRedirectUri: window.location.origin + AppConstants.SILENT_CHECK_SSO_ROUTE,promiseType: 'native',redirect_uri: window.location.href,checkLoginIframe: true,// enableBearerInterceptor: true,// bearerExcludedUrls: ['/assets'],flow: 'standard',silentCheckSsoFallback: false
    };

    return from(keycloak.init(initOptions)).pipe(
      tap(authenticated => {
        console.log(authenticated)
        this._keycloak = keycloak;
        console.log(this._keycloak)
      }),mergeMap(/*my application logic for the logged user data fetch*/),catchError((err) => {
        console.error(err);
        throw err;
      })
    );
  }

解决方法

我找到了一个实现信号量的解决方法(这可能只是正确的方法)。该问题与 Keycloak 实例在应用程序启动后初始化(因为它是异步的)有关,而应用程序逻辑几乎立即刷新令牌。

我刚刚添加了一个标头拦截器,它会捕获每个调用并在释放调用之前等待 Keycloak 初始化。

无论如何我不得不将 checkLoginIframe 设置为 false,但重定向不再发生。

  private async waitForInit() {
    for (let i = 0; i < 5; i++) {
      if (this.ssoService.isInitialized()) {
        break;
      }
      await this.sleep(500);
    }
  }

  private sleep(ms) {
    return new Promise(resolve => setTimeout(resolve,ms));
  }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...