@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
102 lines • 14.9 kB
JavaScript
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