如何将我的角度钥匙斗篷配置与idphint属性一起使用?

时间:2019-04-12 14:31:05

标签: angular keycloak keycloak-services

我正在使用角度钥匙斗篷适配器(https://www.npmjs.com/package/keycloak-angular)建立与我们的钥匙斗篷服务器的连接。这运作得很好。

现在,我正在尝试使用idphint属性将请求委派给其他idp。

问题:login()方法可以添加idphint属性,但是我不确定如何将实现与该登录方法结合起来。有什么建议吗?

我的实现:

export function initAuth(authService: KeycloakAuthenticationService): () => void {
  return () => authService.init({
    config: {
      url: KEYCLOAK_AUTH_URL,
      realm: 'Example-REALM',
      clientId: 'angular-client'
    },
    initOptions: {
      onLoad: 'login-required',
      checkLoginIframe: false
    }
  });
}
@NgModule({
 ...
  providers: [
    {provide: APP_INITIALIZER, useFactory: initAuth, multi: true, deps: [KeycloakAuthenticationService]}
  ]
...
})

1 个答案:

答案 0 :(得分:0)

我刚才碰到了同一堵墙,做了一些研究,我想在这里为其他人指出。 原则上,您可以在调用login()函数时提供idpHint,然后在适配器初始化之后但在您登录之前进行初始化(否则,第一次登录尝试不会在loginUrl中提供提供者。 所以我认为您将不得不使用init()方法并手动检查登录状态以手动登录还是不手动...

经过一番研究,我决定改用此解决方案,并采用复杂的登录方法添加idpHint:

const keycloakInit: KeycloakInit = {
  onLoad: 'login-required',
  flow: 'implicit'
};
const keycloakLoginParams = {
  idpHint: 'XXX-YYY'
};

export const environment: EnvironmentData = {
  production: false,
  keycloakJsUrl,
  keycloakConfig,
  keycloakInit,
  keycloakLoginParams,
  ...
};
  private initKeycloak(resolve, reject) {
    if (!environment.keycloakConfig) {
      reject('keycloak config missing, but init triggered. reject');
    }

    this.keycloakAuth = new Keycloak(environment.keycloakConfig);

    if (environment.keycloakLoginParams) {
      // wrap an custom function around original login to support idpHint
      const kcLogin = this.keycloakAuth.login;
      this.keycloakAuth.login = (options) => {
        Object.assign(options, environment.keycloakLoginParams);
        kcLogin(options);
      };
    }

    this.keycloakAuth.init(environment.keycloakInit || {onLoad: 'login-required'})
      .success(() => {
        const tokenParsed = this.tokenParsed;
        this.user = this.createUserObject(tokenParsed);
        console.log('logged in', this.user, tokenParsed);
        resolve();
      })
      .error((resp) => {
        reject(resp.error + ': ' + resp.error_description);
      });

    // called when the access token is expired. we use implicit flow, just show login mask
    this.keycloakAuth.onTokenExpired = () => {
      this.redirectToLogin();
    };

  }