angular-auth-oidc-client
Version:
Angular Lib for OpenID Connect & OAuth2
92 lines • 17.4 kB
JavaScript
import { Injectable, inject } from '@angular/core';
import { of, throwError } from 'rxjs';
import { switchMap, take } from 'rxjs/operators';
import { CheckAuthService } from '../../auth-state/check-auth.service';
import { AuthWellKnownService } from '../../config/auth-well-known/auth-well-known.service';
import { LoggerService } from '../../logging/logger.service';
import { RedirectService } from '../../utils/redirect/redirect.service';
import { UrlService } from '../../utils/url/url.service';
import { PopUpService } from '../popup/popup.service';
import { ResponseTypeValidationService } from '../response-type-validation/response-type-validation.service';
import { ParService } from './par.service';
import * as i0 from "@angular/core";
export class ParLoginService {
constructor() {
this.loggerService = inject(LoggerService);
this.responseTypeValidationService = inject(ResponseTypeValidationService);
this.urlService = inject(UrlService);
this.redirectService = inject(RedirectService);
this.authWellKnownService = inject(AuthWellKnownService);
this.popupService = inject(PopUpService);
this.checkAuthService = inject(CheckAuthService);
this.parService = inject(ParService);
}
loginPar(configuration, authOptions) {
if (!this.responseTypeValidationService.hasConfigValidResponseType(configuration)) {
this.loggerService.logError(configuration, 'Invalid response type!');
return;
}
this.loggerService.logDebug(configuration, 'BEGIN Authorize OIDC Flow, no auth data');
this.authWellKnownService
.queryAndStoreAuthWellKnownEndPoints(configuration)
.pipe(switchMap(() => this.parService.postParRequest(configuration, authOptions)))
.subscribe((response) => {
this.loggerService.logDebug(configuration, 'par response: ', response);
const url = this.urlService.getAuthorizeParUrl(response.requestUri, configuration);
this.loggerService.logDebug(configuration, 'par request url: ', url);
if (!url) {
this.loggerService.logError(configuration, `Could not create URL with param ${response.requestUri}: '${url}'`);
return;
}
if (authOptions?.urlHandler) {
authOptions.urlHandler(url);
}
else {
this.redirectService.redirectTo(url);
}
});
}
loginWithPopUpPar(configuration, allConfigs, authOptions, popupOptions) {
const { configId } = configuration;
if (!this.responseTypeValidationService.hasConfigValidResponseType(configuration)) {
const errorMessage = 'Invalid response type!';
this.loggerService.logError(configuration, errorMessage);
return throwError(() => new Error(errorMessage));
}
this.loggerService.logDebug(configuration, 'BEGIN Authorize OIDC Flow with popup, no auth data');
return this.authWellKnownService
.queryAndStoreAuthWellKnownEndPoints(configuration)
.pipe(switchMap(() => this.parService.postParRequest(configuration, authOptions)), switchMap((response) => {
this.loggerService.logDebug(configuration, `par response: ${response}`);
const url = this.urlService.getAuthorizeParUrl(response.requestUri, configuration);
this.loggerService.logDebug(configuration, 'par request url: ', url);
if (!url) {
const errorMessage = `Could not create URL with param ${response.requestUri}: 'url'`;
this.loggerService.logError(configuration, errorMessage);
return throwError(() => new Error(errorMessage));
}
this.popupService.openPopUp(url, popupOptions, configuration);
return this.popupService.result$.pipe(take(1), switchMap((result) => {
const { userClosed, receivedUrl } = result;
if (userClosed) {
return of({
isAuthenticated: false,
errorMessage: 'User closed popup',
userData: null,
idToken: '',
accessToken: '',
configId,
});
}
return this.checkAuthService.checkAuth(configuration, allConfigs, receivedUrl);
}));
}));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: ParLoginService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: ParLoginService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: ParLoginService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyLWxvZ2luLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWF1dGgtb2lkYy1jbGllbnQvc3JjL2xpYi9sb2dpbi9wYXIvcGFyLWxvZ2luLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFjLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUU1RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUl6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sOERBQThELENBQUM7QUFFN0csT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFHM0MsTUFBTSxPQUFPLGVBQWU7SUFENUI7UUFFbUIsa0JBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFdEMsa0NBQTZCLEdBQUcsTUFBTSxDQUNyRCw2QkFBNkIsQ0FDOUIsQ0FBQztRQUVlLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFaEMsb0JBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFMUMseUJBQW9C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LFNBQVMsQ0FDcEMsYUFBYSxFQUNiLFVBQVUsRUFDVixXQUFXLENBQ1osQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQzs4R0F2SlUsZUFBZTtrSEFBZixlQUFlLGNBREYsTUFBTTs7MkZBQ25CLGVBQWU7a0JBRDNCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQXV0aE9wdGlvbnMgfSBmcm9tICcuLi8uLi9hdXRoLW9wdGlvbnMnO1xuaW1wb3J0IHsgQ2hlY2tBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL2F1dGgtc3RhdGUvY2hlY2stYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhXZWxsS25vd25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29uZmlnL2F1dGgtd2VsbC1rbm93bi9hdXRoLXdlbGwta25vd24uc2VydmljZSc7XG5pbXBvcnQgeyBPcGVuSWRDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vLi4vY29uZmlnL29wZW5pZC1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9sb2dnaW5nL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZGlyZWN0U2VydmljZSB9IGZyb20gJy4uLy4uL3V0aWxzL3JlZGlyZWN0L3JlZGlyZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVXJsU2VydmljZSB9IGZyb20gJy4uLy4uL3V0aWxzL3VybC91cmwuc2VydmljZSc7XG5pbXBvcnQgeyBMb2dpblJlc3BvbnNlIH0gZnJvbSAnLi4vbG9naW4tcmVzcG9uc2UnO1xuaW1wb3J0IHsgUG9wdXBPcHRpb25zIH0gZnJvbSAnLi4vcG9wdXAvcG9wdXAtb3B0aW9ucyc7XG5pbXBvcnQgeyBQb3B1cFJlc3VsdCB9IGZyb20gJy4uL3BvcHVwL3BvcHVwLXJlc3VsdCc7XG5pbXBvcnQgeyBQb3BVcFNlcnZpY2UgfSBmcm9tICcuLi9wb3B1cC9wb3B1cC5zZXJ2aWNlJztcbmltcG9ydCB7IFJlc3BvbnNlVHlwZVZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vcmVzcG9uc2UtdHlwZS12YWxpZGF0aW9uL3Jlc3BvbnNlLXR5cGUtdmFsaWRhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBhclJlc3BvbnNlIH0gZnJvbSAnLi9wYXItcmVzcG9uc2UnO1xuaW1wb3J0IHsgUGFyU2VydmljZSB9IGZyb20gJy4vcGFyLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFBhckxvZ2luU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyU2VydmljZSA9IGluamVjdChMb2dnZXJTZXJ2aWNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJlc3BvbnNlVHlwZVZhbGlkYXRpb25TZXJ2aWNlID0gaW5qZWN0KFxuICAgIFJlc3BvbnNlVHlwZVZhbGlkYXRpb25TZXJ2aWNlXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB1cmxTZXJ2aWNlID0gaW5qZWN0KFVybFNlcnZpY2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVkaXJlY3RTZXJ2aWNlID0gaW5qZWN0KFJlZGlyZWN0U2VydmljZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhdXRoV2VsbEtub3duU2VydmljZSA9IGluamVjdChBdXRoV2VsbEtub3duU2VydmljZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwb3B1cFNlcnZpY2UgPSBpbmplY3QoUG9wVXBTZXJ2aWNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNoZWNrQXV0aFNlcnZpY2UgPSBpbmplY3QoQ2hlY2tBdXRoU2VydmljZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJTZXJ2aWNlID0gaW5qZWN0KFBhclNlcnZpY2UpO1xuXG4gIGxvZ2luUGFyKFxuICAgIGNvbmZpZ3VyYXRpb246IE9wZW5JZENvbmZpZ3VyYXRpb24sXG4gICAgYXV0aE9wdGlvbnM/OiBBdXRoT3B0aW9uc1xuICApOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5yZXNwb25zZVR5cGVWYWxpZGF0aW9uU2VydmljZS5oYXNDb25maWdWYWxpZFJlc3BvbnNlVHlwZShcbiAgICAgICAgY29uZmlndXJhdGlvblxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZ0Vycm9yKGNvbmZpZ3VyYXRpb24sICdJbnZhbGlkIHJlc3BvbnNlIHR5cGUhJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nRGVidWcoXG4gICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgJ0JFR0lOIEF1dGhvcml6ZSBPSURDIEZsb3csIG5vIGF1dGggZGF0YSdcbiAgICApO1xuXG4gICAgdGhpcy5hdXRoV2VsbEtub3duU2VydmljZVxuICAgICAgLnF1ZXJ5QW5kU3RvcmVBdXRoV2VsbEtub3duRW5kUG9pbnRzKGNvbmZpZ3VyYXRpb24pXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgdGhpcy5wYXJTZXJ2aWNlLnBvc3RQYXJSZXF1ZXN0KGNvbmZpZ3VyYXRpb24sIGF1dGhPcHRpb25zKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nRGVidWcoY29uZmlndXJhdGlvbiwgJ3BhciByZXNwb25zZTogJywgcmVzcG9uc2UpO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMudXJsU2VydmljZS5nZXRBdXRob3JpemVQYXJVcmwoXG4gICAgICAgICAgcmVzcG9uc2UucmVxdWVzdFVyaSxcbiAgICAgICAgICBjb25maWd1cmF0aW9uXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKGNvbmZpZ3VyYXRpb24sICdwYXIgcmVxdWVzdCB1cmw6ICcsIHVybCk7XG5cbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nRXJyb3IoXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgYENvdWxkIG5vdCBjcmVhdGUgVVJMIHdpdGggcGFyYW0gJHtyZXNwb25zZS5yZXF1ZXN0VXJpfTogJyR7dXJsfSdgXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhdXRoT3B0aW9ucz8udXJsSGFuZGxlcikge1xuICAgICAgICAgIGF1dGhPcHRpb25zLnVybEhhbmRsZXIodXJsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlZGlyZWN0U2VydmljZS5yZWRpcmVjdFRvKHVybCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgbG9naW5XaXRoUG9wVXBQYXIoXG4gICAgY29uZmlndXJhdGlvbjogT3BlbklkQ29uZmlndXJhdGlvbixcbiAgICBhbGxDb25maWdzOiBPcGVuSWRDb25maWd1cmF0aW9uW10sXG4gICAgYXV0aE9wdGlvbnM/OiBBdXRoT3B0aW9ucyxcbiAgICBwb3B1cE9wdGlvbnM/OiBQb3B1cE9wdGlvbnNcbiAgKTogT2JzZXJ2YWJsZTxMb2dpblJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBjb25maWdJZCB9ID0gY29uZmlndXJhdGlvbjtcblxuICAgIGlmIChcbiAgICAgICF0aGlzLnJlc3BvbnNlVHlwZVZhbGlkYXRpb25TZXJ2aWNlLmhhc0NvbmZpZ1ZhbGlkUmVzcG9uc2VUeXBlKFxuICAgICAgICBjb25maWd1cmF0aW9uXG4gICAgICApXG4gICAgKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnSW52YWxpZCByZXNwb25zZSB0eXBlISc7XG5cbiAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2dFcnJvcihjb25maWd1cmF0aW9uLCBlcnJvck1lc3NhZ2UpO1xuXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKFxuICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgICdCRUdJTiBBdXRob3JpemUgT0lEQyBGbG93IHdpdGggcG9wdXAsIG5vIGF1dGggZGF0YSdcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuYXV0aFdlbGxLbm93blNlcnZpY2VcbiAgICAgIC5xdWVyeUFuZFN0b3JlQXV0aFdlbGxLbm93bkVuZFBvaW50cyhjb25maWd1cmF0aW9uKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICAgIHRoaXMucGFyU2VydmljZS5wb3N0UGFyUmVxdWVzdChjb25maWd1cmF0aW9uLCBhdXRoT3B0aW9ucylcbiAgICAgICAgKSxcbiAgICAgICAgc3dpdGNoTWFwKChyZXNwb25zZTogUGFyUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nRGVidWcoXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgYHBhciByZXNwb25zZTogJHtyZXNwb25zZX1gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMudXJsU2VydmljZS5nZXRBdXRob3JpemVQYXJVcmwoXG4gICAgICAgICAgICByZXNwb25zZS5yZXF1ZXN0VXJpLFxuICAgICAgICAgICAgY29uZmlndXJhdGlvblxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nRGVidWcoY29uZmlndXJhdGlvbiwgJ3BhciByZXF1ZXN0IHVybDogJywgdXJsKTtcblxuICAgICAgICAgIGlmICghdXJsKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgQ291bGQgbm90IGNyZWF0ZSBVUkwgd2l0aCBwYXJhbSAke3Jlc3BvbnNlLnJlcXVlc3RVcml9OiAndXJsJ2A7XG5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2dFcnJvcihjb25maWd1cmF0aW9uLCBlcnJvck1lc3NhZ2UpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5wb3B1cFNlcnZpY2Uub3BlblBvcFVwKHVybCwgcG9wdXBPcHRpb25zLCBjb25maWd1cmF0aW9uKTtcblxuICAgICAgICAgIHJldHVybiB0aGlzLnBvcHVwU2VydmljZS5yZXN1bHQkLnBpcGUoXG4gICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKChyZXN1bHQ6IFBvcHVwUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgdXNlckNsb3NlZCwgcmVjZWl2ZWRVcmwgfSA9IHJlc3VsdDtcblxuICAgICAgICAgICAgICBpZiAodXNlckNsb3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvZih7XG4gICAgICAgICAgICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiAnVXNlciBjbG9zZWQgcG9wdXAnLFxuICAgICAgICAgICAgICAgICAgdXNlckRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgICBpZFRva2VuOiAnJyxcbiAgICAgICAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiAnJyxcbiAgICAgICAgICAgICAgICAgIGNvbmZpZ0lkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tBdXRoU2VydmljZS5jaGVja0F1dGgoXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgICAgICAgICAgICBhbGxDb25maWdzLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkVXJsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG59XG4iXX0=