UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

102 lines 14.9 kB
import { Component } from "@angular/core"; import { throwError } from "rxjs"; import { catchError } from "rxjs/operators"; import { LoadingEmitter } from '../../../utility/loading-emitter'; import * as i0 from "@angular/core"; import * as i1 from "../../../configuration/configuration.service"; import * as i2 from "@angular/common/http"; import * as i3 from "../../../snack-bar/services/snack-bar.service"; import * as i4 from "../../../logger/services/logger.service"; import * as i5 from "@angular/router"; import * as i6 from "@ngx-translate/core"; export class AbstractLoginSsoComponent { _config; _http; _snackbar; _log; _router; _activeRouter; _translate; _ssoConfig; loading; constructor(_config, _http, _snackbar, _log, _router, _activeRouter, _translate) { this._config = _config; this._http = _http; this._snackbar = _snackbar; this._log = _log; this._router = _router; this._activeRouter = _activeRouter; this._translate = _translate; this._ssoConfig = this._config.getConfigurationSubtree(['providers', 'auth', 'sso']); this.loading = new LoadingEmitter(); this._activeRouter.queryParams.subscribe((params) => { if (!!params.code) { this.loginFromCode(params); } }); } ngOnDestroy() { this.loading.complete(); } redirectToSso() { let redirectUrl = this.getRedirectUrl(); this._log.info("Redirecting to " + redirectUrl); window.location.href = redirectUrl; } loginFromCode(params) { if (!params.code) { return; } this.loading.on(); this._log.debug('Handling access token: ' + params.code); const token$ = this.getToken({ grantType: 'authorization_code', code: params.code, realmId: '', redirectUri: location.origin + '/' + this._config.getConfigurationSubtree(['services', 'auth', 'toLoginRedirect']), }); token$.subscribe(token => { this.loading.off(); if (!!token) { this.redirectToHome(); } }); } getRedirectUrl() { const myQuery = this._ssoConfig.redirectUrl + '?'; const options = { client_id: this._ssoConfig.clientId, redirect_uri: location.origin + '/' + this._config.getConfigurationSubtree(['services', 'auth', 'toLoginRedirect']), response_type: 'code', scope: this._ssoConfig.scopes.join(' '), }; return myQuery + Object.keys(options).map(key => { return encodeURIComponent(key) + '=' + encodeURIComponent(options[key]); }).join('&'); } getToken(body) { const url = this._ssoConfig.refreshUrl; if (!url) { return throwError(() => new Error('Refresh URL is not defined in the config [nae.providers.auth.sso.refreshUrl]')); } return this._http.post(url, body, { headers: { 'Content-Type': 'application/json' } }).pipe(catchError(error => { this.loading.off(); this._snackbar.openErrorSnackBar(this._translate.instant('forms.login.wrongCredentials')); return throwError(() => error); })); } redirectToHome() { this._router.navigate(['/' + this._config.getConfigurationSubtree(['services', 'auth', 'onLoginRedirect'])]) .then((value) => { this._log.debug('Routed to ' + value); }); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractLoginSsoComponent, deps: [{ token: i1.ConfigurationService }, { token: i2.HttpClient }, { token: i3.SnackBarService }, { token: i4.LoggerService }, { token: i5.Router }, { token: i5.ActivatedRoute }, { token: i6.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AbstractLoginSsoComponent, selector: "ncc-abstract-login-field", ngImport: i0, template: '', isInline: true }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractLoginSsoComponent, decorators: [{ type: Component, args: [{ selector: 'ncc-abstract-login-field', template: '' }] }], ctorParameters: () => [{ type: i1.ConfigurationService }, { type: i2.HttpClient }, { type: i3.SnackBarService }, { type: i4.LoggerService }, { type: i5.Router }, { type: i5.ActivatedRoute }, { type: i6.TranslateService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtbG9naW4tc3NvLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvZm9ybXMvbG9naW4vbG9naW4tc3NvL2Fic3RyYWN0LWxvZ2luLXNzby5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWEsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUkxQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7O0FBVWhFLE1BQU0sT0FBZ0IseUJBQXlCO0lBTTdCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBVkosVUFBVSxDQUFNO0lBQ2hCLE9BQU8sQ0FBaUI7SUFFbEMsWUFDYyxPQUE2QixFQUM3QixLQUFpQixFQUNqQixTQUEwQixFQUMxQixJQUFtQixFQUNuQixPQUFlLEVBQ2YsYUFBNkIsRUFDN0IsVUFBNEI7UUFONUIsWUFBTyxHQUFQLE9BQU8sQ0FBc0I7UUFDN0IsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUNqQixjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUMxQixTQUFJLEdBQUosSUFBSSxDQUFlO1FBQ25CLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixrQkFBYSxHQUFiLGFBQWEsQ0FBZ0I7UUFDN0IsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFFdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxjQUFj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QUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFDNUIsRUFBQyxPQUFPLEVBQUUsRUFBQyxjQUFjLEVBQUUsa0JBQWtCLEVBQUMsRUFBQyxDQUFDLENBQUMsSUFBSSxDQUNyRCxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDZixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDO1lBQzFGLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUNMLENBQUM7SUFDTixDQUFDO0lBRVMsY0FBYztRQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2RyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7d0dBekZpQix5QkFBeUI7NEZBQXpCLHlCQUF5QixnRUFGakMsRUFBRTs7NEZBRU0seUJBQXlCO2tCQUo5QyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSwwQkFBMEI7b0JBQ3BDLFFBQVEsRUFBRSxFQUFFO2lCQUNmIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIE9uRGVzdHJveX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIFBhcmFtcywgUm91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQge09ic2VydmFibGUsIHRocm93RXJyb3J9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge2NhdGNoRXJyb3J9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHtIdHRwQ2xpZW50fSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7Q29uZmlndXJhdGlvblNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24uc2VydmljZVwiO1xuaW1wb3J0IHtMb2dnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9sb2dnZXIvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtMb2FkaW5nRW1pdHRlcn0gZnJvbSAnLi4vLi4vLi4vdXRpbGl0eS9sb2FkaW5nLWVtaXR0ZXInO1xuaW1wb3J0IHtTbmFja0JhclNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zbmFjay1iYXIvc2VydmljZXMvc25hY2stYmFyLnNlcnZpY2VcIjtcbmltcG9ydCB7U3NvfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29tbW9ucy9zY2hlbWFcIjtcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcblxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25jYy1hYnN0cmFjdC1sb2dpbi1maWVsZCcsXG4gICAgdGVtcGxhdGU6ICcnXG59KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TG9naW5Tc29Db21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gICAgcHJvdGVjdGVkIF9zc29Db25maWc6IFNzbztcbiAgICBwcm90ZWN0ZWQgbG9hZGluZzogTG9hZGluZ0VtaXR0ZXI7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBfY29uZmlnOiBDb25maWd1cmF0aW9uU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIF9odHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICBwcm90ZWN0ZWQgX3NuYWNrYmFyOiBTbmFja0JhclNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfbG9nOiBMb2dnZXJTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX3JvdXRlcjogUm91dGVyLFxuICAgICAgICBwcm90ZWN0ZWQgX2FjdGl2ZVJvdXRlcjogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuX3Nzb0NvbmZpZyA9IHRoaXMuX2NvbmZpZy5nZXRDb25maWd1cmF0aW9uU3VidHJlZShbJ3Byb3ZpZGVycycsICdhdXRoJywgJ3NzbyddKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbmV3IExvYWRpbmdFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVJvdXRlci5xdWVyeVBhcmFtcy5zdWJzY3JpYmUoKHBhcmFtcykgPT4ge1xuICAgICAgICAgICAgaWYgKCEhcGFyYW1zLmNvZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2luRnJvbUNvZGUocGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9hZGluZy5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWRpcmVjdFRvU3NvKCk6IHZvaWQge1xuICAgICAgICBsZXQgcmVkaXJlY3RVcmw6IHN0cmluZyA9IHRoaXMuZ2V0UmVkaXJlY3RVcmwoKTtcbiAgICAgICAgdGhpcy5fbG9nLmluZm8oXCJSZWRpcmVjdGluZyB0byBcIiArIHJlZGlyZWN0VXJsKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJlZGlyZWN0VXJsO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2dpbkZyb21Db2RlKHBhcmFtczogUGFyYW1zKSB7XG4gICAgICAgIGlmICghcGFyYW1zLmNvZGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGluZy5vbigpO1xuICAgICAgICB0aGlzLl9sb2cuZGVidWcoJ0hhbmRsaW5nIGFjY2VzcyB0b2tlbjogJyArIHBhcmFtcy5jb2RlKVxuICAgICAgICBjb25zdCB0b2tlbiQgPSB0aGlzLmdldFRva2VuKHtcbiAgICAgICAgICAgIGdyYW50VHlwZTogJ2F1dGhvcml6YXRpb25fY29kZScsXG4gICAgICAgICAgICBjb2RlOiBwYXJhbXMuY29kZSxcbiAgICAgICAgICAgIHJlYWxtSWQ6ICcnLCAvLyB0b2RvIHNlbmQgcmVhbG0gaWRcbiAgICAgICAgICAgIHJlZGlyZWN0VXJpOiBsb2NhdGlvbi5vcmlnaW4gKyAnLycgKyB0aGlzLl9jb25maWcuZ2V0Q29uZmlndXJhdGlvblN1YnRyZWUoWydzZXJ2aWNlcycsICdhdXRoJywgJ3RvTG9naW5SZWRpcmVjdCddKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRva2VuJC5zdWJzY3JpYmUoXG4gICAgICAgICAgICB0b2tlbiA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nLm9mZigpO1xuICAgICAgICAgICAgICAgIGlmICghIXRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RUb0hvbWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRSZWRpcmVjdFVybCgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBteVF1ZXJ5ID0gdGhpcy5fc3NvQ29uZmlnLnJlZGlyZWN0VXJsICsgJz8nO1xuICAgICAgICBjb25zdCBvcHRpb25zOiB7IFtpbmRleDogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMuX3Nzb0NvbmZpZy5jbGllbnRJZCxcbiAgICAgICAgICAgIHJlZGlyZWN0X3VyaTogbG9jYXRpb24ub3JpZ2luICsgJy8nICsgdGhpcy5fY29uZmlnLmdldENvbmZpZ3VyYXRpb25TdWJ0cmVlKFsnc2VydmljZXMnLCAnYXV0aCcsICd0b0xvZ2luUmVkaXJlY3QnXSksXG4gICAgICAgICAgICByZXNwb25zZV90eXBlOiAnY29kZScsXG4gICAgICAgICAgICBzY29wZTogdGhpcy5fc3NvQ29uZmlnLnNjb3Blcy5qb2luKCcgJyksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBteVF1ZXJ5ICsgT2JqZWN0LmtleXMob3B0aW9ucykubWFwKFxuICAgICAgICAgICAga2V5ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQob3B0aW9uc1trZXldKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICkuam9pbignJicpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRUb2tlbihib2R5OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLl9zc29Db25maWcucmVmcmVzaFVybDtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignUmVmcmVzaCBVUkwgaXMgbm90IGRlZmluZWQgaW4gdGhlIGNvbmZpZyBbbmFlLnByb3ZpZGVycy5hdXRoLnNzby5yZWZyZXNoVXJsXScpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5wb3N0KHVybCwgYm9keSxcbiAgICAgICAgICAgIHtoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ319KS5waXBlKFxuICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nLm9mZigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NuYWNrYmFyLm9wZW5FcnJvclNuYWNrQmFyKHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCdmb3Jtcy5sb2dpbi53cm9uZ0NyZWRlbnRpYWxzJykpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWRpcmVjdFRvSG9tZSgpIHtcbiAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFsnLycgKyB0aGlzLl9jb25maWcuZ2V0Q29uZmlndXJhdGlvblN1YnRyZWUoWydzZXJ2aWNlcycsICdhdXRoJywgJ29uTG9naW5SZWRpcmVjdCddKV0pXG4gICAgICAgICAgICAudGhlbigodmFsdWUpID0+IHsgdGhpcy5fbG9nLmRlYnVnKCdSb3V0ZWQgdG8gJyArIHZhbHVlKTsgfSk7XG4gICAgfVxufVxuIl19