angular-simple-oidc
Version:
Angular Library implementing Open Id Connect specification. Code Flow, Refresh Tokens, Session Management, Discovery Document.
79 lines • 11.2 kB
JavaScript
import { InjectionToken, APP_INITIALIZER, Optional } from '@angular/core';
import { isObservable, of } from 'rxjs';
import { ConfigService } from 'angular-simple-oidc/config';
import { AUTH_CONFIG_REQUIRED_FIELDS } from './config/models';
import { tap, catchError, map } from 'rxjs/operators';
import { EventsService } from 'angular-simple-oidc/events';
import { AuthenticationConfigurationMissingError } from './errors';
export const WINDOW_REF = new InjectionToken('Angular Simple OIDC Window Reference');
export const LOCAL_STORAGE_REF = new InjectionToken('Angular Simple OIDC LocalStorage Reference');
export function localStorageFactory() {
return localStorage;
}
export const LOCAL_STORAGE_PROVIDER = {
provide: LOCAL_STORAGE_REF,
useFactory: localStorageFactory
};
export function windowFactory() {
return window;
}
export const WINDOW_PROVIDER = {
provide: WINDOW_REF,
useFactory: windowFactory
};
// Configuration
export const AUTH_CONFIG_SERVICE = new InjectionToken('AUTH_CONFIG');
export const AUTH_CONFIG = new InjectionToken('AUTH_CONFIG');
const defaultConfig = {
discoveryDocumentUrl: `/.well-known/openid-configuration`,
tokenCallbackRoute: 'oidc-token-callback',
tokenValidation: {
disableIdTokenIATValidation: false,
idTokenIATOffsetAllowed: 10 // seconds
},
enableAuthorizationCallbackAppInitializer: true
};
function getApplicationBaseUrl() {
const base = document.querySelector('base');
return base && base.href || '';
}
export function authConfigFactory(configInput, configService, window, events) {
if (!configInput) {
throw new AuthenticationConfigurationMissingError();
}
const config$ = isObservable(configInput) ? configInput : of(configInput);
return () => config$.pipe(map(config => {
if (config && config.openIDProviderUrl) {
// do not modify the provided objects.
return Object.assign(Object.assign({}, config), { openIDProviderUrl: config.openIDProviderUrl.toLowerCase() });
}
return config;
}), tap(config => configService.configure(config, {
defaultConfig: Object.assign(Object.assign({}, defaultConfig), { baseUrl: getApplicationBaseUrl() }),
requiredFields: AUTH_CONFIG_REQUIRED_FIELDS
})), catchError(e => {
// make sure this errors get logged.
console.error('Callback failed in AUTH_CONFIG_INITIALIZER');
console.error(e);
events.dispatchError(e);
// Do not prevent bootstrapping in order to be able to handle errors gracefully.
return of(null);
}))
.toPromise();
}
export const AUTH_CONFIG_INITIALIZER = {
multi: true,
provide: APP_INITIALIZER,
deps: [
[new Optional(), AUTH_CONFIG],
AUTH_CONFIG_SERVICE,
WINDOW_REF,
EventsService
],
useFactory: authConfigFactory
};
export const AUTH_CONFIG_SERVICE_PROVIDER = {
provide: AUTH_CONFIG_SERVICE,
useClass: ConfigService,
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1zaW1wbGUtb2lkYy9zcmMvbGliL3Byb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFZLGVBQWUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEYsT0FBTyxFQUFjLFlBQVksRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBYywyQkFBMkIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFbkUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLElBQUksY0FBYyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7QUFDckYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxjQUFjLENBQUMsNENBQTRDLENBQUMsQ0FBQztBQUVsRyxNQUFNLFVBQVUsbUJBQW1CO0lBQy9CLE9BQU8sWUFBWSxDQUFDO0FBQ3hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBYTtJQUM1QyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFVBQVUsRUFBRSxtQkFBbUI7Q0FDbEMsQ0FBQztBQUVGLE1BQU0sVUFBVSxhQUFhO0lBQ3pCLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWE7SUFDckMsT0FBTyxFQUFFLFVBQVU7SUFDbkIsVUFBVSxFQUFFLGFBQWE7Q0FDNUIsQ0FBQztBQUVGLGdCQUFnQjtBQUNoQixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGNBQWMsQ0FBNEIsYUFBYSxDQUFDLENBQUM7QUFFaEcsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLElBQUksY0FBYyxDQUFzQyxhQUFhLENBQUMsQ0FBQztBQUVsRyxNQUFNLGFBQWEsR0FBd0I7SUFDdkMsb0JBQW9CLEVBQUUsbUNBQW1DO0lBQ3pELGtCQUFrQixFQUFFLHFCQUFxQjtJQUN6QyxlQUFlLEVBQUU7UUFDYiwyQkFBMkIsRUFBRSxLQUFLO1FBQ2xDLHVCQUF1QixFQUFFLEVBQUUsQ0FBQyxVQUFVO0tBQ3pDO0lBQ0QseUNBQXlDLEVBQUUsSUFBSTtDQUNsRCxDQUFDO0FBRUYsU0FBUyxxQkFBcUI7SUFDMUIsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUNuQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUM3QixXQUFnRCxFQUNoRCxhQUF3QyxFQUN4QyxNQUFjLEVBQ2QsTUFBcUI7SUFFckIsSUFBSSxDQUFDLFdBQVcsRUFBRTtRQUNkLE1BQU0sSUFBSSx1Q0FBdUMsRUFBRSxDQUFDO0tBQ3ZEO0lBRUQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUUxRSxPQUFPLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3JCLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNULElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRTtZQUNwQyxzQ0FBc0M7WUFDdEMsdUNBQ08sTUFBTSxLQUNULGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsSUFDM0Q7U0FDTDtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO1FBQzFDLGFBQWEsa0NBQ04sYUFBYSxLQUNoQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsR0FDbkM7UUFDRCxjQUFjLEVBQUUsMkJBQTJCO0tBQzlDLENBQUMsQ0FBQyxFQUNILFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUVYLG9DQUFvQztRQUNwQyxPQUFPLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDNUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVqQixNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXhCLGdGQUFnRjtRQUNoRixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDLENBQUMsQ0FDTDtTQUNJLFNBQVMsRUFBRSxDQUFDO0FBQ3JCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRztJQUNuQyxLQUFLLEVBQUUsSUFBSTtJQUNYLE9BQU8sRUFBRSxlQUFlO0lBQ3hCLElBQUksRUFBRTtRQUNGLENBQUMsSUFBSSxRQUFRLEVBQUUsRUFBRSxXQUFXLENBQUM7UUFDN0IsbUJBQW1CO1FBQ25CLFVBQVU7UUFDVixhQUFhO0tBQ2hCO0lBQ0QsVUFBVSxFQUFFLGlCQUFpQjtDQUNoQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQWE7SUFDbEQsT0FBTyxFQUFFLG1CQUFtQjtJQUM1QixRQUFRLEVBQUUsYUFBYTtDQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIFByb3ZpZGVyLCBBUFBfSU5JVElBTElaRVIsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBpc09ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnYW5ndWxhci1zaW1wbGUtb2lkYy9jb25maWcnO1xuaW1wb3J0IHsgQXV0aENvbmZpZywgQVVUSF9DT05GSUdfUkVRVUlSRURfRklFTERTIH0gZnJvbSAnLi9jb25maWcvbW9kZWxzJztcbmltcG9ydCB7IHRhcCwgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRXZlbnRzU2VydmljZSB9IGZyb20gJ2FuZ3VsYXItc2ltcGxlLW9pZGMvZXZlbnRzJztcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uQ29uZmlndXJhdGlvbk1pc3NpbmdFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcblxuZXhwb3J0IGNvbnN0IFdJTkRPV19SRUYgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0FuZ3VsYXIgU2ltcGxlIE9JREMgV2luZG93IFJlZmVyZW5jZScpO1xuZXhwb3J0IGNvbnN0IExPQ0FMX1NUT1JBR0VfUkVGID0gbmV3IEluamVjdGlvblRva2VuKCdBbmd1bGFyIFNpbXBsZSBPSURDIExvY2FsU3RvcmFnZSBSZWZlcmVuY2UnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsU3RvcmFnZUZhY3RvcnkoKTogU3RvcmFnZSB7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZTtcbn1cblxuZXhwb3J0IGNvbnN0IExPQ0FMX1NUT1JBR0VfUFJPVklERVI6IFByb3ZpZGVyID0ge1xuICAgIHByb3ZpZGU6IExPQ0FMX1NUT1JBR0VfUkVGLFxuICAgIHVzZUZhY3Rvcnk6IGxvY2FsU3RvcmFnZUZhY3Rvcnlcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB3aW5kb3dGYWN0b3J5KCk6IFdpbmRvdyB7XG4gICAgcmV0dXJuIHdpbmRvdztcbn1cblxuZXhwb3J0IGNvbnN0IFdJTkRPV19QUk9WSURFUjogUHJvdmlkZXIgPSB7XG4gICAgcHJvdmlkZTogV0lORE9XX1JFRixcbiAgICB1c2VGYWN0b3J5OiB3aW5kb3dGYWN0b3J5XG59O1xuXG4vLyBDb25maWd1cmF0aW9uXG5leHBvcnQgY29uc3QgQVVUSF9DT05GSUdfU0VSVklDRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxDb25maWdTZXJ2aWNlPEF1dGhDb25maWc+PignQVVUSF9DT05GSUcnKTtcblxuZXhwb3J0IGNvbnN0IEFVVEhfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPE9ic2VydmFibGU8QXV0aENvbmZpZz4gfCBBdXRoQ29uZmlnPignQVVUSF9DT05GSUcnKTtcblxuY29uc3QgZGVmYXVsdENvbmZpZzogUGFydGlhbDxBdXRoQ29uZmlnPiA9IHtcbiAgICBkaXNjb3ZlcnlEb2N1bWVudFVybDogYC8ud2VsbC1rbm93bi9vcGVuaWQtY29uZmlndXJhdGlvbmAsXG4gICAgdG9rZW5DYWxsYmFja1JvdXRlOiAnb2lkYy10b2tlbi1jYWxsYmFjaycsXG4gICAgdG9rZW5WYWxpZGF0aW9uOiB7XG4gICAgICAgIGRpc2FibGVJZFRva2VuSUFUVmFsaWRhdGlvbjogZmFsc2UsXG4gICAgICAgIGlkVG9rZW5JQVRPZmZzZXRBbGxvd2VkOiAxMCAvLyBzZWNvbmRzXG4gICAgfSxcbiAgICBlbmFibGVBdXRob3JpemF0aW9uQ2FsbGJhY2tBcHBJbml0aWFsaXplcjogdHJ1ZVxufTtcblxuZnVuY3Rpb24gZ2V0QXBwbGljYXRpb25CYXNlVXJsKCkge1xuICAgIGNvbnN0IGJhc2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdiYXNlJyk7XG4gICAgcmV0dXJuIGJhc2UgJiYgYmFzZS5ocmVmIHx8ICcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXV0aENvbmZpZ0ZhY3RvcnkoXG4gICAgY29uZmlnSW5wdXQ6IE9ic2VydmFibGU8QXV0aENvbmZpZz4gfCBBdXRoQ29uZmlnLFxuICAgIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2U8QXV0aENvbmZpZz4sXG4gICAgd2luZG93OiBXaW5kb3csXG4gICAgZXZlbnRzOiBFdmVudHNTZXJ2aWNlKSB7XG5cbiAgICBpZiAoIWNvbmZpZ0lucHV0KSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkNvbmZpZ3VyYXRpb25NaXNzaW5nRXJyb3IoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWckID0gaXNPYnNlcnZhYmxlKGNvbmZpZ0lucHV0KSA/IGNvbmZpZ0lucHV0IDogb2YoY29uZmlnSW5wdXQpO1xuXG4gICAgcmV0dXJuICgpID0+IGNvbmZpZyQucGlwZShcbiAgICAgICAgbWFwKGNvbmZpZyA9PiB7XG4gICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5vcGVuSURQcm92aWRlclVybCkge1xuICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBtb2RpZnkgdGhlIHByb3ZpZGVkIG9iamVjdHMuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBvcGVuSURQcm92aWRlclVybDogY29uZmlnLm9wZW5JRFByb3ZpZGVyVXJsLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgfSksXG4gICAgICAgIHRhcChjb25maWcgPT4gY29uZmlnU2VydmljZS5jb25maWd1cmUoY29uZmlnLCB7XG4gICAgICAgICAgICBkZWZhdWx0Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgLi4uZGVmYXVsdENvbmZpZyxcbiAgICAgICAgICAgICAgICBiYXNlVXJsOiBnZXRBcHBsaWNhdGlvbkJhc2VVcmwoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZEZpZWxkczogQVVUSF9DT05GSUdfUkVRVUlSRURfRklFTERTXG4gICAgICAgIH0pKSxcbiAgICAgICAgY2F0Y2hFcnJvcihlID0+IHtcblxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoaXMgZXJyb3JzIGdldCBsb2dnZWQuXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYWxsYmFjayBmYWlsZWQgaW4gQVVUSF9DT05GSUdfSU5JVElBTElaRVInKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG5cbiAgICAgICAgICAgIGV2ZW50cy5kaXNwYXRjaEVycm9yKGUpO1xuXG4gICAgICAgICAgICAvLyBEbyBub3QgcHJldmVudCBib290c3RyYXBwaW5nIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gaGFuZGxlIGVycm9ycyBncmFjZWZ1bGx5LlxuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICB9KVxuICAgIClcbiAgICAgICAgLnRvUHJvbWlzZSgpO1xufVxuXG5leHBvcnQgY29uc3QgQVVUSF9DT05GSUdfSU5JVElBTElaRVIgPSB7XG4gICAgbXVsdGk6IHRydWUsXG4gICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgIGRlcHM6IFtcbiAgICAgICAgW25ldyBPcHRpb25hbCgpLCBBVVRIX0NPTkZJR10sXG4gICAgICAgIEFVVEhfQ09ORklHX1NFUlZJQ0UsXG4gICAgICAgIFdJTkRPV19SRUYsXG4gICAgICAgIEV2ZW50c1NlcnZpY2VcbiAgICBdLFxuICAgIHVzZUZhY3Rvcnk6IGF1dGhDb25maWdGYWN0b3J5XG59O1xuXG5leHBvcnQgY29uc3QgQVVUSF9DT05GSUdfU0VSVklDRV9QUk9WSURFUjogUHJvdmlkZXIgPSB7XG4gICAgcHJvdmlkZTogQVVUSF9DT05GSUdfU0VSVklDRSxcbiAgICB1c2VDbGFzczogQ29uZmlnU2VydmljZSxcbn07XG4iXX0=