UNPKG

21.4 kBSource Map (JSON)View Raw
1{"version":3,"file":"auth0-angular-jwt.js","sources":["../../../projects/angular-jwt/src/lib/jwtoptions.token.ts","../../../projects/angular-jwt/src/lib/jwthelper.service.ts","../../../projects/angular-jwt/src/lib/jwt.interceptor.ts","../../../projects/angular-jwt/src/lib/angular-jwt.module.ts","../../../projects/angular-jwt/src/index.ts","../../../projects/angular-jwt/src/auth0-angular-jwt.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const JWT_OPTIONS = new InjectionToken('JWT_OPTIONS');\n","import { HttpRequest } from '@angular/common/http';\n// tslint:disable:no-bitwise\n\nimport { Injectable, Inject } from '@angular/core';\nimport { JWT_OPTIONS } from './jwtoptions.token';\n\n@Injectable()\nexport class JwtHelperService {\n tokenGetter: () => string | Promise<string>;\n\n constructor(@Inject(JWT_OPTIONS) config: any = null) {\n this.tokenGetter = (config && config.tokenGetter) || function () {};\n }\n\n public urlBase64Decode(str: string): string {\n let output = str.replace(/-/g, '+').replace(/_/g, '/');\n switch (output.length % 4) {\n case 0: {\n break;\n }\n case 2: {\n output += '==';\n break;\n }\n case 3: {\n output += '=';\n break;\n }\n default: {\n throw new Error('Illegal base64url string!');\n }\n }\n return this.b64DecodeUnicode(output);\n }\n\n // credits for decoder goes to https://github.com/atk\n private b64decode(str: string): string {\n const chars =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n let output = '';\n\n str = String(str).replace(/=+$/, '');\n\n if (str.length % 4 === 1) {\n throw new Error(\n `'atob' failed: The string to be decoded is not correctly encoded.`\n );\n }\n\n for (\n // initialize result and counters\n let bc = 0, bs: any, buffer: any, idx = 0;\n // get next character\n (buffer = str.charAt(idx++));\n // character found in table? initialize bit storage and add its ascii value;\n ~buffer &&\n ((bs = bc % 4 ? bs * 64 + buffer : buffer),\n // and if not first of each 4 characters,\n // convert the first 8 bits to one ascii character\n bc++ % 4)\n ? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))\n : 0\n ) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer);\n }\n return output;\n }\n\n private b64DecodeUnicode(str: any) {\n return decodeURIComponent(\n Array.prototype.map\n .call(this.b64decode(str), (c: any) => {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join('')\n );\n }\n\n public decodeToken<T = any>(token: string): T | null;\n public decodeToken<T = any>(token: Promise<string>): Promise<T | null>;\n public decodeToken<T = any>(): null | T | Promise<T | null>;\n public decodeToken<T = any>(token: string | Promise<string> = this.tokenGetter()): null | T | Promise<T | null> {\n if (token instanceof Promise) {\n return token.then(t => this._decodeToken(t));\n }\n\n return this._decodeToken(token);\n }\n\n private _decodeToken<T = any>(token: string): null | T {\n if (!token || token === '') {\n return null;\n }\n\n const parts = token.split('.');\n\n if (parts.length !== 3) {\n throw new Error(\n `The inspected token doesn't appear to be a JWT. Check to make sure it has three parts and see https://jwt.io for more.`\n );\n }\n\n const decoded = this.urlBase64Decode(parts[1]);\n if (!decoded) {\n throw new Error('Cannot decode the token.');\n }\n\n return JSON.parse(decoded);\n }\n\n public getTokenExpirationDate(token: string): Date | null;\n public getTokenExpirationDate(token: Promise<string>): Promise<Date | null>;\n public getTokenExpirationDate(): null | Date | Promise<Date | null>;\n public getTokenExpirationDate(\n token: string | Promise<string> = this.tokenGetter()\n ): Date | null | Promise<Date | null> {\n if (token instanceof Promise) {\n return token.then(t => this._getTokenExpirationDate(t));\n }\n\n return this._getTokenExpirationDate(token);\n }\n\n private _getTokenExpirationDate(token: string): Date | null {\n let decoded: any;\n decoded = this.decodeToken(token);\n\n if (!decoded || !decoded.hasOwnProperty('exp')) {\n return null;\n }\n\n const date = new Date(0);\n date.setUTCSeconds(decoded.exp);\n\n return date;\n }\n\n public isTokenExpired(token?: undefined, offsetSeconds?: number): boolean | Promise<boolean>;\n public isTokenExpired(token: string | null, offsetSeconds?: number): boolean;\n public isTokenExpired(token: Promise<string>, offsetSeconds?: number): Promise<boolean>;\n public isTokenExpired(\n token: undefined | null | string | Promise<string> = this.tokenGetter(),\n offsetSeconds?: number\n ): boolean | Promise<boolean> {\n if (token instanceof Promise) {\n return token.then(t => this._isTokenExpired(t, offsetSeconds));\n }\n\n return this._isTokenExpired(token, offsetSeconds);\n }\n\n private _isTokenExpired(\n token: string | null,\n offsetSeconds?: number\n ): boolean {\n if (!token || token === '') {\n return true;\n }\n const date = this.getTokenExpirationDate(token);\n offsetSeconds = offsetSeconds || 0;\n\n if (date === null) {\n return false;\n }\n\n return !(date.valueOf() > new Date().valueOf() + offsetSeconds * 1000);\n }\n\n public getAuthScheme(\n authScheme: Function | string | undefined,\n request: HttpRequest<any>\n ): string | undefined {\n if (typeof authScheme === 'function') {\n return authScheme(request);\n }\n\n return authScheme;\n }\n}\n","import { Injectable, Inject } from '@angular/core';\nimport {\n HttpRequest,\n HttpHandler,\n HttpEvent,\n HttpInterceptor,\n} from '@angular/common/http';\nimport { DOCUMENT } from '@angular/common';\nimport { JwtHelperService } from './jwthelper.service';\nimport { JWT_OPTIONS } from './jwtoptions.token';\n\nimport { map, mergeMap } from 'rxjs/operators';\nimport { defer, from, Observable, of } from 'rxjs';\n\nconst fromPromiseOrValue = <T>(input: T | Promise<T>) => {\n if (input instanceof Promise) {\n return defer(() => input);\n }\n return of(input);\n};\n@Injectable()\nexport class JwtInterceptor implements HttpInterceptor {\n tokenGetter: (\n request?: HttpRequest<any>\n ) => string | null | Promise<string | null>;\n headerName: string;\n authScheme: string | ((request?: HttpRequest<any>) => string);\n allowedDomains: Array<string | RegExp>;\n disallowedRoutes: Array<string | RegExp>;\n throwNoTokenError: boolean;\n skipWhenExpired: boolean;\n standardPorts: string[] = ['80', '443'];\n\n constructor(\n @Inject(JWT_OPTIONS) config: any,\n public jwtHelper: JwtHelperService,\n @Inject(DOCUMENT) private document: Document\n ) {\n this.tokenGetter = config.tokenGetter;\n this.headerName = config.headerName || 'Authorization';\n this.authScheme =\n config.authScheme || config.authScheme === ''\n ? config.authScheme\n : 'Bearer ';\n this.allowedDomains = config.allowedDomains || [];\n this.disallowedRoutes = config.disallowedRoutes || [];\n this.throwNoTokenError = config.throwNoTokenError || false;\n this.skipWhenExpired = config.skipWhenExpired;\n }\n\n isAllowedDomain(request: HttpRequest<any>): boolean {\n const requestUrl: URL = new URL(request.url, this.document.location.origin);\n\n // If the host equals the current window origin,\n // the domain is allowed by default\n if (requestUrl.host === this.document.location.host) {\n return true;\n }\n\n // If not the current domain, check the allowed list\n const hostName = `${requestUrl.hostname}${\n requestUrl.port && !this.standardPorts.includes(requestUrl.port)\n ? ':' + requestUrl.port\n : ''\n }`;\n\n return (\n this.allowedDomains.findIndex((domain) =>\n typeof domain === 'string'\n ? domain === hostName\n : domain instanceof RegExp\n ? domain.test(hostName)\n : false\n ) > -1\n );\n }\n\n isDisallowedRoute(request: HttpRequest<any>): boolean {\n const requestedUrl: URL = new URL(\n request.url,\n this.document.location.origin\n );\n\n return (\n this.disallowedRoutes.findIndex((route: string | RegExp) => {\n if (typeof route === 'string') {\n const parsedRoute: URL = new URL(\n route,\n this.document.location.origin\n );\n return (\n parsedRoute.hostname === requestedUrl.hostname &&\n parsedRoute.pathname === requestedUrl.pathname\n );\n }\n\n if (route instanceof RegExp) {\n return route.test(request.url);\n }\n\n return false;\n }) > -1\n );\n }\n\n handleInterception(\n token: string | null,\n request: HttpRequest<any>,\n next: HttpHandler\n ) {\n const authScheme = this.jwtHelper.getAuthScheme(this.authScheme, request);\n\n if (!token && this.throwNoTokenError) {\n throw new Error('Could not get token from tokenGetter function.');\n }\n\n let tokenIsExpired = of(false);\n\n if (this.skipWhenExpired) {\n tokenIsExpired = token ? fromPromiseOrValue(this.jwtHelper.isTokenExpired(token)) : of(true);\n }\n\n if (token) {\n return tokenIsExpired.pipe(\n map((isExpired) =>\n isExpired && this.skipWhenExpired\n ? request.clone()\n : request.clone({\n setHeaders: {\n [this.headerName]: `${authScheme}${token}`,\n },\n })\n ),\n mergeMap((innerRequest) => next.handle(innerRequest))\n );\n }\n\n return next.handle(request);\n }\n\n intercept(\n request: HttpRequest<any>,\n next: HttpHandler\n ): Observable<HttpEvent<any>> {\n if (!this.isAllowedDomain(request) || this.isDisallowedRoute(request)) {\n return next.handle(request);\n }\n const token = this.tokenGetter(request);\n\n return fromPromiseOrValue(token).pipe(\n mergeMap((asyncToken: string | null) => {\n return this.handleInterception(asyncToken, request, next);\n })\n );\n }\n}\n","import {\n NgModule,\n ModuleWithProviders,\n Optional,\n SkipSelf,\n Provider,\n} from '@angular/core';\nimport { HttpRequest, HTTP_INTERCEPTORS } from '@angular/common/http';\nimport { JwtInterceptor } from './jwt.interceptor';\nimport { JWT_OPTIONS } from './jwtoptions.token';\nimport { JwtHelperService } from './jwthelper.service';\n\nexport interface JwtConfig {\n tokenGetter?: (\n request?: HttpRequest<any>\n ) => string | null | Promise<string | null>;\n headerName?: string;\n authScheme?: string | ((request?: HttpRequest<any>) => string);\n allowedDomains?: Array<string | RegExp>;\n disallowedRoutes?: Array<string | RegExp>;\n throwNoTokenError?: boolean;\n skipWhenExpired?: boolean;\n}\n\nexport interface JwtModuleOptions {\n jwtOptionsProvider?: Provider;\n config?: JwtConfig;\n}\n\n@NgModule()\nexport class JwtModule {\n constructor(@Optional() @SkipSelf() parentModule: JwtModule) {\n if (parentModule) {\n throw new Error(\n `JwtModule is already loaded. It should only be imported in your application's main module.`\n );\n }\n }\n static forRoot(options: JwtModuleOptions): ModuleWithProviders<JwtModule> {\n return {\n ngModule: JwtModule,\n providers: [\n {\n provide: HTTP_INTERCEPTORS,\n useClass: JwtInterceptor,\n multi: true,\n },\n options.jwtOptionsProvider || {\n provide: JWT_OPTIONS,\n useValue: options.config,\n },\n JwtHelperService,\n ],\n };\n }\n}\n","/*\n * Public API Surface of angular-jwt\n */\n\nexport * from './lib/jwt.interceptor';\nexport * from './lib/jwthelper.service';\nexport * from './lib/jwtoptions.token';\nexport * from './lib/angular-jwt.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.JwtHelperService"],"mappings":"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"}
\No newline at end of file