@auth0/angular-jwt
Version:
JSON Web Token helper library for Angular
102 lines • 16.2 kB
JavaScript
import { Injectable, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { JWT_OPTIONS } from './jwtoptions.token';
import { map, mergeMap } from 'rxjs/operators';
import { defer, of } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "./jwthelper.service";
const fromPromiseOrValue = (input) => {
if (input instanceof Promise) {
return defer(() => input);
}
return of(input);
};
export class JwtInterceptor {
constructor(config, jwtHelper, document) {
this.jwtHelper = jwtHelper;
this.document = document;
this.standardPorts = ['80', '443'];
this.tokenGetter = config.tokenGetter;
this.headerName = config.headerName || 'Authorization';
this.authScheme =
config.authScheme || config.authScheme === ''
? config.authScheme
: 'Bearer ';
this.allowedDomains = config.allowedDomains || [];
this.disallowedRoutes = config.disallowedRoutes || [];
this.throwNoTokenError = config.throwNoTokenError || false;
this.skipWhenExpired = config.skipWhenExpired;
}
isAllowedDomain(request) {
const requestUrl = new URL(request.url, this.document.location.origin);
// If the host equals the current window origin,
// the domain is allowed by default
if (requestUrl.host === this.document.location.host) {
return true;
}
// If not the current domain, check the allowed list
const hostName = `${requestUrl.hostname}${requestUrl.port && !this.standardPorts.includes(requestUrl.port)
? ':' + requestUrl.port
: ''}`;
return (this.allowedDomains.findIndex((domain) => typeof domain === 'string'
? domain === hostName
: domain instanceof RegExp
? domain.test(hostName)
: false) > -1);
}
isDisallowedRoute(request) {
const requestedUrl = new URL(request.url, this.document.location.origin);
return (this.disallowedRoutes.findIndex((route) => {
if (typeof route === 'string') {
const parsedRoute = new URL(route, this.document.location.origin);
return (parsedRoute.hostname === requestedUrl.hostname &&
parsedRoute.pathname === requestedUrl.pathname);
}
if (route instanceof RegExp) {
return route.test(request.url);
}
return false;
}) > -1);
}
handleInterception(token, request, next) {
const authScheme = this.jwtHelper.getAuthScheme(this.authScheme, request);
if (!token && this.throwNoTokenError) {
throw new Error('Could not get token from tokenGetter function.');
}
let tokenIsExpired = of(false);
if (this.skipWhenExpired) {
tokenIsExpired = token ? fromPromiseOrValue(this.jwtHelper.isTokenExpired(token)) : of(true);
}
if (token) {
return tokenIsExpired.pipe(map((isExpired) => isExpired && this.skipWhenExpired
? request.clone()
: request.clone({
setHeaders: {
[this.headerName]: `${authScheme}${token}`,
},
})), mergeMap((innerRequest) => next.handle(innerRequest)));
}
return next.handle(request);
}
intercept(request, next) {
if (!this.isAllowedDomain(request) || this.isDisallowedRoute(request)) {
return next.handle(request);
}
const token = this.tokenGetter(request);
return fromPromiseOrValue(token).pipe(mergeMap((asyncToken) => {
return this.handleInterception(asyncToken, request, next);
}));
}
}
JwtInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: JwtInterceptor, deps: [{ token: JWT_OPTIONS }, { token: i1.JwtHelperService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
JwtInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: JwtInterceptor });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: JwtInterceptor, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [JWT_OPTIONS]
}] }, { type: i1.JwtHelperService }, { type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1qd3Qvc3JjL2xpYi9qd3QuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFPbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQW9CLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBRW5ELE1BQU0sa0JBQWtCLEdBQUcsQ0FBSSxLQUFxQixFQUFFLEVBQUU7SUFDdEQsSUFBSSxLQUFLLFlBQVksT0FBTyxFQUFFO1FBQzVCLE9BQU8sS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzNCO0lBQ0QsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxPQUFPLGNBQWM7SUFZekIsWUFDdUIsTUFBVyxFQUN6QixTQUEyQixFQUNSLFFBQWtCO1FBRHJDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQ1IsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUw5QyxrQkFBYSxHQUFhLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBT3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksZUFBZSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxVQUFVO1lBQ2IsTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsVUFB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Q0FBQyxPQUFPLENBQUMsQ0FBQztRQUV4QyxPQUFPLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FDbkMsUUFBUSxDQUFDLENBQUMsVUFBeUIsRUFBRSxFQUFFO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7OzJHQXJJVSxjQUFjLGtCQWFmLFdBQVcsNkNBRVgsUUFBUTsrR0FmUCxjQUFjOzJGQUFkLGNBQWM7a0JBRDFCLFVBQVU7OzBCQWNOLE1BQU07MkJBQUMsV0FBVzs7MEJBRWxCLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSHR0cFJlcXVlc3QsXG4gIEh0dHBIYW5kbGVyLFxuICBIdHRwRXZlbnQsXG4gIEh0dHBJbnRlcmNlcHRvcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSnd0SGVscGVyU2VydmljZSB9IGZyb20gJy4vand0aGVscGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgSldUX09QVElPTlMgfSBmcm9tICcuL2p3dG9wdGlvbnMudG9rZW4nO1xuXG5pbXBvcnQgeyBtYXAsIG1lcmdlTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZGVmZXIsIGZyb20sIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5cbmNvbnN0IGZyb21Qcm9taXNlT3JWYWx1ZSA9IDxUPihpbnB1dDogVCB8IFByb21pc2U8VD4pID0+IHtcbiAgaWYgKGlucHV0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgIHJldHVybiBkZWZlcigoKSA9PiBpbnB1dCk7XG4gIH1cbiAgcmV0dXJuIG9mKGlucHV0KTtcbn07XG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSnd0SW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuICB0b2tlbkdldHRlcjogKFxuICAgIHJlcXVlc3Q/OiBIdHRwUmVxdWVzdDxhbnk+XG4gICkgPT4gc3RyaW5nIHwgbnVsbCB8IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIGhlYWRlck5hbWU6IHN0cmluZztcbiAgYXV0aFNjaGVtZTogc3RyaW5nIHwgKChyZXF1ZXN0PzogSHR0cFJlcXVlc3Q8YW55PikgPT4gc3RyaW5nKTtcbiAgYWxsb3dlZERvbWFpbnM6IEFycmF5PHN0cmluZyB8IFJlZ0V4cD47XG4gIGRpc2FsbG93ZWRSb3V0ZXM6IEFycmF5PHN0cmluZyB8IFJlZ0V4cD47XG4gIHRocm93Tm9Ub2tlbkVycm9yOiBib29sZWFuO1xuICBza2lwV2hlbkV4cGlyZWQ6IGJvb2xlYW47XG4gIHN0YW5kYXJkUG9ydHM6IHN0cmluZ1tdID0gWyc4MCcsICc0NDMnXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KEpXVF9PUFRJT05TKSBjb25maWc6IGFueSxcbiAgICBwdWJsaWMgand0SGVscGVyOiBKd3RIZWxwZXJTZXJ2aWNlLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50XG4gICkge1xuICAgIHRoaXMudG9rZW5HZXR0ZXIgPSBjb25maWcudG9rZW5HZXR0ZXI7XG4gICAgdGhpcy5oZWFkZXJOYW1lID0gY29uZmlnLmhlYWRlck5hbWUgfHwgJ0F1dGhvcml6YXRpb24nO1xuICAgIHRoaXMuYXV0aFNjaGVtZSA9XG4gICAgICBjb25maWcuYXV0aFNjaGVtZSB8fCBjb25maWcuYXV0aFNjaGVtZSA9PT0gJydcbiAgICAgICAgPyBjb25maWcuYXV0aFNjaGVtZVxuICAgICAgICA6ICdCZWFyZXIgJztcbiAgICB0aGlzLmFsbG93ZWREb21haW5zID0gY29uZmlnLmFsbG93ZWREb21haW5zIHx8IFtdO1xuICAgIHRoaXMuZGlzYWxsb3dlZFJvdXRlcyA9IGNvbmZpZy5kaXNhbGxvd2VkUm91dGVzIHx8IFtdO1xuICAgIHRoaXMudGhyb3dOb1Rva2VuRXJyb3IgPSBjb25maWcudGhyb3dOb1Rva2VuRXJyb3IgfHwgZmFsc2U7XG4gICAgdGhpcy5za2lwV2hlbkV4cGlyZWQgPSBjb25maWcuc2tpcFdoZW5FeHBpcmVkO1xuICB9XG5cbiAgaXNBbGxvd2VkRG9tYWluKHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4pOiBib29sZWFuIHtcbiAgICBjb25zdCByZXF1ZXN0VXJsOiBVUkwgPSBuZXcgVVJMKHJlcXVlc3QudXJsLCB0aGlzLmRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbik7XG5cbiAgICAvLyBJZiB0aGUgaG9zdCBlcXVhbHMgdGhlIGN1cnJlbnQgd2luZG93IG9yaWdpbixcbiAgICAvLyB0aGUgZG9tYWluIGlzIGFsbG93ZWQgYnkgZGVmYXVsdFxuICAgIGlmIChyZXF1ZXN0VXJsLmhvc3QgPT09IHRoaXMuZG9jdW1lbnQubG9jYXRpb24uaG9zdCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gSWYgbm90IHRoZSBjdXJyZW50IGRvbWFpbiwgY2hlY2sgdGhlIGFsbG93ZWQgbGlzdFxuICAgIGNvbnN0IGhvc3ROYW1lID0gYCR7cmVxdWVzdFVybC5ob3N0bmFtZX0ke1xuICAgICAgcmVxdWVzdFVybC5wb3J0ICYmICF0aGlzLnN0YW5kYXJkUG9ydHMuaW5jbHVkZXMocmVxdWVzdFVybC5wb3J0KVxuICAgICAgICA/ICc6JyArIHJlcXVlc3RVcmwucG9ydFxuICAgICAgICA6ICcnXG4gICAgfWA7XG5cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hbGxvd2VkRG9tYWlucy5maW5kSW5kZXgoKGRvbWFpbikgPT5cbiAgICAgICAgdHlwZW9mIGRvbWFpbiA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IGRvbWFpbiA9PT0gaG9zdE5hbWVcbiAgICAgICAgICA6IGRvbWFpbiBpbnN0YW5jZW9mIFJlZ0V4cFxuICAgICAgICAgID8gZG9tYWluLnRlc3QoaG9zdE5hbWUpXG4gICAgICAgICAgOiBmYWxzZVxuICAgICAgKSA+IC0xXG4gICAgKTtcbiAgfVxuXG4gIGlzRGlzYWxsb3dlZFJvdXRlKHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4pOiBib29sZWFuIHtcbiAgICBjb25zdCByZXF1ZXN0ZWRVcmw6IFVSTCA9IG5ldyBVUkwoXG4gICAgICByZXF1ZXN0LnVybCxcbiAgICAgIHRoaXMuZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmRpc2FsbG93ZWRSb3V0ZXMuZmluZEluZGV4KChyb3V0ZTogc3RyaW5nIHwgUmVnRXhwKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygcm91dGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkUm91dGU6IFVSTCA9IG5ldyBVUkwoXG4gICAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgcGFyc2VkUm91dGUuaG9zdG5hbWUgPT09IHJlcXVlc3RlZFVybC5ob3N0bmFtZSAmJlxuICAgICAgICAgICAgcGFyc2VkUm91dGUucGF0aG5hbWUgPT09IHJlcXVlc3RlZFVybC5wYXRobmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm91dGUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICByZXR1cm4gcm91dGUudGVzdChyZXF1ZXN0LnVybCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KSA+IC0xXG4gICAgKTtcbiAgfVxuXG4gIGhhbmRsZUludGVyY2VwdGlvbihcbiAgICB0b2tlbjogc3RyaW5nIHwgbnVsbCxcbiAgICByZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LFxuICAgIG5leHQ6IEh0dHBIYW5kbGVyXG4gICkge1xuICAgIGNvbnN0IGF1dGhTY2hlbWUgPSB0aGlzLmp3dEhlbHBlci5nZXRBdXRoU2NoZW1lKHRoaXMuYXV0aFNjaGVtZSwgcmVxdWVzdCk7XG5cbiAgICBpZiAoIXRva2VuICYmIHRoaXMudGhyb3dOb1Rva2VuRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGdldCB0b2tlbiBmcm9tIHRva2VuR2V0dGVyIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGxldCB0b2tlbklzRXhwaXJlZCA9IG9mKGZhbHNlKTtcblxuICAgIGlmICh0aGlzLnNraXBXaGVuRXhwaXJlZCkge1xuICAgICAgdG9rZW5Jc0V4cGlyZWQgPSB0b2tlbiA/IGZyb21Qcm9taXNlT3JWYWx1ZSh0aGlzLmp3dEhlbHBlci5pc1Rva2VuRXhwaXJlZCh0b2tlbikpIDogb2YodHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuKSB7XG4gICAgICByZXR1cm4gdG9rZW5Jc0V4cGlyZWQucGlwZShcbiAgICAgICAgbWFwKChpc0V4cGlyZWQpID0+XG4gICAgICAgICAgaXNFeHBpcmVkICYmIHRoaXMuc2tpcFdoZW5FeHBpcmVkXG4gICAgICAgICAgICA/IHJlcXVlc3QuY2xvbmUoKVxuICAgICAgICAgICAgOiByZXF1ZXN0LmNsb25lKHtcbiAgICAgICAgICAgICAgICBzZXRIZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICBbdGhpcy5oZWFkZXJOYW1lXTogYCR7YXV0aFNjaGVtZX0ke3Rva2VufWAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgKSxcbiAgICAgICAgbWVyZ2VNYXAoKGlubmVyUmVxdWVzdCkgPT4gbmV4dC5oYW5kbGUoaW5uZXJSZXF1ZXN0KSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpO1xuICB9XG5cbiAgaW50ZXJjZXB0KFxuICAgIHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sXG4gICAgbmV4dDogSHR0cEhhbmRsZXJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xuICAgIGlmICghdGhpcy5pc0FsbG93ZWREb21haW4ocmVxdWVzdCkgfHwgdGhpcy5pc0Rpc2FsbG93ZWRSb3V0ZShyZXF1ZXN0KSkge1xuICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpO1xuICAgIH1cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5HZXR0ZXIocmVxdWVzdCk7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2VPclZhbHVlKHRva2VuKS5waXBlKFxuICAgICAgbWVyZ2VNYXAoKGFzeW5jVG9rZW46IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlSW50ZXJjZXB0aW9uKGFzeW5jVG9rZW4sIHJlcXVlc3QsIG5leHQpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iXX0=