@okta/okta-angular
Version:
Angular support for Okta
136 lines • 18.6 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
/*
* Copyright (c) 2017-Present, Okta, Inc. and/or its affiliates. All rights reserved.
* The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
*
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and limitations under the License.
*/
import { Injectable, Inject } from '@angular/core';
import { Router, NavigationStart } from '@angular/router';
import { filter } from 'rxjs/operators';
import { OKTA_AUTH } from './models/okta.config';
import * as i0 from "@angular/core";
import * as i1 from "./services/auth-config.serice";
import * as i2 from "@okta/okta-auth-js";
export class OktaAuthGuard {
constructor(oktaAuth, injector, configService) {
this.oktaAuth = oktaAuth;
this.injector = injector;
this.configService = configService;
this.updateAuthStateListener = (authState) => __awaiter(this, void 0, void 0, function* () {
const isAuthenticated = yield this.isAuthenticated(this.routeData, authState);
if (!isAuthenticated) {
this.handleLogin(this.state.url, this.routeData);
}
});
const config = this.configService.getConfig();
if (!config) {
throw new Error('Okta config is not provided');
}
this.onAuthRequired = config.onAuthRequired;
// Unsubscribe updateAuthStateListener when route change
const router = injector.get(Router);
router.events.pipe(filter((e) => e instanceof NavigationStart && this.state && this.state.url !== e.url)).subscribe(() => {
this.oktaAuth.authStateManager.unsubscribe(this.updateAuthStateListener);
});
}
canLoad(route) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
this.onAuthRequired = ((_a = route.data) === null || _a === void 0 ? void 0 : _a.onAuthRequired) || this.onAuthRequired;
const isAuthenticated = yield this.isAuthenticated(route.data);
if (isAuthenticated) {
return true;
}
const router = this.injector.get(Router);
const nav = router.getCurrentNavigation();
const originalUri = nav ? nav.extractedUrl.toString() : undefined;
yield this.handleLogin(originalUri, route.data);
return false;
});
}
/**
* Gateway for protected route. Returns true if there is a valid idToken,
* otherwise it will cache the route and start the login flow.
* @param route
* @param state
*/
canActivate(route, state) {
return __awaiter(this, void 0, void 0, function* () {
// Track states for current route
this.state = state;
this.routeData = route.data;
this.onAuthRequired = route.data && route.data.onAuthRequired || this.onAuthRequired;
// Protect the route after accessing
this.oktaAuth.authStateManager.subscribe(this.updateAuthStateListener);
const isAuthenticated = yield this.isAuthenticated(route.data);
if (isAuthenticated) {
return true;
}
yield this.handleLogin(state.url, route.data);
return false;
});
}
canActivateChild(route, state) {
return __awaiter(this, void 0, void 0, function* () {
return this.canActivate(route, state);
});
}
isAuthenticated(routeData, authState) {
var _a, _b, _c;
return __awaiter(this, void 0, void 0, function* () {
const isAuthenticated = authState ? authState === null || authState === void 0 ? void 0 : authState.isAuthenticated : yield this.oktaAuth.isAuthenticated();
let res = isAuthenticated;
if ((_a = routeData === null || routeData === void 0 ? void 0 : routeData.okta) === null || _a === void 0 ? void 0 : _a.acrValues) {
if (!authState) {
authState = this.oktaAuth.authStateManager.getAuthState();
}
res = ((_b = authState === null || authState === void 0 ? void 0 : authState.idToken) === null || _b === void 0 ? void 0 : _b.claims.acr) === ((_c = routeData === null || routeData === void 0 ? void 0 : routeData.okta) === null || _c === void 0 ? void 0 : _c.acrValues);
}
return res;
});
}
handleLogin(originalUri, routeData) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
// Store the current path
if (originalUri) {
this.oktaAuth.setOriginalUri(originalUri);
}
const options = {};
if ((_a = routeData === null || routeData === void 0 ? void 0 : routeData.okta) === null || _a === void 0 ? void 0 : _a.acrValues) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore Supports auth-js >= 7.1.0
options.acrValues = routeData.okta.acrValues;
}
if (this.onAuthRequired) {
this.onAuthRequired(this.oktaAuth, this.injector, options);
}
else {
this.oktaAuth.signInWithRedirect(options);
}
});
}
}
OktaAuthGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: OktaAuthGuard, deps: [{ token: OKTA_AUTH }, { token: i0.Injector }, { token: i1.OktaAuthConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
OktaAuthGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: OktaAuthGuard });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: OktaAuthGuard, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i2.OktaAuth, decorators: [{
type: Inject,
args: [OKTA_AUTH]
}] }, { type: i0.Injector }, { type: i1.OktaAuthConfigService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2t0YS5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9zcmMvb2t0YS9va3RhLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFZLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBS0wsTUFBTSxFQUNOLGVBQWUsRUFLaEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJeEMsT0FBTyxFQUF3QixTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7OztBQUd2RSxNQUFNLE9BQU8sYUFBYTtJQUt4QixZQUM2QixRQUFrQixFQUNyQyxRQUFrQixFQUNsQixhQUFvQztRQUZqQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ3JDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsa0JBQWEsR0FBYixhQUFhLENBQXVCO1FBZ0d0Qyw0QkFBdUIsR0FBRyxDQUFPLFNBQW9CLEVBQUUsRUFBRTtZQUMvRCxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM5RSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNsRDtRQUNILENBQUMsQ0FBQSxDQUFDO1FBbkdBLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztTQUNoRDtRQUNELElBQUksQ0FBQyxjQUFjLEdBQUcs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MkJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTctUHJlc2VudCwgT2t0YSwgSW5jLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBUaGUgT2t0YSBzb2Z0d2FyZSBhY2NvbXBhbmllZCBieSB0aGlzIG5vdGljZSBpcyBwcm92aWRlZCBwdXJzdWFudCB0byB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlLlwiKVxuICpcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVRcbiAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdG9yLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENhbkFjdGl2YXRlLFxuICBDYW5BY3RpdmF0ZUNoaWxkLFxuICBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICBSb3V0ZXJTdGF0ZVNuYXBzaG90LFxuICBSb3V0ZXIsXG4gIE5hdmlnYXRpb25TdGFydCwgXG4gIEV2ZW50LFxuICBDYW5Mb2FkLFxuICBSb3V0ZSxcbiAgRGF0YVxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBPa3RhQXV0aCwgQXV0aFN0YXRlLCBUb2tlblBhcmFtcyB9IGZyb20gJ0Bva3RhL29rdGEtYXV0aC1qcyc7XG5pbXBvcnQgeyBPa3RhQXV0aENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2F1dGgtY29uZmlnLnNlcmljZSc7XG5pbXBvcnQgeyBBdXRoUmVxdWlyZWRGdW5jdGlvbiwgT0tUQV9BVVRIIH0gZnJvbSAnLi9tb2RlbHMvb2t0YS5jb25maWcnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT2t0YUF1dGhHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlLCBDYW5BY3RpdmF0ZUNoaWxkLCBDYW5Mb2FkIHtcbiAgcHJpdmF0ZSBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdDtcbiAgcHJpdmF0ZSByb3V0ZURhdGE6IERhdGE7XG4gIHByaXZhdGUgb25BdXRoUmVxdWlyZWQ/OiBBdXRoUmVxdWlyZWRGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE9LVEFfQVVUSCkgcHJpdmF0ZSBva3RhQXV0aDogT2t0YUF1dGgsIFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogT2t0YUF1dGhDb25maWdTZXJ2aWNlXG4gICkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnU2VydmljZS5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPa3RhIGNvbmZpZyBpcyBub3QgcHJvdmlkZWQnKTtcbiAgICB9XG4gICAgdGhpcy5vbkF1dGhSZXF1aXJlZCA9IGNvbmZpZy5vbkF1dGhSZXF1aXJlZDtcblxuICAgIC8vIFVuc3Vic2NyaWJlIHVwZGF0ZUF1dGhTdGF0ZUxpc3RlbmVyIHdoZW4gcm91dGUgY2hhbmdlXG4gICAgY29uc3Qgcm91dGVyID0gaW5qZWN0b3IuZ2V0KFJvdXRlcik7XG4gICAgcm91dGVyLmV2ZW50cy5waXBlKFxuICAgICAgZmlsdGVyKChlOiBFdmVudCkgPT4gZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCAmJiB0aGlzLnN0YXRlICYmIHRoaXMuc3RhdGUudXJsICE9PSBlLnVybClcbiAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLm9rdGFBdXRoLmF1dGhTdGF0ZU1hbmFnZXIudW5zdWJzY3JpYmUodGhpcy51cGRhdGVBdXRoU3RhdGVMaXN0ZW5lcik7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBjYW5Mb2FkKHJvdXRlOiBSb3V0ZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMub25BdXRoUmVxdWlyZWQgPSByb3V0ZS5kYXRhPy5vbkF1dGhSZXF1aXJlZCB8fCB0aGlzLm9uQXV0aFJlcXVpcmVkO1xuXG4gICAgY29uc3QgaXNBdXRoZW50aWNhdGVkID0gYXdhaXQgdGhpcy5pc0F1dGhlbnRpY2F0ZWQocm91dGUuZGF0YSk7XG4gICAgaWYgKGlzQXV0aGVudGljYXRlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3Qgcm91dGVyID0gdGhpcy5pbmplY3Rvci5nZXQoUm91dGVyKTtcbiAgICBjb25zdCBuYXYgPSByb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb24oKTtcbiAgICBjb25zdCBvcmlnaW5hbFVyaSA9IG5hdiA/IG5hdi5leHRyYWN0ZWRVcmwudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDtcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUxvZ2luKG9yaWdpbmFsVXJpLCByb3V0ZS5kYXRhKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHYXRld2F5IGZvciBwcm90ZWN0ZWQgcm91dGUuIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIHZhbGlkIGlkVG9rZW4sXG4gICAqIG90aGVyd2lzZSBpdCB3aWxsIGNhY2hlIHRoZSByb3V0ZSBhbmQgc3RhcnQgdGhlIGxvZ2luIGZsb3cuXG4gICAqIEBwYXJhbSByb3V0ZVxuICAgKiBAcGFyYW0gc3RhdGVcbiAgICovXG4gIGFzeW5jIGNhbkFjdGl2YXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFRyYWNrIHN0YXRlcyBmb3IgY3VycmVudCByb3V0ZVxuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLnJvdXRlRGF0YSA9IHJvdXRlLmRhdGE7XG4gICAgdGhpcy5vbkF1dGhSZXF1aXJlZCA9IHJvdXRlLmRhdGEgJiYgcm91dGUuZGF0YS5vbkF1dGhSZXF1aXJlZCB8fCB0aGlzLm9uQXV0aFJlcXVpcmVkO1xuXG4gICAgLy8gUHJvdGVjdCB0aGUgcm91dGUgYWZ0ZXIgYWNjZXNzaW5nXG4gICAgdGhpcy5va3RhQXV0aC5hdXRoU3RhdGVNYW5hZ2VyLnN1YnNjcmliZSh0aGlzLnVwZGF0ZUF1dGhTdGF0ZUxpc3RlbmVyKTtcbiAgICBjb25zdCBpc0F1dGhlbnRpY2F0ZWQgPSBhd2FpdCB0aGlzLmlzQXV0aGVudGljYXRlZChyb3V0ZS5kYXRhKTtcbiAgICBpZiAoaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmhhbmRsZUxvZ2luKHN0YXRlLnVybCwgcm91dGUuZGF0YSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyBjYW5BY3RpdmF0ZUNoaWxkKFxuICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICAgIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90XG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmNhbkFjdGl2YXRlKHJvdXRlLCBzdGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGlzQXV0aGVudGljYXRlZChyb3V0ZURhdGE/OiBEYXRhLCBhdXRoU3RhdGU/OiBBdXRoU3RhdGUgfCBudWxsKSB7XG4gICAgY29uc3QgaXNBdXRoZW50aWNhdGVkID0gYXV0aFN0YXRlID8gYXV0aFN0YXRlPy5pc0F1dGhlbnRpY2F0ZWQgOiBhd2FpdCB0aGlzLm9rdGFBdXRoLmlzQXV0aGVudGljYXRlZCgpO1xuICAgIGxldCByZXMgPSBpc0F1dGhlbnRpY2F0ZWQ7XG4gICAgaWYgKHJvdXRlRGF0YT8ub2t0YT8uYWNyVmFsdWVzKSB7XG4gICAgICBpZiAoIWF1dGhTdGF0ZSkge1xuICAgICAgICBhdXRoU3RhdGUgPSB0aGlzLm9rdGFBdXRoLmF1dGhTdGF0ZU1hbmFnZXIuZ2V0QXV0aFN0YXRlKCk7XG4gICAgICB9XG4gICAgICByZXMgPSBhdXRoU3RhdGU/LmlkVG9rZW4/LmNsYWltcy5hY3IgPT09IHJvdXRlRGF0YT8ub2t0YT8uYWNyVmFsdWVzO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVMb2dpbihvcmlnaW5hbFVyaT86IHN0cmluZywgcm91dGVEYXRhPzogRGF0YSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IHBhdGhcbiAgICBpZiAob3JpZ2luYWxVcmkpIHtcbiAgICAgIHRoaXMub2t0YUF1dGguc2V0T3JpZ2luYWxVcmkob3JpZ2luYWxVcmkpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IFRva2VuUGFyYW1zID0ge307XG4gICAgaWYgKHJvdXRlRGF0YT8ub2t0YT8uYWNyVmFsdWVzKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAvLyBAdHMtaWdub3JlIFN1cHBvcnRzIGF1dGgtanMgPj0gNy4xLjBcbiAgICAgIG9wdGlvbnMuYWNyVmFsdWVzID0gcm91dGVEYXRhLm9rdGEuYWNyVmFsdWVzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9uQXV0aFJlcXVpcmVkKSB7XG4gICAgICB0aGlzLm9uQXV0aFJlcXVpcmVkKHRoaXMub2t0YUF1dGgsIHRoaXMuaW5qZWN0b3IsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9rdGFBdXRoLnNpZ25JbldpdGhSZWRpcmVjdChvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUF1dGhTdGF0ZUxpc3RlbmVyID0gYXN5bmMgKGF1dGhTdGF0ZTogQXV0aFN0YXRlKSA9PiB7XG4gICAgY29uc3QgaXNBdXRoZW50aWNhdGVkID0gYXdhaXQgdGhpcy5pc0F1dGhlbnRpY2F0ZWQodGhpcy5yb3V0ZURhdGEsIGF1dGhTdGF0ZSk7XG4gICAgaWYgKCFpc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIHRoaXMuaGFuZGxlTG9naW4odGhpcy5zdGF0ZS51cmwsIHRoaXMucm91dGVEYXRhKTtcbiAgICB9XG4gIH07XG5cbn1cbiJdfQ==