UNPKG

@auth0/angular-jwt

Version:

JSON Web Token helper library for Angular

98 lines 14.8 kB
import { Injectable, Inject } from "@angular/core"; import { DOCUMENT } from "@angular/common"; import { JwtHelperService } from "./jwthelper.service"; import { JWT_OPTIONS } from "./jwtoptions.token"; import { mergeMap } from "rxjs/operators"; import { from } from "rxjs"; 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); let 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: { [this.headerName]: `${authScheme}${token}`, }, }); } return next.handle(request); } intercept(request, next) { if (!this.isAllowedDomain(request) || this.isDisallowedRoute(request)) { return next.handle(request); } const token = this.tokenGetter(request); if (token instanceof Promise) { return from(token).pipe(mergeMap((asyncToken) => { return this.handleInterception(asyncToken, request, next); })); } else { return this.handleInterception(token, request, next); } } } JwtInterceptor.decorators = [ { type: Injectable } ]; JwtInterceptor.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [JWT_OPTIONS,] }] }, { type: JwtHelperService }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1qd3Qvc3JjL2xpYi9qd3QuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFPbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLElBQUksRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUd4QyxNQUFNLE9BQU8sY0FBYztJQVl6QixZQUN1QixNQUFXLEVBQ3pCLFNBQTJCLEVBQ1IsUUFBa0I7UUFEckMsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDUixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBTDlDLGtCQUFhLEdBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFPdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsSUFBSSxlQUFlLENBQUM7UUFDdkQsSUFBSSxDQUFDLFVBQVU7WUFDYixNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssRUFBRTtnQkFDM0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVO2dCQUNuQixDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0s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QUFVOzs7NENBY04sTUFBTSxTQUFDLFdBQVc7WUFwQmQsZ0JBQWdCO1lBc0JlLFFBQVEsdUJBQTNDLE1BQU0sU0FBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIEh0dHBSZXF1ZXN0LFxuICBIdHRwSGFuZGxlcixcbiAgSHR0cEV2ZW50LFxuICBIdHRwSW50ZXJjZXB0b3IsXG59IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBKd3RIZWxwZXJTZXJ2aWNlIH0gZnJvbSBcIi4vand0aGVscGVyLnNlcnZpY2VcIjtcbmltcG9ydCB7IEpXVF9PUFRJT05TIH0gZnJvbSBcIi4vand0b3B0aW9ucy50b2tlblwiO1xuXG5pbXBvcnQgeyBtZXJnZU1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBKd3RJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG4gIHRva2VuR2V0dGVyOiAoXG4gICAgcmVxdWVzdD86IEh0dHBSZXF1ZXN0PGFueT5cbiAgKSA9PiBzdHJpbmcgfCBudWxsIHwgUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgaGVhZGVyTmFtZTogc3RyaW5nO1xuICBhdXRoU2NoZW1lOiBzdHJpbmcgfCAoKHJlcXVlc3Q/OiBIdHRwUmVxdWVzdDxhbnk+KSA9PiBzdHJpbmcpO1xuICBhbGxvd2VkRG9tYWluczogQXJyYXk8c3RyaW5nIHwgUmVnRXhwPjtcbiAgZGlzYWxsb3dlZFJvdXRlczogQXJyYXk8c3RyaW5nIHwgUmVnRXhwPjtcbiAgdGhyb3dOb1Rva2VuRXJyb3I6IGJvb2xlYW47XG4gIHNraXBXaGVuRXhwaXJlZDogYm9vbGVhbjtcbiAgc3RhbmRhcmRQb3J0czogc3RyaW5nW10gPSBbXCI4MFwiLCBcIjQ0M1wiXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KEpXVF9PUFRJT05TKSBjb25maWc6IGFueSxcbiAgICBwdWJsaWMgand0SGVscGVyOiBKd3RIZWxwZXJTZXJ2aWNlLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50XG4gICkge1xuICAgIHRoaXMudG9rZW5HZXR0ZXIgPSBjb25maWcudG9rZW5HZXR0ZXI7XG4gICAgdGhpcy5oZWFkZXJOYW1lID0gY29uZmlnLmhlYWRlck5hbWUgfHwgXCJBdXRob3JpemF0aW9uXCI7XG4gICAgdGhpcy5hdXRoU2NoZW1lID1cbiAgICAgIGNvbmZpZy5hdXRoU2NoZW1lIHx8IGNvbmZpZy5hdXRoU2NoZW1lID09PSBcIlwiXG4gICAgICAgID8gY29uZmlnLmF1dGhTY2hlbWVcbiAgICAgICAgOiBcIkJlYXJlciBcIjtcbiAgICB0aGlzLmFsbG93ZWREb21haW5zID0gY29uZmlnLmFsbG93ZWREb21haW5zIHx8IFtdO1xuICAgIHRoaXMuZGlzYWxsb3dlZFJvdXRlcyA9IGNvbmZpZy5kaXNhbGxvd2VkUm91dGVzIHx8IFtdO1xuICAgIHRoaXMudGhyb3dOb1Rva2VuRXJyb3IgPSBjb25maWcudGhyb3dOb1Rva2VuRXJyb3IgfHwgZmFsc2U7XG4gICAgdGhpcy5za2lwV2hlbkV4cGlyZWQgPSBjb25maWcuc2tpcFdoZW5FeHBpcmVkO1xuICB9XG5cbiAgaXNBbGxvd2VkRG9tYWluKHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4pOiBib29sZWFuIHtcbiAgICBjb25zdCByZXF1ZXN0VXJsOiBVUkwgPSBuZXcgVVJMKHJlcXVlc3QudXJsLCB0aGlzLmRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbik7XG5cbiAgICAvLyBJZiB0aGUgaG9zdCBlcXVhbHMgdGhlIGN1cnJlbnQgd2luZG93IG9yaWdpbixcbiAgICAvLyB0aGUgZG9tYWluIGlzIGFsbG93ZWQgYnkgZGVmYXVsdFxuICAgIGlmIChyZXF1ZXN0VXJsLmhvc3QgPT09IHRoaXMuZG9jdW1lbnQubG9jYXRpb24uaG9zdCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gSWYgbm90IHRoZSBjdXJyZW50IGRvbWFpbiwgY2hlY2sgdGhlIGFsbG93ZWQgbGlzdFxuICAgIGNvbnN0IGhvc3ROYW1lID0gYCR7cmVxdWVzdFVybC5ob3N0bmFtZX0ke1xuICAgICAgcmVxdWVzdFVybC5wb3J0ICYmICF0aGlzLnN0YW5kYXJkUG9ydHMuaW5jbHVkZXMocmVxdWVzdFVybC5wb3J0KVxuICAgICAgICA/IFwiOlwiICsgcmVxdWVzdFVybC5wb3J0XG4gICAgICAgIDogXCJcIlxuICAgIH1gO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWxsb3dlZERvbWFpbnMuZmluZEluZGV4KChkb21haW4pID0+XG4gICAgICAgIHR5cGVvZiBkb21haW4gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IGRvbWFpbiA9PT0gaG9zdE5hbWVcbiAgICAgICAgICA6IGRvbWFpbiBpbnN0YW5jZW9mIFJlZ0V4cFxuICAgICAgICAgID8gZG9tYWluLnRlc3QoaG9zdE5hbWUpXG4gICAgICAgICAgOiBmYWxzZVxuICAgICAgKSA+IC0xXG4gICAgKTtcbiAgfVxuXG4gIGlzRGlzYWxsb3dlZFJvdXRlKHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4pOiBib29sZWFuIHtcbiAgICBjb25zdCByZXF1ZXN0ZWRVcmw6IFVSTCA9IG5ldyBVUkwoXG4gICAgICByZXF1ZXN0LnVybCxcbiAgICAgIHRoaXMuZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmRpc2FsbG93ZWRSb3V0ZXMuZmluZEluZGV4KChyb3V0ZTogc3RyaW5nIHwgUmVnRXhwKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygcm91dGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBjb25zdCBwYXJzZWRSb3V0ZTogVVJMID0gbmV3IFVSTChcbiAgICAgICAgICAgIHJvdXRlLFxuICAgICAgICAgICAgdGhpcy5kb2N1bWVudC5sb2NhdGlvbi5vcmlnaW5cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwYXJzZWRSb3V0ZS5ob3N0bmFtZSA9PT0gcmVxdWVzdGVkVXJsLmhvc3RuYW1lICYmXG4gICAgICAgICAgICBwYXJzZWRSb3V0ZS5wYXRobmFtZSA9PT0gcmVxdWVzdGVkVXJsLnBhdGhuYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyb3V0ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgIHJldHVybiByb3V0ZS50ZXN0KHJlcXVlc3QudXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pID4gLTFcbiAgICApO1xuICB9XG5cbiAgaGFuZGxlSW50ZXJjZXB0aW9uKFxuICAgIHRva2VuOiBzdHJpbmcgfCBudWxsLFxuICAgIHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sXG4gICAgbmV4dDogSHR0cEhhbmRsZXJcbiAgKSB7XG4gICAgY29uc3QgYXV0aFNjaGVtZSA9IHRoaXMuand0SGVscGVyLmdldEF1dGhTY2hlbWUodGhpcy5hdXRoU2NoZW1lLCByZXF1ZXN0KTtcbiAgICBsZXQgdG9rZW5Jc0V4cGlyZWQgPSBmYWxzZTtcblxuICAgIGlmICghdG9rZW4gJiYgdGhpcy50aHJvd05vVG9rZW5FcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGdldCB0b2tlbiBmcm9tIHRva2VuR2V0dGVyIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5za2lwV2hlbkV4cGlyZWQpIHtcbiAgICAgIHRva2VuSXNFeHBpcmVkID0gdG9rZW4gPyB0aGlzLmp3dEhlbHBlci5pc1Rva2VuRXhwaXJlZCh0b2tlbikgOiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0b2tlbiAmJiB0b2tlbklzRXhwaXJlZCAmJiB0aGlzLnNraXBXaGVuRXhwaXJlZCkge1xuICAgICAgcmVxdWVzdCA9IHJlcXVlc3QuY2xvbmUoKTtcbiAgICB9IGVsc2UgaWYgKHRva2VuKSB7XG4gICAgICByZXF1ZXN0ID0gcmVxdWVzdC5jbG9uZSh7XG4gICAgICAgIHNldEhlYWRlcnM6IHtcbiAgICAgICAgICBbdGhpcy5oZWFkZXJOYW1lXTogYCR7YXV0aFNjaGVtZX0ke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpO1xuICB9XG5cbiAgaW50ZXJjZXB0KFxuICAgIHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sXG4gICAgbmV4dDogSHR0cEhhbmRsZXJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xuICAgIGlmICghdGhpcy5pc0FsbG93ZWREb21haW4ocmVxdWVzdCkgfHwgdGhpcy5pc0Rpc2FsbG93ZWRSb3V0ZShyZXF1ZXN0KSkge1xuICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpO1xuICAgIH1cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5HZXR0ZXIocmVxdWVzdCk7XG5cbiAgICBpZiAodG9rZW4gaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICByZXR1cm4gZnJvbSh0b2tlbikucGlwZShcbiAgICAgICAgbWVyZ2VNYXAoKGFzeW5jVG9rZW46IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVJbnRlcmNlcHRpb24oYXN5bmNUb2tlbiwgcmVxdWVzdCwgbmV4dCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVJbnRlcmNlcHRpb24odG9rZW4sIHJlcXVlc3QsIG5leHQpO1xuICAgIH1cbiAgfVxufVxuIl19