@auth0/angular-jwt
Version:
JSON Web Token helper library for Angular
90 lines (89 loc) • 3.52 kB
JavaScript
import { Injectable, Inject } from '@angular/core';
import { JwtHelperService } from './jwthelper.service';
import { JWT_OPTIONS } from './jwtoptions.token';
import { from } from "rxjs";
import { mergeMap } from 'rxjs/operators';
import { parse } from 'url';
var JwtInterceptor = /** @class */ (function () {
function JwtInterceptor(config, jwtHelper) {
this.jwtHelper = jwtHelper;
this.tokenGetter = config.tokenGetter;
this.headerName = config.headerName || 'Authorization';
this.authScheme =
config.authScheme || config.authScheme === ''
? config.authScheme
: 'Bearer ';
this.whitelistedDomains = config.whitelistedDomains || [];
this.blacklistedRoutes = config.blacklistedRoutes || [];
this.throwNoTokenError = config.throwNoTokenError || false;
this.skipWhenExpired = config.skipWhenExpired;
}
JwtInterceptor.prototype.isWhitelistedDomain = function (request) {
var requestUrl = parse(request.url, false, true);
return (requestUrl.host === null ||
this.whitelistedDomains.findIndex(function (domain) {
return typeof domain === 'string'
? domain === requestUrl.host
: domain instanceof RegExp
? domain.test(requestUrl.host)
: false;
}) > -1);
};
JwtInterceptor.prototype.isBlacklistedRoute = function (request) {
var url = request.url;
return (this.blacklistedRoutes.findIndex(function (route) {
return typeof route === 'string'
? route === url
: route instanceof RegExp
? route.test(url)
: false;
}) > -1);
};
JwtInterceptor.prototype.handleInterception = function (token, request, next) {
var tokenIsExpired = false;
if (!token && this.throwNoTokenError) {
throw new Error('Could not get token from tokenGetter function.');
}
if (this.skipWhenExpired) {
tokenIsExpired = token ? this.jwtHelper.isTokenExpired(token) : true;
}
if (token && tokenIsExpired && this.skipWhenExpired) {
request = request.clone();
}
else if (token) {
request = request.clone({
setHeaders: (_a = {},
_a[this.headerName] = "" + this.authScheme + token,
_a)
});
}
return next.handle(request);
var _a;
};
JwtInterceptor.prototype.intercept = function (request, next) {
var _this = this;
if (!this.isWhitelistedDomain(request) ||
this.isBlacklistedRoute(request)) {
return next.handle(request);
}
var token = this.tokenGetter();
if (token instanceof Promise) {
return from(token).pipe(mergeMap(function (asyncToken) {
return _this.handleInterception(asyncToken, request, next);
}));
}
else {
return this.handleInterception(token, request, next);
}
};
JwtInterceptor.decorators = [
{ type: Injectable },
];
/** @nocollapse */
JwtInterceptor.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [JWT_OPTIONS,] },] },
{ type: JwtHelperService, },
]; };
return JwtInterceptor;
}());
export { JwtInterceptor };