我正在使用角度钥匙斗篷适配器(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]}
]
...
})
答案 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();
};
}