@auth0/angular-jwt
Advanced tools
Comparing version 5.1.0 to 5.1.1
@@ -89,3 +89,11 @@ (function (global, factory) { | ||
JwtHelperService.prototype.decodeToken = function (token) { | ||
if (token === void 0) { token = this.tokenGetter(); } | ||
var _this = this; | ||
if (token === void 0) { token = null; } | ||
var _token = token || this.tokenGetter(); | ||
if (_token instanceof Promise) { | ||
return _token.then(function (t) { return _this._decodeToken(t); }); | ||
} | ||
return this._decodeToken(_token); | ||
}; | ||
JwtHelperService.prototype._decodeToken = function (token) { | ||
if (!token || token === '') { | ||
@@ -105,3 +113,11 @@ return null; | ||
JwtHelperService.prototype.getTokenExpirationDate = function (token) { | ||
if (token === void 0) { token = this.tokenGetter(); } | ||
var _this = this; | ||
if (token === void 0) { token = null; } | ||
var _token = token || this.tokenGetter(); | ||
if (_token instanceof Promise) { | ||
return _token.then(function (t) { return _this._getTokenExpirationDate(t); }); | ||
} | ||
return this._getTokenExpirationDate(_token); | ||
}; | ||
JwtHelperService.prototype._getTokenExpirationDate = function (token) { | ||
var decoded; | ||
@@ -117,3 +133,11 @@ decoded = this.decodeToken(token); | ||
JwtHelperService.prototype.isTokenExpired = function (token, offsetSeconds) { | ||
if (token === void 0) { token = this.tokenGetter(); } | ||
var _this = this; | ||
if (token === void 0) { token = null; } | ||
var _token = token || this.tokenGetter(); | ||
if (_token instanceof Promise) { | ||
return _token.then(function (t) { return _this._isTokenExpired(t, offsetSeconds); }); | ||
} | ||
return this._isTokenExpired(_token, offsetSeconds); | ||
}; | ||
JwtHelperService.prototype._isTokenExpired = function (token, offsetSeconds) { | ||
if (!token || token === '') { | ||
@@ -148,2 +172,8 @@ return true; | ||
var fromPromiseOrValue = function (input) { | ||
if (input instanceof Promise) { | ||
return rxjs.defer(function () { return input; }); | ||
} | ||
return rxjs.of(input); | ||
}; | ||
var JwtInterceptor = /** @class */ (function () { | ||
@@ -198,21 +228,23 @@ function JwtInterceptor(config, jwtHelper, document) { | ||
JwtInterceptor.prototype.handleInterception = function (token, request, next) { | ||
var _a; | ||
var _this = this; | ||
var authScheme = this.jwtHelper.getAuthScheme(this.authScheme, request); | ||
var tokenIsExpired = false; | ||
if (!token && this.throwNoTokenError) { | ||
throw new Error('Could not get token from tokenGetter function.'); | ||
} | ||
var tokenIsExpired = rxjs.of(false); | ||
if (this.skipWhenExpired) { | ||
tokenIsExpired = token ? this.jwtHelper.isTokenExpired(token) : true; | ||
tokenIsExpired = token ? fromPromiseOrValue(this.jwtHelper.isTokenExpired(token)) : rxjs.of(true); | ||
} | ||
if (token && tokenIsExpired && this.skipWhenExpired) { | ||
request = request.clone(); | ||
if (token) { | ||
return tokenIsExpired.pipe(operators.map(function (isExpired) { | ||
var _a; | ||
return isExpired && _this.skipWhenExpired | ||
? request.clone() | ||
: request.clone({ | ||
setHeaders: (_a = {}, | ||
_a[_this.headerName] = "" + authScheme + token, | ||
_a), | ||
}); | ||
}), operators.mergeMap(function (innerRequest) { return next.handle(innerRequest); })); | ||
} | ||
else if (token) { | ||
request = request.clone({ | ||
setHeaders: (_a = {}, | ||
_a[this.headerName] = "" + authScheme + token, | ||
_a), | ||
}); | ||
} | ||
return next.handle(request); | ||
@@ -226,10 +258,5 @@ }; | ||
var token = this.tokenGetter(request); | ||
if (token instanceof Promise) { | ||
return rxjs.from(token).pipe(operators.mergeMap(function (asyncToken) { | ||
return _this.handleInterception(asyncToken, request, next); | ||
})); | ||
} | ||
else { | ||
return this.handleInterception(token, request, next); | ||
} | ||
return fromPromiseOrValue(token).pipe(operators.mergeMap(function (asyncToken) { | ||
return _this.handleInterception(asyncToken, request, next); | ||
})); | ||
}; | ||
@@ -236,0 +263,0 @@ return JwtInterceptor; |
@@ -1,3 +0,9 @@ | ||
# Change log | ||
# Change Log | ||
## [v5.1.1](https://github.com/auth0/angular2-jwt/tree/v5.1.1) (2022-12-15) | ||
[Full Changelog](https://github.com/auth0/angular2-jwt/compare/v5.1.0...v5.1.1) | ||
**Fixed** | ||
- Support promise based tokenGetter in JwtHelperService [\#748](https://github.com/auth0/angular2-jwt/pull/748) ([frederikprijck](https://github.com/frederikprijck)) | ||
## Version [5.1.0](https://github.com/auth0/angular2-jwt/tags/v5.1.0) | ||
@@ -4,0 +10,0 @@ |
import { Injectable, Inject } from '@angular/core'; | ||
import { DOCUMENT } from '@angular/common'; | ||
import { JWT_OPTIONS } from './jwtoptions.token'; | ||
import { mergeMap } from 'rxjs/operators'; | ||
import { from } from 'rxjs'; | ||
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 { | ||
@@ -57,19 +63,18 @@ constructor(config, jwtHelper, document) { | ||
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.'); | ||
} | ||
let tokenIsExpired = of(false); | ||
if (this.skipWhenExpired) { | ||
tokenIsExpired = token ? this.jwtHelper.isTokenExpired(token) : true; | ||
tokenIsExpired = token ? fromPromiseOrValue(this.jwtHelper.isTokenExpired(token)) : of(true); | ||
} | ||
if (token && tokenIsExpired && this.skipWhenExpired) { | ||
request = request.clone(); | ||
if (token) { | ||
return tokenIsExpired.pipe(map((isExpired) => isExpired && this.skipWhenExpired | ||
? request.clone() | ||
: request.clone({ | ||
setHeaders: { | ||
[this.headerName]: `${authScheme}${token}`, | ||
}, | ||
})), mergeMap((innerRequest) => next.handle(innerRequest))); | ||
} | ||
else if (token) { | ||
request = request.clone({ | ||
setHeaders: { | ||
[this.headerName]: `${authScheme}${token}`, | ||
}, | ||
}); | ||
} | ||
return next.handle(request); | ||
@@ -82,10 +87,5 @@ } | ||
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); | ||
} | ||
return fromPromiseOrValue(token).pipe(mergeMap((asyncToken) => { | ||
return this.handleInterception(asyncToken, request, next); | ||
})); | ||
} | ||
@@ -104,2 +104,2 @@ } | ||
}] }]; } }); | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1qd3Qvc3JjL2xpYi9qd3QuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFPbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLElBQUksRUFBYyxNQUFNLE1BQU0sQ0FBQzs7O0FBR3hDLE1BQU0sT0FBTyxjQUFjO0lBWXpCLFlBQ3VCLE1BQVcsRUFDekIsU0FBMkIsRUFDUixRQUFrQjtRQURyQyxjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUNSLGFBQVEsR0FBUixRQUFRLENBQVU7UUFMOUMsa0JBQWEsR0FBYSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQU90QyxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxJQUFJLGVBQWUsQ0FBQztRQUN2RCxJQUFJLENBQUMsVUFBVTtZQUNiLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxFQUFFO2dCQUMzQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVU7Z0JBQ25CLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMs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Y0FBYztrQkFEMUIsVUFBVTs7MEJBY04sTUFBTTsyQkFBQyxXQUFXOzZEQUVpQixRQUFROzBCQUEzQyxNQUFNOzJCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEh0dHBSZXF1ZXN0LFxuICBIdHRwSGFuZGxlcixcbiAgSHR0cEV2ZW50LFxuICBIdHRwSW50ZXJjZXB0b3IsXG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEp3dEhlbHBlclNlcnZpY2UgfSBmcm9tICcuL2p3dGhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IEpXVF9PUFRJT05TIH0gZnJvbSAnLi9qd3RvcHRpb25zLnRva2VuJztcblxuaW1wb3J0IHsgbWVyZ2VNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBKd3RJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG4gIHRva2VuR2V0dGVyOiAoXG4gICAgcmVxdWVzdD86IEh0dHBSZXF1ZXN0PGFueT5cbiAgKSA9PiBzdHJpbmcgfCBudWxsIHwgUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgaGVhZGVyTmFtZTogc3RyaW5nO1xuICBhdXRoU2NoZW1lOiBzdHJpbmcgfCAoKHJlcXVlc3Q/OiBIdHRwUmVxdWVzdDxhbnk+KSA9PiBzdHJpbmcpO1xuICBhbGxvd2VkRG9tYWluczogQXJyYXk8c3RyaW5nIHwgUmVnRXhwPjtcbiAgZGlzYWxsb3dlZFJvdXRlczogQXJyYXk8c3RyaW5nIHwgUmVnRXhwPjtcbiAgdGhyb3dOb1Rva2VuRXJyb3I6IGJvb2xlYW47XG4gIHNraXBXaGVuRXhwaXJlZDogYm9vbGVhbjtcbiAgc3RhbmRhcmRQb3J0czogc3RyaW5nW10gPSBbJzgwJywgJzQ0MyddO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoSldUX09QVElPTlMpIGNvbmZpZzogYW55LFxuICAgIHB1YmxpYyBqd3RIZWxwZXI6IEp3dEhlbHBlclNlcnZpY2UsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnRcbiAgKSB7XG4gICAgdGhpcy50b2tlbkdldHRlciA9IGNvbmZpZy50b2tlbkdldHRlcjtcbiAgICB0aGlzLmhlYWRlck5hbWUgPSBjb25maWcuaGVhZGVyTmFtZSB8fCAnQXV0aG9yaXphdGlvbic7XG4gICAgdGhpcy5hdXRoU2NoZW1lID1cbiAgICAgIGNvbmZpZy5hdXRoU2NoZW1lIHx8IGNvbmZpZy5hdXRoU2NoZW1lID09PSAnJ1xuICAgICAgICA/IGNvbmZpZy5hdXRoU2NoZW1lXG4gICAgICAgIDogJ0JlYXJlciAnO1xuICAgIHRoaXMuYWxsb3dlZERvbWFpbnMgPSBjb25maWcuYWxsb3dlZERvbWFpbnMgfHwgW107XG4gICAgdGhpcy5kaXNhbGxvd2VkUm91dGVzID0gY29uZmlnLmRpc2FsbG93ZWRSb3V0ZXMgfHwgW107XG4gICAgdGhpcy50aHJvd05vVG9rZW5FcnJvciA9IGNvbmZpZy50aHJvd05vVG9rZW5FcnJvciB8fCBmYWxzZTtcbiAgICB0aGlzLnNraXBXaGVuRXhwaXJlZCA9IGNvbmZpZy5za2lwV2hlbkV4cGlyZWQ7XG4gIH1cblxuICBpc0FsbG93ZWREb21haW4ocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55Pik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlcXVlc3RVcmw6IFVSTCA9IG5ldyBVUkwocmVxdWVzdC51cmwsIHRoaXMuZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKTtcblxuICAgIC8vIElmIHRoZSBob3N0IGVxdWFscyB0aGUgY3VycmVudCB3aW5kb3cgb3JpZ2luLFxuICAgIC8vIHRoZSBkb21haW4gaXMgYWxsb3dlZCBieSBkZWZhdWx0XG4gICAgaWYgKHJlcXVlc3RVcmwuaG9zdCA9PT0gdGhpcy5kb2N1bWVudC5sb2NhdGlvbi5ob3N0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBub3QgdGhlIGN1cnJlbnQgZG9tYWluLCBjaGVjayB0aGUgYWxsb3dlZCBsaXN0XG4gICAgY29uc3QgaG9zdE5hbWUgPSBgJHtyZXF1ZXN0VXJsLmhvc3RuYW1lfSR7XG4gICAgICByZXF1ZXN0VXJsLnBvcnQgJiYgIXRoaXMuc3RhbmRhcmRQb3J0cy5pbmNsdWRlcyhyZXF1ZXN0VXJsLnBvcnQpXG4gICAgICAgID8gJzonICsgcmVxdWVzdFVybC5wb3J0XG4gICAgICAgIDogJydcbiAgICB9YDtcblxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmFsbG93ZWREb21haW5zLmZpbmRJbmRleCgoZG9tYWluKSA9PlxuICAgICAgICB0eXBlb2YgZG9tYWluID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gZG9tYWluID09PSBob3N0TmFtZVxuICAgICAgICAgIDogZG9tYWluIGluc3RhbmNlb2YgUmVnRXhwXG4gICAgICAgICAgPyBkb21haW4udGVzdChob3N0TmFtZSlcbiAgICAgICAgICA6IGZhbHNlXG4gICAgICApID4gLTFcbiAgICApO1xuICB9XG5cbiAgaXNEaXNhbGxvd2VkUm91dGUocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55Pik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlcXVlc3RlZFVybDogVVJMID0gbmV3IFVSTChcbiAgICAgIHJlcXVlc3QudXJsLFxuICAgICAgdGhpcy5kb2N1bWVudC5sb2NhdGlvbi5vcmlnaW5cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZGlzYWxsb3dlZFJvdXRlcy5maW5kSW5kZXgoKHJvdXRlOiBzdHJpbmcgfCBSZWdFeHApID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByb3V0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjb25zdCBwYXJzZWRSb3V0ZTogVVJMID0gbmV3IFVSTChcbiAgICAgICAgICAgIHJvdXRlLFxuICAgICAgICAgICAgdGhpcy5kb2N1bWVudC5sb2NhdGlvbi5vcmlnaW5cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwYXJzZWRSb3V0ZS5ob3N0bmFtZSA9PT0gcmVxdWVzdGVkVXJsLmhvc3RuYW1lICYmXG4gICAgICAgICAgICBwYXJzZWRSb3V0ZS5wYXRobmFtZSA9PT0gcmVxdWVzdGVkVXJsLnBhdGhuYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyb3V0ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgIHJldHVybiByb3V0ZS50ZXN0KHJlcXVlc3QudXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pID4gLTFcbiAgICApO1xuICB9XG5cbiAgaGFuZGxlSW50ZXJjZXB0aW9uKFxuICAgIHRva2VuOiBzdHJpbmcgfCBudWxsLFxuICAgIHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sXG4gICAgbmV4dDogSHR0cEhhbmRsZXJcbiAgKSB7XG4gICAgY29uc3QgYXV0aFNjaGVtZSA9IHRoaXMuand0SGVscGVyLmdldEF1dGhTY2hlbWUodGhpcy5hdXRoU2NoZW1lLCByZXF1ZXN0KTtcbiAgICBsZXQgdG9rZW5Jc0V4cGlyZWQgPSBmYWxzZTtcblxuICAgIGlmICghdG9rZW4gJiYgdGhpcy50aHJvd05vVG9rZW5FcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZ2V0IHRva2VuIGZyb20gdG9rZW5HZXR0ZXIgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2tpcFdoZW5FeHBpcmVkKSB7XG4gICAgICB0b2tlbklzRXhwaXJlZCA9IHRva2VuID8gdGhpcy5qd3RIZWxwZXIuaXNUb2tlbkV4cGlyZWQodG9rZW4pIDogdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW4gJiYgdG9rZW5Jc0V4cGlyZWQgJiYgdGhpcy5za2lwV2hlbkV4cGlyZWQpIHtcbiAgICAgIHJlcXVlc3QgPSByZXF1ZXN0LmNsb25lKCk7XG4gICAgfSBlbHNlIGlmICh0b2tlbikge1xuICAgICAgcmVxdWVzdCA9IHJlcXVlc3QuY2xvbmUoe1xuICAgICAgICBzZXRIZWFkZXJzOiB7XG4gICAgICAgICAgW3RoaXMuaGVhZGVyTmFtZV06IGAke2F1dGhTY2hlbWV9JHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0KTtcbiAgfVxuXG4gIGludGVyY2VwdChcbiAgICByZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LFxuICAgIG5leHQ6IEh0dHBIYW5kbGVyXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcbiAgICBpZiAoIXRoaXMuaXNBbGxvd2VkRG9tYWluKHJlcXVlc3QpIHx8IHRoaXMuaXNEaXNhbGxvd2VkUm91dGUocmVxdWVzdCkpIHtcbiAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0KTtcbiAgICB9XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnRva2VuR2V0dGVyKHJlcXVlc3QpO1xuXG4gICAgaWYgKHRva2VuIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIGZyb20odG9rZW4pLnBpcGUoXG4gICAgICAgIG1lcmdlTWFwKChhc3luY1Rva2VuOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlSW50ZXJjZXB0aW9uKGFzeW5jVG9rZW4sIHJlcXVlc3QsIG5leHQpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlSW50ZXJjZXB0aW9uKHRva2VuLCByZXF1ZXN0LCBuZXh0KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ== | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1qd3Qvc3JjL2xpYi9qd3QuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFPbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQW9CLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBRW5ELE1BQU0sa0JBQWtCLEdBQUcsQ0FBSSxLQUFxQixFQUFFLEVBQUU7SUFDdEQsSUFBSSxLQUFLLFlBQVksT0FBTyxFQUFFO1FBQzVCLE9BQU8sS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzNCO0lBQ0QsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxPQUFPLGNBQWM7SUFZekIsWUFDdUIsTUFBVyxFQUN6QixTQUEyQixFQUNSLFFBQWtCO1FBRHJDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQ1IsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUw5QyxrQkFBYSxHQUFhLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBT3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksZUFBZSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxVQUFVO1lBQ2IsTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsVUFB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Q0FBQyxPQUFPLENBQUMsQ0FBQztRQUV4QyxPQUFPLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FDbkMsUUFBUSxDQUFDLENBQUMsVUFBeUIsRUFBRSxFQUFFO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7OzRHQXJJVSxjQUFjLGtCQWFmLFdBQVcsNkNBRVgsUUFBUTtnSEFmUCxjQUFjOzRGQUFkLGNBQWM7a0JBRDFCLFVBQVU7OzBCQWNOLE1BQU07MkJBQUMsV0FBVzs2REFFaUIsUUFBUTswQkFBM0MsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBIdHRwUmVxdWVzdCxcbiAgSHR0cEhhbmRsZXIsXG4gIEh0dHBFdmVudCxcbiAgSHR0cEludGVyY2VwdG9yLFxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBKd3RIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi9qd3RoZWxwZXIuc2VydmljZSc7XG5pbXBvcnQgeyBKV1RfT1BUSU9OUyB9IGZyb20gJy4vand0b3B0aW9ucy50b2tlbic7XG5cbmltcG9ydCB7IG1hcCwgbWVyZ2VNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBkZWZlciwgZnJvbSwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcblxuY29uc3QgZnJvbVByb21pc2VPclZhbHVlID0gPFQ+KGlucHV0OiBUIHwgUHJvbWlzZTxUPikgPT4ge1xuICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgcmV0dXJuIGRlZmVyKCgpID0+IGlucHV0KTtcbiAgfVxuICByZXR1cm4gb2YoaW5wdXQpO1xufTtcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBKd3RJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG4gIHRva2VuR2V0dGVyOiAoXG4gICAgcmVxdWVzdD86IEh0dHBSZXF1ZXN0PGFueT5cbiAgKSA9PiBzdHJpbmcgfCBudWxsIHwgUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgaGVhZGVyTmFtZTogc3RyaW5nO1xuICBhdXRoU2NoZW1lOiBzdHJpbmcgfCAoKHJlcXVlc3Q/OiBIdHRwUmVxdWVzdDxhbnk+KSA9PiBzdHJpbmcpO1xuICBhbGxvd2VkRG9tYWluczogQXJyYXk8c3RyaW5nIHwgUmVnRXhwPjtcbiAgZGlzYWxsb3dlZFJvdXRlczogQXJyYXk8c3RyaW5nIHwgUmVnRXhwPjtcbiAgdGhyb3dOb1Rva2VuRXJyb3I6IGJvb2xlYW47XG4gIHNraXBXaGVuRXhwaXJlZDogYm9vbGVhbjtcbiAgc3RhbmRhcmRQb3J0czogc3RyaW5nW10gPSBbJzgwJywgJzQ0MyddO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoSldUX09QVElPTlMpIGNvbmZpZzogYW55LFxuICAgIHB1YmxpYyBqd3RIZWxwZXI6IEp3dEhlbHBlclNlcnZpY2UsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnRcbiAgKSB7XG4gICAgdGhpcy50b2tlbkdldHRlciA9IGNvbmZpZy50b2tlbkdldHRlcjtcbiAgICB0aGlzLmhlYWRlck5hbWUgPSBjb25maWcuaGVhZGVyTmFtZSB8fCAnQXV0aG9yaXphdGlvbic7XG4gICAgdGhpcy5hdXRoU2NoZW1lID1cbiAgICAgIGNvbmZpZy5hdXRoU2NoZW1lIHx8IGNvbmZpZy5hdXRoU2NoZW1lID09PSAnJ1xuICAgICAgICA/IGNvbmZpZy5hdXRoU2NoZW1lXG4gICAgICAgIDogJ0JlYXJlciAnO1xuICAgIHRoaXMuYWxsb3dlZERvbWFpbnMgPSBjb25maWcuYWxsb3dlZERvbWFpbnMgfHwgW107XG4gICAgdGhpcy5kaXNhbGxvd2VkUm91dGVzID0gY29uZmlnLmRpc2FsbG93ZWRSb3V0ZXMgfHwgW107XG4gICAgdGhpcy50aHJvd05vVG9rZW5FcnJvciA9IGNvbmZpZy50aHJvd05vVG9rZW5FcnJvciB8fCBmYWxzZTtcbiAgICB0aGlzLnNraXBXaGVuRXhwaXJlZCA9IGNvbmZpZy5za2lwV2hlbkV4cGlyZWQ7XG4gIH1cblxuICBpc0FsbG93ZWREb21haW4ocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55Pik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlcXVlc3RVcmw6IFVSTCA9IG5ldyBVUkwocmVxdWVzdC51cmwsIHRoaXMuZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKTtcblxuICAgIC8vIElmIHRoZSBob3N0IGVxdWFscyB0aGUgY3VycmVudCB3aW5kb3cgb3JpZ2luLFxuICAgIC8vIHRoZSBkb21haW4gaXMgYWxsb3dlZCBieSBkZWZhdWx0XG4gICAgaWYgKHJlcXVlc3RVcmwuaG9zdCA9PT0gdGhpcy5kb2N1bWVudC5sb2NhdGlvbi5ob3N0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBub3QgdGhlIGN1cnJlbnQgZG9tYWluLCBjaGVjayB0aGUgYWxsb3dlZCBsaXN0XG4gICAgY29uc3QgaG9zdE5hbWUgPSBgJHtyZXF1ZXN0VXJsLmhvc3RuYW1lfSR7XG4gICAgICByZXF1ZXN0VXJsLnBvcnQgJiYgIXRoaXMuc3RhbmRhcmRQb3J0cy5pbmNsdWRlcyhyZXF1ZXN0VXJsLnBvcnQpXG4gICAgICAgID8gJzonICsgcmVxdWVzdFVybC5wb3J0XG4gICAgICAgIDogJydcbiAgICB9YDtcblxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmFsbG93ZWREb21haW5zLmZpbmRJbmRleCgoZG9tYWluKSA9PlxuICAgICAgICB0eXBlb2YgZG9tYWluID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gZG9tYWluID09PSBob3N0TmFtZVxuICAgICAgICAgIDogZG9tYWluIGluc3RhbmNlb2YgUmVnRXhwXG4gICAgICAgICAgPyBkb21haW4udGVzdChob3N0TmFtZSlcbiAgICAgICAgICA6IGZhbHNlXG4gICAgICApID4gLTFcbiAgICApO1xuICB9XG5cbiAgaXNEaXNhbGxvd2VkUm91dGUocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55Pik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlcXVlc3RlZFVybDogVVJMID0gbmV3IFVSTChcbiAgICAgIHJlcXVlc3QudXJsLFxuICAgICAgdGhpcy5kb2N1bWVudC5sb2NhdGlvbi5vcmlnaW5cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZGlzYWxsb3dlZFJvdXRlcy5maW5kSW5kZXgoKHJvdXRlOiBzdHJpbmcgfCBSZWdFeHApID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByb3V0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjb25zdCBwYXJzZWRSb3V0ZTogVVJMID0gbmV3IFVSTChcbiAgICAgICAgICAgIHJvdXRlLFxuICAgICAgICAgICAgdGhpcy5kb2N1bWVudC5sb2NhdGlvbi5vcmlnaW5cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwYXJzZWRSb3V0ZS5ob3N0bmFtZSA9PT0gcmVxdWVzdGVkVXJsLmhvc3RuYW1lICYmXG4gICAgICAgICAgICBwYXJzZWRSb3V0ZS5wYXRobmFtZSA9PT0gcmVxdWVzdGVkVXJsLnBhdGhuYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyb3V0ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgIHJldHVybiByb3V0ZS50ZXN0KHJlcXVlc3QudXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pID4gLTFcbiAgICApO1xuICB9XG5cbiAgaGFuZGxlSW50ZXJjZXB0aW9uKFxuICAgIHRva2VuOiBzdHJpbmcgfCBudWxsLFxuICAgIHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sXG4gICAgbmV4dDogSHR0cEhhbmRsZXJcbiAgKSB7XG4gICAgY29uc3QgYXV0aFNjaGVtZSA9IHRoaXMuand0SGVscGVyLmdldEF1dGhTY2hlbWUodGhpcy5hdXRoU2NoZW1lLCByZXF1ZXN0KTtcblxuICAgIGlmICghdG9rZW4gJiYgdGhpcy50aHJvd05vVG9rZW5FcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZ2V0IHRva2VuIGZyb20gdG9rZW5HZXR0ZXIgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgbGV0IHRva2VuSXNFeHBpcmVkID0gb2YoZmFsc2UpO1xuXG4gICAgaWYgKHRoaXMuc2tpcFdoZW5FeHBpcmVkKSB7XG4gICAgICB0b2tlbklzRXhwaXJlZCA9IHRva2VuID8gZnJvbVByb21pc2VPclZhbHVlKHRoaXMuand0SGVscGVyLmlzVG9rZW5FeHBpcmVkKHRva2VuKSkgOiBvZih0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIHJldHVybiB0b2tlbklzRXhwaXJlZC5waXBlKFxuICAgICAgICBtYXAoKGlzRXhwaXJlZCkgPT5cbiAgICAgICAgICBpc0V4cGlyZWQgJiYgdGhpcy5za2lwV2hlbkV4cGlyZWRcbiAgICAgICAgICAgID8gcmVxdWVzdC5jbG9uZSgpXG4gICAgICAgICAgICA6IHJlcXVlc3QuY2xvbmUoe1xuICAgICAgICAgICAgICAgIHNldEhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgIFt0aGlzLmhlYWRlck5hbWVdOiBgJHthdXRoU2NoZW1lfSR7dG9rZW59YCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICApLFxuICAgICAgICBtZXJnZU1hcCgoaW5uZXJSZXF1ZXN0KSA9PiBuZXh0LmhhbmRsZShpbm5lclJlcXVlc3QpKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxdWVzdCk7XG4gIH1cblxuICBpbnRlcmNlcHQoXG4gICAgcmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55PixcbiAgICBuZXh0OiBIdHRwSGFuZGxlclxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG4gICAgaWYgKCF0aGlzLmlzQWxsb3dlZERvbWFpbihyZXF1ZXN0KSB8fCB0aGlzLmlzRGlzYWxsb3dlZFJvdXRlKHJlcXVlc3QpKSB7XG4gICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxdWVzdCk7XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gdGhpcy50b2tlbkdldHRlcihyZXF1ZXN0KTtcblxuICAgIHJldHVybiBmcm9tUHJvbWlzZU9yVmFsdWUodG9rZW4pLnBpcGUoXG4gICAgICBtZXJnZU1hcCgoYXN5bmNUb2tlbjogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVJbnRlcmNlcHRpb24oYXN5bmNUb2tlbiwgcmVxdWVzdCwgbmV4dCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiJdfQ== |
@@ -62,3 +62,10 @@ // tslint:disable:no-bitwise | ||
} | ||
decodeToken(token = this.tokenGetter()) { | ||
decodeToken(token = null) { | ||
const _token = token || this.tokenGetter(); | ||
if (_token instanceof Promise) { | ||
return _token.then(t => this._decodeToken(t)); | ||
} | ||
return this._decodeToken(_token); | ||
} | ||
_decodeToken(token) { | ||
if (!token || token === '') { | ||
@@ -77,3 +84,10 @@ return null; | ||
} | ||
getTokenExpirationDate(token = this.tokenGetter()) { | ||
getTokenExpirationDate(token = null) { | ||
const _token = token || this.tokenGetter(); | ||
if (_token instanceof Promise) { | ||
return _token.then(t => this._getTokenExpirationDate(t)); | ||
} | ||
return this._getTokenExpirationDate(_token); | ||
} | ||
_getTokenExpirationDate(token) { | ||
let decoded; | ||
@@ -88,3 +102,10 @@ decoded = this.decodeToken(token); | ||
} | ||
isTokenExpired(token = this.tokenGetter(), offsetSeconds) { | ||
isTokenExpired(token = null, offsetSeconds) { | ||
const _token = token || this.tokenGetter(); | ||
if (_token instanceof Promise) { | ||
return _token.then(t => this._isTokenExpired(t, offsetSeconds)); | ||
} | ||
return this._isTokenExpired(_token, offsetSeconds); | ||
} | ||
_isTokenExpired(token, offsetSeconds) { | ||
if (!token || token === '') { | ||
@@ -115,2 +136,2 @@ return true; | ||
}] }]; } }); | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0aGVscGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWp3dC9zcmMvbGliL2p3dGhlbHBlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLDRCQUE0QjtBQUU1QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBR2pELE1BQU0sT0FBTyxnQkFBZ0I7SUFHM0IsWUFBaUMsTUFBTSxHQUFHLElBQUk7UUFDNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksY0FBYSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVNLGVBQWUsQ0FBQyxHQUFXO1FBQ2hDLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdkQsUUFBUSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6QixLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNOLE1BQU07YUFDUDtZQUNELEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ04sTUFBTSxJQUFJLElBQUksQ0FBQztnQkFDZixNQUFNO2FBQ1A7WUFDRCxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNOLE1BQU0sSUFBSSxHQUFHLENBQUM7Z0JBQ2QsTUFBTTthQUNQO1lBQ0QsT0FBTyxDQUFDLENBQUM7Z0JBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO2FBQzlDO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQscURBQXFEO0lBQzdDLFNBQVMs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LENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM5QyxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFaEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU0sY0FBYyxDQUNuQixRQUFnQixJQUFJLENBQUMsV0FBVyxFQUFFLEVBQ2xDLGFBQXNCO1FBRXRCLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBRTtZQUMxQixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELGFBQWEsR0FBRyxhQUFhLElBQUksQ0FBQyxDQUFDO1FBRW5DLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUNqQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsYUFBYSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFTSxhQUFhLENBQ2xCLFVBQXlDLEVBQ3pDLE9BQXlCO1FBRXpCLElBQUksT0FBTyxVQUFVLEtBQUssVUFBVSxFQUFFO1lBQ3BDLE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzVCO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQzs7OEdBdklVLGdCQUFnQixrQkFHUCxXQUFXO2tIQUhwQixnQkFBZ0I7NEZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVTs7MEJBSUksTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cFJlcXVlc3QgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1iaXR3aXNlXG5cbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSldUX09QVElPTlMgfSBmcm9tICcuL2p3dG9wdGlvbnMudG9rZW4nO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSnd0SGVscGVyU2VydmljZSB7XG4gIHRva2VuR2V0dGVyOiAoKSA9PiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChKV1RfT1BUSU9OUykgY29uZmlnID0gbnVsbCkge1xuICAgIHRoaXMudG9rZW5HZXR0ZXIgPSAoY29uZmlnICYmIGNvbmZpZy50b2tlbkdldHRlcikgfHwgZnVuY3Rpb24gKCkge307XG4gIH1cblxuICBwdWJsaWMgdXJsQmFzZTY0RGVjb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgb3V0cHV0ID0gc3RyLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJyk7XG4gICAgc3dpdGNoIChvdXRwdXQubGVuZ3RoICUgNCkge1xuICAgICAgY2FzZSAwOiB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAyOiB7XG4gICAgICAgIG91dHB1dCArPSAnPT0nO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgMzoge1xuICAgICAgICBvdXRwdXQgKz0gJz0nO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGJhc2U2NHVybCBzdHJpbmchJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmI2NERlY29kZVVuaWNvZGUob3V0cHV0KTtcbiAgfVxuXG4gIC8vIGNyZWRpdHMgZm9yIGRlY29kZXIgZ29lcyB0byBodHRwczovL2dpdGh1Yi5jb20vYXRrXG4gIHByaXZhdGUgYjY0ZGVjb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjaGFycyA9XG4gICAgICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nO1xuICAgIGxldCBvdXRwdXQgPSAnJztcblxuICAgIHN0ciA9IFN0cmluZyhzdHIpLnJlcGxhY2UoLz0rJC8sICcnKTtcblxuICAgIGlmIChzdHIubGVuZ3RoICUgNCA9PT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJ2F0b2InIGZhaWxlZDogVGhlIHN0cmluZyB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoXG4gICAgICAvLyBpbml0aWFsaXplIHJlc3VsdCBhbmQgY291bnRlcnNcbiAgICAgIGxldCBiYyA9IDAsIGJzOiBhbnksIGJ1ZmZlcjogYW55LCBpZHggPSAwO1xuICAgICAgLy8gZ2V0IG5leHQgY2hhcmFjdGVyXG4gICAgICAoYnVmZmVyID0gc3RyLmNoYXJBdChpZHgrKykpO1xuICAgICAgLy8gY2hhcmFjdGVyIGZvdW5kIGluIHRhYmxlPyBpbml0aWFsaXplIGJpdCBzdG9yYWdlIGFuZCBhZGQgaXRzIGFzY2lpIHZhbHVlO1xuICAgICAgfmJ1ZmZlciAmJlxuICAgICAgKChicyA9IGJjICUgNCA/IGJzICogNjQgKyBidWZmZXIgOiBidWZmZXIpLFxuICAgICAgLy8gYW5kIGlmIG5vdCBmaXJzdCBvZiBlYWNoIDQgY2hhcmFjdGVycyxcbiAgICAgIC8vIGNvbnZlcnQgdGhlIGZpcnN0IDggYml0cyB0byBvbmUgYXNjaWkgY2hhcmFjdGVyXG4gICAgICBiYysrICUgNClcbiAgICAgICAgPyAob3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMjU1ICYgKGJzID4+ICgoLTIgKiBiYykgJiA2KSkpKVxuICAgICAgICA6IDBcbiAgICApIHtcbiAgICAgIC8vIHRyeSB0byBmaW5kIGNoYXJhY3RlciBpbiB0YWJsZSAoMC02Mywgbm90IGZvdW5kID0+IC0xKVxuICAgICAgYnVmZmVyID0gY2hhcnMuaW5kZXhPZihidWZmZXIpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgcHJpdmF0ZSBiNjREZWNvZGVVbmljb2RlKHN0cjogYW55KSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChcbiAgICAgIEFycmF5LnByb3RvdHlwZS5tYXBcbiAgICAgICAgLmNhbGwodGhpcy5iNjRkZWNvZGUoc3RyKSwgKGM6IGFueSkgPT4ge1xuICAgICAgICAgIHJldHVybiAnJScgKyAoJzAwJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC0yKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJycpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWNvZGVUb2tlbjxUID0gYW55Pih0b2tlbjogc3RyaW5nID0gdGhpcy50b2tlbkdldHRlcigpKTogVCB7XG4gICAgaWYgKCF0b2tlbiB8fCB0b2tlbiA9PT0gJycpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRzID0gdG9rZW4uc3BsaXQoJy4nKTtcblxuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBpbnNwZWN0ZWQgdG9rZW4gZG9lc24ndCBhcHBlYXIgdG8gYmUgYSBKV1QuIENoZWNrIHRvIG1ha2Ugc3VyZSBpdCBoYXMgdGhyZWUgcGFydHMgYW5kIHNlZSBodHRwczovL2p3dC5pbyBmb3IgbW9yZS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY29kZWQgPSB0aGlzLnVybEJhc2U2NERlY29kZShwYXJ0c1sxXSk7XG4gICAgaWYgKCFkZWNvZGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBkZWNvZGUgdGhlIHRva2VuLicpO1xuICAgIH1cblxuICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZWQpO1xuICB9XG5cbiAgcHVibGljIGdldFRva2VuRXhwaXJhdGlvbkRhdGUoXG4gICAgdG9rZW46IHN0cmluZyA9IHRoaXMudG9rZW5HZXR0ZXIoKVxuICApOiBEYXRlIHwgbnVsbCB7XG4gICAgbGV0IGRlY29kZWQ6IGFueTtcbiAgICBkZWNvZGVkID0gdGhpcy5kZWNvZGVUb2tlbih0b2tlbik7XG5cbiAgICBpZiAoIWRlY29kZWQgfHwgIWRlY29kZWQuaGFzT3duUHJvcGVydHkoJ2V4cCcpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gICAgZGF0ZS5zZXRVVENTZWNvbmRzKGRlY29kZWQuZXhwKTtcblxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgcHVibGljIGlzVG9rZW5FeHBpcmVkKFxuICAgIHRva2VuOiBzdHJpbmcgPSB0aGlzLnRva2VuR2V0dGVyKCksXG4gICAgb2Zmc2V0U2Vjb25kcz86IG51bWJlclxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXRva2VuIHx8IHRva2VuID09PSAnJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmdldFRva2VuRXhwaXJhdGlvbkRhdGUodG9rZW4pO1xuICAgIG9mZnNldFNlY29uZHMgPSBvZmZzZXRTZWNvbmRzIHx8IDA7XG5cbiAgICBpZiAoZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAhKGRhdGUudmFsdWVPZigpID4gbmV3IERhdGUoKS52YWx1ZU9mKCkgKyBvZmZzZXRTZWNvbmRzICogMTAwMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXV0aFNjaGVtZShcbiAgICBhdXRoU2NoZW1lOiBGdW5jdGlvbiB8IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICByZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+XG4gICk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiBhdXRoU2NoZW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gYXV0aFNjaGVtZShyZXF1ZXN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXV0aFNjaGVtZTtcbiAgfVxufVxuIl19 | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0aGVscGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWp3dC9zcmMvbGliL2p3dGhlbHBlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLDRCQUE0QjtBQUU1QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBR2pELE1BQU0sT0FBTyxnQkFBZ0I7SUFHM0IsWUFBaUMsTUFBTSxHQUFHLElBQUk7UUFDNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksY0FBYSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVNLGVBQWUsQ0FBQyxHQUFXO1FBQ2hDLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdkQsUUFBUSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6QixLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNOLE1BQU07YUFDUDtZQUNELEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ04sTUFBTSxJQUFJLElBQUksQ0FBQztnQkFDZixNQUFNO2FBQ1A7WUFDRCxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNOLE1BQU0sSUFBSSxHQUFHLENBQUM7Z0JBQ2QsTUFBTTthQUNQO1lBQ0QsT0FBTyxDQUFDLENBQUM7Z0JBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO2FBQzlDO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQscURBQXFEO0lBQzdDLFNBQVMs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RSxhQUFhLENBQUMsQ0FBQyxDQUFDO1NBQ2pFO1FBRUQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRU0sZUFBZSxDQUNwQixLQUFhLEVBQ2IsYUFBc0I7UUFFdEIsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFO1lBQzFCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsYUFBYSxHQUFHLGFBQWEsSUFBSSxDQUFDLENBQUM7UUFFbkMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ2pCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVNLGFBQWEsQ0FDbEIsVUFBeUMsRUFDekMsT0FBeUI7UUFFekIsSUFBSSxPQUFPLFVBQVUsS0FBSyxVQUFVLEVBQUU7WUFDcEMsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDNUI7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDOzs4R0F6S1UsZ0JBQWdCLGtCQUdQLFdBQVc7a0hBSHBCLGdCQUFnQjs0RkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVOzswQkFJSSxNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwUmVxdWVzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbi8vIHRzbGludDpkaXNhYmxlOm5vLWJpdHdpc2VcblxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBKV1RfT1BUSU9OUyB9IGZyb20gJy4vand0b3B0aW9ucy50b2tlbic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBKd3RIZWxwZXJTZXJ2aWNlIHtcbiAgdG9rZW5HZXR0ZXI6ICgpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KEpXVF9PUFRJT05TKSBjb25maWcgPSBudWxsKSB7XG4gICAgdGhpcy50b2tlbkdldHRlciA9IChjb25maWcgJiYgY29uZmlnLnRva2VuR2V0dGVyKSB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgfVxuXG4gIHB1YmxpYyB1cmxCYXNlNjREZWNvZGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBvdXRwdXQgPSBzdHIucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICBzd2l0Y2ggKG91dHB1dC5sZW5ndGggJSA0KSB7XG4gICAgICBjYXNlIDA6IHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIDI6IHtcbiAgICAgICAgb3V0cHV0ICs9ICc9PSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAzOiB7XG4gICAgICAgIG91dHB1dCArPSAnPSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgYmFzZTY0dXJsIHN0cmluZyEnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYjY0RGVjb2RlVW5pY29kZShvdXRwdXQpO1xuICB9XG5cbiAgLy8gY3JlZGl0cyBmb3IgZGVjb2RlciBnb2VzIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9hdGtcbiAgcHJpdmF0ZSBiNjRkZWNvZGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNoYXJzID1cbiAgICAgICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSc7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuXG4gICAgc3RyID0gU3RyaW5nKHN0cikucmVwbGFjZSgvPSskLywgJycpO1xuXG4gICAgaWYgKHN0ci5sZW5ndGggJSA0ID09PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAnYXRvYicgZmFpbGVkOiBUaGUgc3RyaW5nIHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChcbiAgICAgIC8vIGluaXRpYWxpemUgcmVzdWx0IGFuZCBjb3VudGVyc1xuICAgICAgbGV0IGJjID0gMCwgYnM6IGFueSwgYnVmZmVyOiBhbnksIGlkeCA9IDA7XG4gICAgICAvLyBnZXQgbmV4dCBjaGFyYWN0ZXJcbiAgICAgIChidWZmZXIgPSBzdHIuY2hhckF0KGlkeCsrKSk7XG4gICAgICAvLyBjaGFyYWN0ZXIgZm91bmQgaW4gdGFibGU/IGluaXRpYWxpemUgYml0IHN0b3JhZ2UgYW5kIGFkZCBpdHMgYXNjaWkgdmFsdWU7XG4gICAgICB+YnVmZmVyICYmXG4gICAgICAoKGJzID0gYmMgJSA0ID8gYnMgKiA2NCArIGJ1ZmZlciA6IGJ1ZmZlciksXG4gICAgICAvLyBhbmQgaWYgbm90IGZpcnN0IG9mIGVhY2ggNCBjaGFyYWN0ZXJzLFxuICAgICAgLy8gY29udmVydCB0aGUgZmlyc3QgOCBiaXRzIHRvIG9uZSBhc2NpaSBjaGFyYWN0ZXJcbiAgICAgIGJjKysgJSA0KVxuICAgICAgICA/IChvdXRwdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgyNTUgJiAoYnMgPj4gKCgtMiAqIGJjKSAmIDYpKSkpXG4gICAgICAgIDogMFxuICAgICkge1xuICAgICAgLy8gdHJ5IHRvIGZpbmQgY2hhcmFjdGVyIGluIHRhYmxlICgwLTYzLCBub3QgZm91bmQgPT4gLTEpXG4gICAgICBidWZmZXIgPSBjaGFycy5pbmRleE9mKGJ1ZmZlcik7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBwcml2YXRlIGI2NERlY29kZVVuaWNvZGUoc3RyOiBhbnkpIHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KFxuICAgICAgQXJyYXkucHJvdG90eXBlLm1hcFxuICAgICAgICAuY2FsbCh0aGlzLmI2NGRlY29kZShzdHIpLCAoYzogYW55KSA9PiB7XG4gICAgICAgICAgcmV0dXJuICclJyArICgnMDAnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbignJylcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGRlY29kZVRva2VuPFQgPSBhbnk+KHRva2VuOiBzdHJpbmcgPSBudWxsKTogVCB8IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IF90b2tlbiA9IHRva2VuIHx8IHRoaXMudG9rZW5HZXR0ZXIoKTtcblxuICAgIGlmIChfdG9rZW4gaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICByZXR1cm4gX3Rva2VuLnRoZW4odCA9PiB0aGlzLl9kZWNvZGVUb2tlbih0KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZVRva2VuKF90b2tlbik7XG4gIH1cblxuICBwcml2YXRlIF9kZWNvZGVUb2tlbih0b2tlbjogc3RyaW5nKSB7XG4gICAgaWYgKCF0b2tlbiB8fCB0b2tlbiA9PT0gJycpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRzID0gdG9rZW4uc3BsaXQoJy4nKTtcblxuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBpbnNwZWN0ZWQgdG9rZW4gZG9lc24ndCBhcHBlYXIgdG8gYmUgYSBKV1QuIENoZWNrIHRvIG1ha2Ugc3VyZSBpdCBoYXMgdGhyZWUgcGFydHMgYW5kIHNlZSBodHRwczovL2p3dC5pbyBmb3IgbW9yZS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY29kZWQgPSB0aGlzLnVybEJhc2U2NERlY29kZShwYXJ0c1sxXSk7XG4gICAgaWYgKCFkZWNvZGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBkZWNvZGUgdGhlIHRva2VuLicpO1xuICAgIH1cblxuICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZWQpO1xuICB9XG5cbiAgcHVibGljIGdldFRva2VuRXhwaXJhdGlvbkRhdGUoXG4gICAgdG9rZW46IHN0cmluZyA9IG51bGxcbiAgKTogRGF0ZSB8IG51bGwgfCBQcm9taXNlPERhdGU+IHtcblxuICAgIGNvbnN0IF90b2tlbiA9IHRva2VuIHx8IHRoaXMudG9rZW5HZXR0ZXIoKTtcblxuICAgIGlmIChfdG9rZW4gaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICByZXR1cm4gX3Rva2VuLnRoZW4odCA9PiB0aGlzLl9nZXRUb2tlbkV4cGlyYXRpb25EYXRlKHQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ2V0VG9rZW5FeHBpcmF0aW9uRGF0ZShfdG9rZW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VG9rZW5FeHBpcmF0aW9uRGF0ZSh0b2tlbjogc3RyaW5nKSB7XG4gICAgbGV0IGRlY29kZWQ6IGFueTtcbiAgICBkZWNvZGVkID0gdGhpcy5kZWNvZGVUb2tlbih0b2tlbik7XG5cbiAgICBpZiAoIWRlY29kZWQgfHwgIWRlY29kZWQuaGFzT3duUHJvcGVydHkoJ2V4cCcpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gICAgZGF0ZS5zZXRVVENTZWNvbmRzKGRlY29kZWQuZXhwKTtcblxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgcHVibGljIGlzVG9rZW5FeHBpcmVkKFxuICAgIHRva2VuOiBzdHJpbmcgPSBudWxsLFxuICAgIG9mZnNldFNlY29uZHM/OiBudW1iZXJcbiAgKTogYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IF90b2tlbiA9IHRva2VuIHx8IHRoaXMudG9rZW5HZXR0ZXIoKTtcblxuICAgIGlmIChfdG9rZW4gaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICByZXR1cm4gX3Rva2VuLnRoZW4odCA9PiB0aGlzLl9pc1Rva2VuRXhwaXJlZCh0LCBvZmZzZXRTZWNvbmRzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2lzVG9rZW5FeHBpcmVkKF90b2tlbiwgb2Zmc2V0U2Vjb25kcyk7XG4gIH1cblxuICBwdWJsaWMgX2lzVG9rZW5FeHBpcmVkKFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgb2Zmc2V0U2Vjb25kcz86IG51bWJlclxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXRva2VuIHx8IHRva2VuID09PSAnJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmdldFRva2VuRXhwaXJhdGlvbkRhdGUodG9rZW4pO1xuICAgIG9mZnNldFNlY29uZHMgPSBvZmZzZXRTZWNvbmRzIHx8IDA7XG5cbiAgICBpZiAoZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAhKGRhdGUudmFsdWVPZigpID4gbmV3IERhdGUoKS52YWx1ZU9mKCkgKyBvZmZzZXRTZWNvbmRzICogMTAwMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXV0aFNjaGVtZShcbiAgICBhdXRoU2NoZW1lOiBGdW5jdGlvbiB8IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICByZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+XG4gICk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiBhdXRoU2NoZW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gYXV0aFNjaGVtZShyZXF1ZXN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXV0aFNjaGVtZTtcbiAgfVxufVxuIl19 |
import * as i0 from '@angular/core'; | ||
import { InjectionToken, Injectable, Inject, NgModule, Optional, SkipSelf } from '@angular/core'; | ||
import { DOCUMENT } from '@angular/common'; | ||
import { mergeMap } from 'rxjs/operators'; | ||
import { from } from 'rxjs'; | ||
import { map, mergeMap } from 'rxjs/operators'; | ||
import { defer, of } from 'rxjs'; | ||
import { HTTP_INTERCEPTORS } from '@angular/common/http'; | ||
@@ -68,3 +68,10 @@ | ||
} | ||
decodeToken(token = this.tokenGetter()) { | ||
decodeToken(token = null) { | ||
const _token = token || this.tokenGetter(); | ||
if (_token instanceof Promise) { | ||
return _token.then(t => this._decodeToken(t)); | ||
} | ||
return this._decodeToken(_token); | ||
} | ||
_decodeToken(token) { | ||
if (!token || token === '') { | ||
@@ -83,3 +90,10 @@ return null; | ||
} | ||
getTokenExpirationDate(token = this.tokenGetter()) { | ||
getTokenExpirationDate(token = null) { | ||
const _token = token || this.tokenGetter(); | ||
if (_token instanceof Promise) { | ||
return _token.then(t => this._getTokenExpirationDate(t)); | ||
} | ||
return this._getTokenExpirationDate(_token); | ||
} | ||
_getTokenExpirationDate(token) { | ||
let decoded; | ||
@@ -94,3 +108,10 @@ decoded = this.decodeToken(token); | ||
} | ||
isTokenExpired(token = this.tokenGetter(), offsetSeconds) { | ||
isTokenExpired(token = null, offsetSeconds) { | ||
const _token = token || this.tokenGetter(); | ||
if (_token instanceof Promise) { | ||
return _token.then(t => this._isTokenExpired(t, offsetSeconds)); | ||
} | ||
return this._isTokenExpired(_token, offsetSeconds); | ||
} | ||
_isTokenExpired(token, offsetSeconds) { | ||
if (!token || token === '') { | ||
@@ -122,2 +143,8 @@ return true; | ||
const fromPromiseOrValue = (input) => { | ||
if (input instanceof Promise) { | ||
return defer(() => input); | ||
} | ||
return of(input); | ||
}; | ||
class JwtInterceptor { | ||
@@ -172,19 +199,18 @@ constructor(config, jwtHelper, document) { | ||
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.'); | ||
} | ||
let tokenIsExpired = of(false); | ||
if (this.skipWhenExpired) { | ||
tokenIsExpired = token ? this.jwtHelper.isTokenExpired(token) : true; | ||
tokenIsExpired = token ? fromPromiseOrValue(this.jwtHelper.isTokenExpired(token)) : of(true); | ||
} | ||
if (token && tokenIsExpired && this.skipWhenExpired) { | ||
request = request.clone(); | ||
if (token) { | ||
return tokenIsExpired.pipe(map((isExpired) => isExpired && this.skipWhenExpired | ||
? request.clone() | ||
: request.clone({ | ||
setHeaders: { | ||
[this.headerName]: `${authScheme}${token}`, | ||
}, | ||
})), mergeMap((innerRequest) => next.handle(innerRequest))); | ||
} | ||
else if (token) { | ||
request = request.clone({ | ||
setHeaders: { | ||
[this.headerName]: `${authScheme}${token}`, | ||
}, | ||
}); | ||
} | ||
return next.handle(request); | ||
@@ -197,10 +223,5 @@ } | ||
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); | ||
} | ||
return fromPromiseOrValue(token).pipe(mergeMap((asyncToken) => { | ||
return this.handleInterception(asyncToken, request, next); | ||
})); | ||
} | ||
@@ -207,0 +228,0 @@ } |
import { HttpRequest } from '@angular/common/http'; | ||
import * as i0 from "@angular/core"; | ||
export declare class JwtHelperService { | ||
tokenGetter: () => string; | ||
tokenGetter: () => string | Promise<string>; | ||
constructor(config?: any); | ||
@@ -9,5 +9,8 @@ urlBase64Decode(str: string): string; | ||
private b64DecodeUnicode; | ||
decodeToken<T = any>(token?: string): T; | ||
getTokenExpirationDate(token?: string): Date | null; | ||
isTokenExpired(token?: string, offsetSeconds?: number): boolean; | ||
decodeToken<T = any>(token?: string): T | Promise<T>; | ||
private _decodeToken; | ||
getTokenExpirationDate(token?: string): Date | null | Promise<Date>; | ||
private _getTokenExpirationDate; | ||
isTokenExpired(token?: string, offsetSeconds?: number): boolean | Promise<boolean>; | ||
_isTokenExpired(token: string, offsetSeconds?: number): boolean; | ||
getAuthScheme(authScheme: Function | string | undefined, request: HttpRequest<any>): string; | ||
@@ -14,0 +17,0 @@ static ɵfac: i0.ɵɵFactoryDeclaration<JwtHelperService, never>; |
{ | ||
"name": "@auth0/angular-jwt", | ||
"version": "5.1.0", | ||
"version": "5.1.1", | ||
"description": "JSON Web Token helper library for Angular", | ||
@@ -5,0 +5,0 @@ "private": false, |
375
README.md
@@ -1,5 +0,16 @@ | ||
# @auth0/angular-jwt | ||
![Helper library for handling JWTs in Angular applications](https://cdn.auth0.com/website/sdks/banners/angular-jwt-banner.png) | ||
[![npm version](https://badge.fury.io/js/%40auth0%2Fangular-jwt.svg)](https://badge.fury.io/js/%40auth0%2Fangular-jwt) | ||
![Release](https://img.shields.io/github/v/release/auth0/angular2-jwt) | ||
[![codecov](https://codecov.io/gh/auth0/angular2-jwt/branch/main/graph/badge.svg?token=wnauXldcdE)](https://codecov.io/gh/auth0/angular2-jwt) | ||
![Downloads](https://img.shields.io/npm/dw/@auth0/angular-jwt) | ||
[![License](https://img.shields.io/:license-MIT-blue.svg?style=flat)](https://opensource.org/licenses/MIT) | ||
[![CircleCI](https://img.shields.io/circleci/build/github/auth0/angular2-jwt)](https://circleci.com/gh/auth0/angular2-jwt) | ||
:books: [Documentation](#documentation) - :rocket: [Getting Started](#getting-started) - :computer: [API Reference](#api-reference) - :speech_balloon: [Feedback](#feedback) | ||
## Documentation | ||
- [Examples](https://github.com/auth0/angular2-jwt/blob/main/EXAMPLES.md) - code samples for common angular-jwt authentication scenario's. | ||
- [Docs site](https://www.auth0.com/docs) - explore our docs site and learn more about Auth0. | ||
This library provides an `HttpInterceptor` which automatically attaches a [JSON Web Token](https://jwt.io) to `HttpClient` requests. | ||
@@ -9,13 +20,8 @@ | ||
## Supported Angular versions | ||
## Getting started | ||
### Requirements | ||
This project only supports the [actively supported versions of Angular as stated in the Angular documentation](https://angular.io/guide/releases#actively-supported-versions). Whilst other versions might be compatible they are not actively supported | ||
## Sponsor | ||
### Installation | ||
||| | ||
|-|-| | ||
|![auth0 logo](https://user-images.githubusercontent.com/83319/31722733-de95bbde-b3ea-11e7-96bf-4f4e8f915588.png)|If you want to quickly add secure token-based authentication to your Angular projects, feel free to check [Auth0's Angular SDK](https://github.com/auth0/auth0-angular) and free plan at [auth0.com/developers](https://auth0.com/developers?utm_source=GHsponsor&utm_medium=GHsponsor&utm_campaign=angular2-jwt&utm_content=auth)| | ||
## Installation | ||
```bash | ||
@@ -29,26 +35,4 @@ # installation with npm | ||
**This library relies on the URL interface which is not supported in IE11.** | ||
To solve the IE11 compatibility, you can add a polyfill. | ||
## Configure the SDK | ||
- run `npm i --save url-polyfill` | ||
- add `import 'url-polyfill';` to `polyfills.ts` in your project | ||
## Usage: Standalone | ||
If you are only interested in the JWT Decoder, and are not interested in extended | ||
injectable features, you can simply create an instance of the utility and use it | ||
directly: | ||
```ts | ||
import { JwtHelperService } from "@auth0/angular-jwt"; | ||
const helper = new JwtHelperService(); | ||
const decodedToken = helper.decodeToken(myRawToken); | ||
const expirationDate = helper.getTokenExpirationDate(myRawToken); | ||
const isExpired = helper.isTokenExpired(myRawToken); | ||
``` | ||
## Usage: Injection | ||
Import the `JwtModule` module and add it to your imports list. Call the `forRoot` method and provide a `tokenGetter` function. You must also add any domains to the `allowedDomains`, that you want to make requests to by specifying an `allowedDomains` array. | ||
@@ -100,312 +84,33 @@ | ||
## Configuration Options | ||
## API reference | ||
Read [our API reference](https://github.com/auth0/angular2-jwt/blob/main/API.md) to get a better understanding on how to use this SDK. | ||
### `tokenGetter: function(HttpRequest): string` | ||
## Feedback | ||
The `tokenGetter` is a function which returns the user's token. This function simply needs to make a retrieval call to wherever the token is stored. In many cases, the token will be stored in local storage or session storage. | ||
### Contributing | ||
```ts | ||
// ... | ||
JwtModule.forRoot({ | ||
config: { | ||
// ... | ||
tokenGetter: () => { | ||
return localStorage.getItem("access_token"); | ||
}, | ||
}, | ||
}); | ||
``` | ||
We appreciate feedback and contribution to this repo! Before you get started, please see the following: | ||
If you have multiple tokens for multiple domains, you can use the `HttpRequest` passed to the `tokenGetter` function to get the correct token for each intercepted request. | ||
- [Auth0's general contribution guidelines](https://github.com/auth0/open-source-template/blob/master/GENERAL-CONTRIBUTING.md) | ||
- [Auth0's code of conduct guidelines](https://github.com/auth0/open-source-template/blob/master/CODE-OF-CONDUCT.md) | ||
- [This repo's contribution guide](https://github.com/auth0/angular2-jwt/blob/main/CONTRIBUTING.md) | ||
### Raise an issue | ||
```ts | ||
// ... | ||
JwtModule.forRoot({ | ||
config: { | ||
// ... | ||
tokenGetter: (request) => { | ||
if (request.url.includes("foo")) { | ||
return localStorage.getItem("access_token_foo"); | ||
} | ||
To provide feedback or report a bug, please [raise an issue on our issue tracker](https://github.com/auth0/angular2-jwt/issues). | ||
return localStorage.getItem("access_token"); | ||
}, | ||
}, | ||
}); | ||
``` | ||
### Vulnerability Reporting | ||
### `allowedDomains: array` | ||
Please do not report security vulnerabilities on the public GitHub issue tracker. The [Responsible Disclosure Program](https://auth0.com/responsible-disclosure-policy) details the procedure for disclosing security issues. | ||
Authenticated requests should only be sent to domains you know and trust. Many applications make requests to APIs from multiple domains, some of which are not controlled by the developer. Since there is no way to know what the API being called will do with the information contained in the request, it is best to not send the user's token to all APIs in a blind fashion. | ||
--- | ||
List any domains you wish to allow authenticated requests to be sent to by specifying them in the `allowedDomains` array. **Note that standard http port 80 and https port 443 requests don't require a port to be specified. A port is only required in the allowed domains host name if you are authenticating against a non-standard port e.g. localhost:3001** | ||
```ts | ||
// ... | ||
JwtModule.forRoot({ | ||
config: { | ||
// ... | ||
allowedDomains: ["localhost:3001", "foo.com", "bar.com"], | ||
}, | ||
}); | ||
``` | ||
### `disallowedRoutes: array` | ||
If you do not want to replace the authorization headers for specific routes, list them here. This can be useful if your | ||
initial auth route(s) are on an allowed domain and take basic auth headers. These routes need to be prefixed with the correct protocol (`http://`, `https://`). If you want to add a route to the list of disallowed routes regardless of the protocol, you can prefix it with `//`. | ||
```ts | ||
// ... | ||
JwtModule.forRoot({ | ||
config: { | ||
// ... | ||
disallowedRoutes: [ | ||
"http://localhost:3001/auth/", | ||
"https://foo.com/bar/", | ||
"//foo.com/bar/baz", | ||
/localhost:3001\/foo\/far.*/, | ||
], // strings and regular expressions | ||
}, | ||
}); | ||
``` | ||
**Note:** If requests are sent to the same domain that is serving your Angular application, you do not need to add that domain to the `allowedDomains` array. However, this is only the case if you don't specify the domain in the `Http` request. | ||
For example, the following request assumes that the domain is the same as the one serving your app. It doesn't need to be allowed in this case. | ||
```ts | ||
this.http.get('/api/things') | ||
.subscribe(...) | ||
``` | ||
However, if you are serving your API at the same domain as that which is serving your Angular app **and** you are specifying that domain in `Http` requests, then it **does** need to be explicitely allowed. | ||
```ts | ||
// Both the Angular app and the API are served at | ||
// localhost:4200 but because that domain is specified | ||
// in the request, it must be allowed | ||
this.http.get('http://localhost:4200/api/things') | ||
.subscribe(...) | ||
``` | ||
### `headerName: string` | ||
The default header name is `Authorization`. This can be changed by specifying a custom `headerName` which is to be a string value. | ||
```ts | ||
// ... | ||
JwtModule.forRoot({ | ||
config: { | ||
// ... | ||
headerName: "Your Header Name", | ||
}, | ||
}); | ||
``` | ||
### `authScheme: string | function(HttpRequest): string` | ||
The default authorization scheme is `Bearer` followed by a single space. This can be changed by specifying a custom `authScheme`. You can pass a string which will prefix the token for each request. | ||
```ts | ||
// ... | ||
JwtModule.forRoot({ | ||
config: { | ||
// ... | ||
authScheme: "Basic ", | ||
}, | ||
}); | ||
``` | ||
If you want to change the auth scheme dynamically, or based on the request, you can configure a getter function which returns a string. | ||
```ts | ||
// ... | ||
JwtModule.forRoot({ | ||
config: { | ||
// ... | ||
authScheme: (request) => { | ||
if (request.url.includes("foo")) { | ||
return "Basic "; | ||
} | ||
return "Bearer "; | ||
}, | ||
}, | ||
}); | ||
``` | ||
### `throwNoTokenError: boolean` | ||
Setting `throwNoTokenError` to `true` will result in an error being thrown if a token cannot be retrieved with the `tokenGetter` function. Defaults to `false`. | ||
```ts | ||
// ... | ||
JwtModule.forRoot({ | ||
config: { | ||
// ... | ||
throwNoTokenError: true, | ||
}, | ||
}); | ||
``` | ||
### `skipWhenExpired: boolean` | ||
By default, the user's JWT will be sent in `HttpClient` requests even if it is expired. You may choose to not allow the token to be sent if it is expired by setting `skipWhenExpired` to true. | ||
```ts | ||
// ... | ||
JwtModule.forRoot({ | ||
config: { | ||
// ... | ||
skipWhenExpired: true, | ||
}, | ||
}); | ||
``` | ||
## Using a Custom Options Factory Function | ||
In some cases, you may need to provide a custom factory function to properly handle your configuration options. This is the case if your `tokenGetter` function relies on a service or if you are using an asynchronous storage mechanism (like Ionic's `Storage`). | ||
Import the `JWT_OPTIONS` `InjectionToken` so that you can instruct it to use your custom factory function. | ||
Create a factory function and specify the options as you normally would if you were using `JwtModule.forRoot` directly. If you need to use a service in the function, list it as a parameter in the function and pass it in the `deps` array when you provide the function. | ||
```ts | ||
import { JwtModule, JWT_OPTIONS } from '@auth0/angular-jwt'; | ||
import { TokenService } from './app.tokenservice'; | ||
// ... | ||
export function jwtOptionsFactory(tokenService) { | ||
return { | ||
tokenGetter: () => { | ||
return tokenService.getAsyncToken(); | ||
}, | ||
allowedDomains: ["example.com"] | ||
} | ||
} | ||
// ... | ||
@NgModule({ | ||
// ... | ||
imports: [ | ||
JwtModule.forRoot({ | ||
jwtOptionsProvider: { | ||
provide: JWT_OPTIONS, | ||
useFactory: jwtOptionsFactory, | ||
deps: [TokenService] | ||
} | ||
}) | ||
], | ||
providers: [TokenService] | ||
}) | ||
``` | ||
**Note:**: If a `jwtOptionsFactory` is defined, then `config` is ignored. _Both configuration alternatives can't be defined at the same time_. | ||
## Configuration for Ionic 2+ | ||
The custom factory function approach described above can be used to get a token asynchronously with Ionic's `Storage`. | ||
```ts | ||
import { JwtModule, JWT_OPTIONS } from '@auth0/angular-jwt'; | ||
import { Storage } from '@ionic/storage'; | ||
export function jwtOptionsFactory(storage) { | ||
return { | ||
tokenGetter: () => { | ||
return storage.get('access_token'); | ||
}, | ||
allowedDomains: ["example.com"] | ||
} | ||
} | ||
// ... | ||
@NgModule({ | ||
// ... | ||
imports: [ | ||
JwtModule.forRoot({ | ||
jwtOptionsProvider: { | ||
provide: JWT_OPTIONS, | ||
useFactory: jwtOptionsFactory, | ||
deps: [Storage] | ||
} | ||
}) | ||
] | ||
}) | ||
``` | ||
**Note:**: If a `jwtOptionsFactory` is defined, then `config` is ignored. _Both configuration alternatives can't be defined at the same time_. | ||
## Configuration Options | ||
### `JwtHelperService: service` | ||
This service contains helper functions: | ||
## isTokenExpired (old tokenNotExpired function) | ||
``` | ||
import { JwtHelperService } from '@auth0/angular-jwt'; | ||
// ... | ||
constructor(public jwtHelper: JwtHelperService) {} | ||
ngOnInit() { | ||
console.log(this.jwtHelper.isTokenExpired()); // true or false | ||
} | ||
``` | ||
## getTokenExpirationDate | ||
``` | ||
import { JwtHelperService } from '@auth0/angular-jwt'; | ||
// ... | ||
constructor(public jwtHelper: JwtHelperService) {} | ||
ngOnInit() { | ||
console.log(this.jwtHelper.getTokenExpirationDate()); // date | ||
} | ||
``` | ||
## decodeToken | ||
``` | ||
import { JwtHelperService } from '@auth0/angular-jwt'; | ||
// ... | ||
constructor(public jwtHelper: JwtHelperService) {} | ||
ngOnInit() { | ||
console.log(this.jwtHelper.decodeToken(token)); // token | ||
} | ||
``` | ||
## What is Auth0? | ||
Auth0 helps you to: | ||
- Add authentication with [multiple authentication sources](https://auth0.com/docs/identityproviders), either social like **Google, Facebook, Microsoft Account, LinkedIn, GitHub, Twitter, Box, Salesforce, among others**, or enterprise identity systems like **Windows Azure AD, Google Apps, Active Directory, ADFS or any SAML Identity Provider**. | ||
- Add authentication through more traditional **[username/password databases](https://auth0.com/docs/connections/database/custom-db)**. | ||
- Add support for **[linking different user accounts](https://auth0.com/docs/link-accounts)** with the same user. | ||
- Support for generating signed [Json Web Tokens](https://auth0.com/docs/jwt) to call your APIs and **flow the user identity** securely. | ||
- Analytics of how, when and where users are logging in. | ||
- Pull data from other sources and add it to the user profile, through [JavaScript rules](https://auth0.com/docs/rules/current). | ||
## Create a free Auth0 account | ||
1. Go to [Auth0](https://auth0.com/signup) and click Sign Up. | ||
2. Use Google, GitHub or Microsoft Account to login. | ||
## Issue Reporting | ||
If you have found a bug or if you have a feature request, please report them at this repository issues section. Please do not report security vulnerabilities on the public GitHub issue tracker. The [Responsible Disclosure Program](https://auth0.com/whitehat) details the procedure for disclosing security issues. | ||
## Author | ||
[Auth0](auth0.com) | ||
## License | ||
This project is licensed under the MIT license. See the [LICENSE](LICENSE.txt) file for more info. | ||
<p align="center"> | ||
<picture> | ||
<source media="(prefers-color-scheme: light)" srcset="https://cdn.auth0.com/website/sdks/logos/auth0_light_mode.png" width="150"> | ||
<source media="(prefers-color-scheme: dark)" srcset="https://cdn.auth0.com/website/sdks/logos/auth0_dark_mode.png" width="150"> | ||
<img alt="Auth0 Logo" src="https://cdn.auth0.com/website/sdks/logos/auth0_light_mode.png" width="150"> | ||
</picture> | ||
</p> | ||
<p align="center">Auth0 is an easy to implement, adaptable authentication and authorization platform. To learn more checkout <a href="https://auth0.com/why-auth0">Why Auth0?</a></p> | ||
<p align="center"> | ||
This project is licensed under the MIT license. See the <a href="https://github.com/auth0/angular2-jwt/blob/main/LICENSE"> LICENSE</a> file for more info.</p> |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
126459
950
0
114