@jjmhalew/angular-jwt 21.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,253 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { InjectionToken, Inject, Injectable, inject, makeEnvironmentProviders } from '@angular/core';
4
+ import { defer, of } from 'rxjs';
5
+ import { map, mergeMap } from 'rxjs/operators';
6
+ import { HTTP_INTERCEPTORS } from '@angular/common/http';
7
+
8
+ const JWT_OPTIONS = new InjectionToken("JWT_OPTIONS");
9
+
10
+ class JwtHelperService {
11
+ tokenGetter;
12
+ constructor(config = null) {
13
+ this.tokenGetter = (config && config.tokenGetter) || function () { };
14
+ }
15
+ urlBase64Decode(str) {
16
+ let output = str.replace(/-/g, "+").replace(/_/g, "/");
17
+ switch (output.length % 4) {
18
+ case 0: {
19
+ break;
20
+ }
21
+ case 2: {
22
+ output += "==";
23
+ break;
24
+ }
25
+ case 3: {
26
+ output += "=";
27
+ break;
28
+ }
29
+ default: {
30
+ throw new Error("Illegal base64url string!");
31
+ }
32
+ }
33
+ return this.b64DecodeUnicode(output);
34
+ }
35
+ // credits for decoder goes to https://github.com/atk
36
+ b64decode(str) {
37
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
38
+ let output = "";
39
+ str = String(str).replace(/=+$/, "");
40
+ if (str.length % 4 === 1) {
41
+ throw new Error(`'atob' failed: The string to be decoded is not correctly encoded.`);
42
+ }
43
+ for (
44
+ // initialize result and counters
45
+ let bc = 0, bs, buffer, idx = 0;
46
+ // get next character
47
+ (buffer = str.charAt(idx++));
48
+ // character found in table? initialize bit storage and add its ascii value;
49
+ ~buffer &&
50
+ ((bs = bc % 4 ? bs * 64 + buffer : buffer),
51
+ // and if not first of each 4 characters,
52
+ // convert the first 8 bits to one ascii character
53
+ bc++ % 4)
54
+ ? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))
55
+ : 0) {
56
+ // try to find character in table (0-63, not found => -1)
57
+ buffer = chars.indexOf(buffer);
58
+ }
59
+ return output;
60
+ }
61
+ b64DecodeUnicode(str) {
62
+ return decodeURIComponent(Array.prototype.map
63
+ .call(this.b64decode(str), (c) => {
64
+ return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2);
65
+ })
66
+ .join(""));
67
+ }
68
+ decodeToken(token = this.tokenGetter()) {
69
+ if (token instanceof Promise) {
70
+ return token.then(t => this._decodeToken(t));
71
+ }
72
+ return this._decodeToken(token);
73
+ }
74
+ _decodeToken(token) {
75
+ if (!token || token === "") {
76
+ return null;
77
+ }
78
+ const parts = token.split(".");
79
+ if (parts.length !== 3) {
80
+ throw new Error(`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.`);
81
+ }
82
+ const decoded = this.urlBase64Decode(parts[1]);
83
+ if (!decoded) {
84
+ throw new Error("Cannot decode the token.");
85
+ }
86
+ return JSON.parse(decoded);
87
+ }
88
+ getTokenExpirationDate(token = this.tokenGetter()) {
89
+ if (token instanceof Promise) {
90
+ return token.then(t => this._getTokenExpirationDate(t));
91
+ }
92
+ return this._getTokenExpirationDate(token);
93
+ }
94
+ _getTokenExpirationDate(token) {
95
+ let decoded;
96
+ decoded = this.decodeToken(token);
97
+ if (!decoded || !decoded.hasOwnProperty("exp")) {
98
+ return null;
99
+ }
100
+ const date = new Date(0);
101
+ date.setUTCSeconds(decoded.exp);
102
+ return date;
103
+ }
104
+ isTokenExpired(token = this.tokenGetter(), offsetSeconds) {
105
+ if (token instanceof Promise) {
106
+ return token.then(t => this._isTokenExpired(t, offsetSeconds));
107
+ }
108
+ return this._isTokenExpired(token, offsetSeconds);
109
+ }
110
+ _isTokenExpired(token, offsetSeconds) {
111
+ if (!token || token === "") {
112
+ return true;
113
+ }
114
+ const date = this.getTokenExpirationDate(token);
115
+ offsetSeconds = offsetSeconds || 0;
116
+ if (date === null) {
117
+ return false;
118
+ }
119
+ return !(date.valueOf() > new Date().valueOf() + offsetSeconds * 1000);
120
+ }
121
+ getAuthScheme(authScheme, request) {
122
+ if (typeof authScheme === "function") {
123
+ return authScheme(request);
124
+ }
125
+ return authScheme;
126
+ }
127
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: JwtHelperService, deps: [{ token: JWT_OPTIONS }], target: i0.ɵɵFactoryTarget.Injectable });
128
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: JwtHelperService });
129
+ }
130
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: JwtHelperService, decorators: [{
131
+ type: Injectable
132
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
133
+ type: Inject,
134
+ args: [JWT_OPTIONS]
135
+ }] }] });
136
+
137
+ const fromPromiseOrValue = (input) => {
138
+ if (input instanceof Promise) {
139
+ return defer(() => input);
140
+ }
141
+ return of(input);
142
+ };
143
+ class JwtInterceptor {
144
+ document;
145
+ tokenGetter;
146
+ headerName;
147
+ authScheme;
148
+ allowedDomains;
149
+ disallowedRoutes;
150
+ throwNoTokenError;
151
+ skipWhenExpired;
152
+ standardPorts = ["80", "443"];
153
+ jwtHelper = inject(JwtHelperService);
154
+ constructor(config, document) {
155
+ this.document = document;
156
+ this.tokenGetter = config.tokenGetter;
157
+ this.headerName = config.headerName || "Authorization";
158
+ this.authScheme = config.authScheme || config.authScheme === "" ? config.authScheme : "Bearer ";
159
+ this.allowedDomains = config.allowedDomains || [];
160
+ this.disallowedRoutes = config.disallowedRoutes || [];
161
+ this.throwNoTokenError = config.throwNoTokenError || false;
162
+ this.skipWhenExpired = config.skipWhenExpired;
163
+ }
164
+ isAllowedDomain(request) {
165
+ const requestUrl = new URL(request.url, this.document.location.origin);
166
+ // If the host equals the current window origin,
167
+ // the domain is allowed by default
168
+ if (requestUrl.host === this.document.location.host) {
169
+ return true;
170
+ }
171
+ // If not the current domain, check the allowed list
172
+ const hostName = `${requestUrl.hostname}${requestUrl.port && !this.standardPorts.includes(requestUrl.port) ? ":" + requestUrl.port : ""}`;
173
+ return (this.allowedDomains.findIndex(domain => typeof domain === "string" ? domain === hostName : domain instanceof RegExp ? domain.test(hostName) : false) > -1);
174
+ }
175
+ isDisallowedRoute(request) {
176
+ const requestedUrl = new URL(request.url, this.document.location.origin);
177
+ return (this.disallowedRoutes.findIndex((route) => {
178
+ if (typeof route === "string") {
179
+ const parsedRoute = new URL(route, this.document.location.origin);
180
+ return parsedRoute.hostname === requestedUrl.hostname && parsedRoute.pathname === requestedUrl.pathname;
181
+ }
182
+ if (route instanceof RegExp) {
183
+ return route.test(request.url);
184
+ }
185
+ return false;
186
+ }) > -1);
187
+ }
188
+ handleInterception(token, request, next) {
189
+ const authScheme = this.jwtHelper.getAuthScheme(this.authScheme, request);
190
+ if (!token && this.throwNoTokenError) {
191
+ throw new Error("Could not get token from tokenGetter function.");
192
+ }
193
+ let tokenIsExpired = of(false);
194
+ if (this.skipWhenExpired) {
195
+ tokenIsExpired = token ? fromPromiseOrValue(this.jwtHelper.isTokenExpired(token)) : of(true);
196
+ }
197
+ if (token) {
198
+ return tokenIsExpired.pipe(map(isExpired => isExpired && this.skipWhenExpired
199
+ ? request.clone()
200
+ : request.clone({
201
+ setHeaders: {
202
+ [this.headerName]: `${authScheme}${token}`,
203
+ },
204
+ })), mergeMap(innerRequest => next.handle(innerRequest)));
205
+ }
206
+ return next.handle(request);
207
+ }
208
+ intercept(request, next) {
209
+ if (!this.isAllowedDomain(request) || this.isDisallowedRoute(request)) {
210
+ return next.handle(request);
211
+ }
212
+ const token = this.tokenGetter(request);
213
+ return fromPromiseOrValue(token).pipe(mergeMap((asyncToken) => {
214
+ return this.handleInterception(asyncToken, request, next);
215
+ }));
216
+ }
217
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: JwtInterceptor, deps: [{ token: JWT_OPTIONS }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
218
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: JwtInterceptor });
219
+ }
220
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: JwtInterceptor, decorators: [{
221
+ type: Injectable
222
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
223
+ type: Inject,
224
+ args: [JWT_OPTIONS]
225
+ }] }, { type: Document, decorators: [{
226
+ type: Inject,
227
+ args: [DOCUMENT]
228
+ }] }] });
229
+
230
+ /**
231
+ * Provides Jwt configuration at the root level:
232
+ * ```ts
233
+ * bootstrapApplication(AppComponent, {
234
+ * providers: [provideJwtConfig(...)]
235
+ * });
236
+ * ```
237
+ */
238
+ const provideJwtConfig = (config) => makeEnvironmentProviders([
239
+ { provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true },
240
+ { provide: JWT_OPTIONS, useValue: config },
241
+ JwtHelperService,
242
+ ]);
243
+
244
+ /*
245
+ * Public API Surface of angular-jwt
246
+ */
247
+
248
+ /**
249
+ * Generated bundle index. Do not edit.
250
+ */
251
+
252
+ export { JWT_OPTIONS, JwtHelperService, JwtInterceptor, provideJwtConfig };
253
+ //# sourceMappingURL=jjmhalew-angular-jwt.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jjmhalew-angular-jwt.mjs","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/provide-jwt-config.ts","../../../projects/angular-jwt/src/public-api.ts","../../../projects/angular-jwt/src/jjmhalew-angular-jwt.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\r\n\r\nexport const JWT_OPTIONS = new InjectionToken(\"JWT_OPTIONS\");\r\n","import { HttpRequest } from \"@angular/common/http\";\r\n\r\nimport { Inject, Injectable } from \"@angular/core\";\r\nimport { JWT_OPTIONS } from \"./jwtoptions.token\";\r\n\r\n@Injectable()\r\nexport class JwtHelperService {\r\n tokenGetter: () => string | Promise<string>;\r\n\r\n constructor(@Inject(JWT_OPTIONS) config: any = null) {\r\n this.tokenGetter = (config && config.tokenGetter) || function () {};\r\n }\r\n\r\n public urlBase64Decode(str: string): string {\r\n let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n switch (output.length % 4) {\r\n case 0: {\r\n break;\r\n }\r\n case 2: {\r\n output += \"==\";\r\n break;\r\n }\r\n case 3: {\r\n output += \"=\";\r\n break;\r\n }\r\n default: {\r\n throw new Error(\"Illegal base64url string!\");\r\n }\r\n }\r\n return this.b64DecodeUnicode(output);\r\n }\r\n\r\n // credits for decoder goes to https://github.com/atk\r\n private b64decode(str: string): string {\r\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\r\n let output = \"\";\r\n\r\n str = String(str).replace(/=+$/, \"\");\r\n\r\n if (str.length % 4 === 1) {\r\n throw new Error(`'atob' failed: The string to be decoded is not correctly encoded.`);\r\n }\r\n\r\n for (\r\n // initialize result and counters\r\n let bc = 0, bs: any, buffer: any, idx = 0;\r\n // get next character\r\n (buffer = str.charAt(idx++));\r\n // character found in table? initialize bit storage and add its ascii value;\r\n ~buffer &&\r\n ((bs = bc % 4 ? bs * 64 + buffer : buffer),\r\n // and if not first of each 4 characters,\r\n // convert the first 8 bits to one ascii character\r\n bc++ % 4)\r\n ? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))\r\n : 0\r\n ) {\r\n // try to find character in table (0-63, not found => -1)\r\n buffer = chars.indexOf(buffer);\r\n }\r\n return output;\r\n }\r\n\r\n private b64DecodeUnicode(str: any) {\r\n return decodeURIComponent(\r\n Array.prototype.map\r\n .call(this.b64decode(str), (c: any) => {\r\n return \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\r\n })\r\n .join(\"\")\r\n );\r\n }\r\n\r\n public decodeToken<T = any>(token: string): T | null;\r\n public decodeToken<T = any>(token: Promise<string>): Promise<T | null>;\r\n public decodeToken<T = any>(): null | T | Promise<T | null>;\r\n public decodeToken<T = any>(token: string | Promise<string> = this.tokenGetter()): null | T | Promise<T | null> {\r\n if (token instanceof Promise) {\r\n return token.then(t => this._decodeToken(t));\r\n }\r\n\r\n return this._decodeToken(token);\r\n }\r\n\r\n private _decodeToken<T = any>(token: string): null | T {\r\n if (!token || token === \"\") {\r\n return null;\r\n }\r\n\r\n const parts = token.split(\".\");\r\n\r\n if (parts.length !== 3) {\r\n throw new Error(\r\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.`\r\n );\r\n }\r\n\r\n const decoded = this.urlBase64Decode(parts[1]);\r\n if (!decoded) {\r\n throw new Error(\"Cannot decode the token.\");\r\n }\r\n\r\n return JSON.parse(decoded);\r\n }\r\n\r\n public getTokenExpirationDate(token: string): Date | null;\r\n public getTokenExpirationDate(token: Promise<string>): Promise<Date | null>;\r\n public getTokenExpirationDate(): null | Date | Promise<Date | null>;\r\n public getTokenExpirationDate(token: string | Promise<string> = this.tokenGetter()): Date | null | Promise<Date | null> {\r\n if (token instanceof Promise) {\r\n return token.then(t => this._getTokenExpirationDate(t));\r\n }\r\n\r\n return this._getTokenExpirationDate(token);\r\n }\r\n\r\n private _getTokenExpirationDate(token: string): Date | null {\r\n let decoded: any;\r\n decoded = this.decodeToken(token);\r\n\r\n if (!decoded || !decoded.hasOwnProperty(\"exp\")) {\r\n return null;\r\n }\r\n\r\n const date = new Date(0);\r\n date.setUTCSeconds(decoded.exp);\r\n\r\n return date;\r\n }\r\n\r\n public isTokenExpired(token?: undefined, offsetSeconds?: number): boolean | Promise<boolean>;\r\n public isTokenExpired(token: string | null, offsetSeconds?: number): boolean;\r\n public isTokenExpired(token: Promise<string>, offsetSeconds?: number): Promise<boolean>;\r\n public isTokenExpired(\r\n token: undefined | null | string | Promise<string> = this.tokenGetter(),\r\n offsetSeconds?: number\r\n ): boolean | Promise<boolean> {\r\n if (token instanceof Promise) {\r\n return token.then(t => this._isTokenExpired(t, offsetSeconds));\r\n }\r\n\r\n return this._isTokenExpired(token, offsetSeconds);\r\n }\r\n\r\n private _isTokenExpired(token: string | null, offsetSeconds?: number): boolean {\r\n if (!token || token === \"\") {\r\n return true;\r\n }\r\n const date = this.getTokenExpirationDate(token);\r\n offsetSeconds = offsetSeconds || 0;\r\n\r\n if (date === null) {\r\n return false;\r\n }\r\n\r\n return !(date.valueOf() > new Date().valueOf() + offsetSeconds * 1000);\r\n }\r\n\r\n public getAuthScheme(authScheme: Function | string | undefined, request: HttpRequest<any>): string | undefined {\r\n if (typeof authScheme === \"function\") {\r\n return authScheme(request);\r\n }\r\n\r\n return authScheme;\r\n }\r\n}\r\n","import { DOCUMENT } from \"@angular/common\";\r\nimport { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from \"@angular/common/http\";\r\nimport { Inject, inject, Injectable } from \"@angular/core\";\r\nimport { JwtHelperService } from \"./jwthelper.service\";\r\nimport { JWT_OPTIONS } from \"./jwtoptions.token\";\r\n\r\nimport { defer, Observable, of } from \"rxjs\";\r\nimport { map, mergeMap } from \"rxjs/operators\";\r\n\r\nconst fromPromiseOrValue = <T>(input: T | Promise<T>) => {\r\n if (input instanceof Promise) {\r\n return defer(() => input);\r\n }\r\n return of(input);\r\n};\r\n@Injectable()\r\nexport class JwtInterceptor implements HttpInterceptor {\r\n tokenGetter: (request?: HttpRequest<any>) => string | null | Promise<string | null>;\r\n headerName: string;\r\n authScheme: string | ((request?: HttpRequest<any>) => string);\r\n allowedDomains: Array<string | RegExp>;\r\n disallowedRoutes: Array<string | RegExp>;\r\n throwNoTokenError: boolean;\r\n skipWhenExpired: boolean;\r\n standardPorts: string[] = [\"80\", \"443\"];\r\n\r\n public jwtHelper = inject(JwtHelperService);\r\n\r\n constructor(\r\n @Inject(JWT_OPTIONS) config: any,\r\n @Inject(DOCUMENT) private document: Document\r\n ) {\r\n this.tokenGetter = config.tokenGetter;\r\n this.headerName = config.headerName || \"Authorization\";\r\n this.authScheme = config.authScheme || config.authScheme === \"\" ? config.authScheme : \"Bearer \";\r\n this.allowedDomains = config.allowedDomains || [];\r\n this.disallowedRoutes = config.disallowedRoutes || [];\r\n this.throwNoTokenError = config.throwNoTokenError || false;\r\n this.skipWhenExpired = config.skipWhenExpired;\r\n }\r\n\r\n public isAllowedDomain(request: HttpRequest<any>): boolean {\r\n const requestUrl: URL = new URL(request.url, this.document.location.origin);\r\n\r\n // If the host equals the current window origin,\r\n // the domain is allowed by default\r\n if (requestUrl.host === this.document.location.host) {\r\n return true;\r\n }\r\n\r\n // If not the current domain, check the allowed list\r\n const hostName = `${requestUrl.hostname}${\r\n requestUrl.port && !this.standardPorts.includes(requestUrl.port) ? \":\" + requestUrl.port : \"\"\r\n }`;\r\n\r\n return (\r\n this.allowedDomains.findIndex(domain =>\r\n typeof domain === \"string\" ? domain === hostName : domain instanceof RegExp ? domain.test(hostName) : false\r\n ) > -1\r\n );\r\n }\r\n\r\n public isDisallowedRoute(request: HttpRequest<any>): boolean {\r\n const requestedUrl: URL = new URL(request.url, this.document.location.origin);\r\n\r\n return (\r\n this.disallowedRoutes.findIndex((route: string | RegExp) => {\r\n if (typeof route === \"string\") {\r\n const parsedRoute: URL = new URL(route, this.document.location.origin);\r\n return parsedRoute.hostname === requestedUrl.hostname && parsedRoute.pathname === requestedUrl.pathname;\r\n }\r\n\r\n if (route instanceof RegExp) {\r\n return route.test(request.url);\r\n }\r\n\r\n return false;\r\n }) > -1\r\n );\r\n }\r\n\r\n public handleInterception(token: string | null, request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n const authScheme = this.jwtHelper.getAuthScheme(this.authScheme, request);\r\n\r\n if (!token && this.throwNoTokenError) {\r\n throw new Error(\"Could not get token from tokenGetter function.\");\r\n }\r\n\r\n let tokenIsExpired = of(false);\r\n\r\n if (this.skipWhenExpired) {\r\n tokenIsExpired = token ? fromPromiseOrValue(this.jwtHelper.isTokenExpired(token)) : of(true);\r\n }\r\n\r\n if (token) {\r\n return tokenIsExpired.pipe(\r\n map(isExpired =>\r\n isExpired && this.skipWhenExpired\r\n ? request.clone()\r\n : request.clone({\r\n setHeaders: {\r\n [this.headerName]: `${authScheme}${token}`,\r\n },\r\n })\r\n ),\r\n mergeMap(innerRequest => next.handle(innerRequest))\r\n );\r\n }\r\n\r\n return next.handle(request);\r\n }\r\n\r\n public intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n if (!this.isAllowedDomain(request) || this.isDisallowedRoute(request)) {\r\n return next.handle(request);\r\n }\r\n const token = this.tokenGetter(request);\r\n\r\n return fromPromiseOrValue(token).pipe(\r\n mergeMap((asyncToken: string | null) => {\r\n return this.handleInterception(asyncToken, request, next);\r\n })\r\n );\r\n }\r\n}\r\n","import { HTTP_INTERCEPTORS, HttpRequest } from \"@angular/common/http\";\r\nimport { EnvironmentProviders, makeEnvironmentProviders, Provider } from \"@angular/core\";\r\nimport { JwtInterceptor } from \"./jwt.interceptor\";\r\nimport { JwtHelperService } from \"./jwthelper.service\";\r\nimport { JWT_OPTIONS } from \"./jwtoptions.token\";\r\n\r\nexport interface JwtConfig {\r\n tokenGetter?: (request?: HttpRequest<unknown>) => string | null | Promise<string | null>;\r\n headerName?: string;\r\n authScheme?: string | ((request?: HttpRequest<unknown>) => string);\r\n allowedDomains?: Array<string | RegExp>;\r\n disallowedRoutes?: Array<string | RegExp>;\r\n throwNoTokenError?: boolean;\r\n skipWhenExpired?: boolean;\r\n}\r\n\r\nexport interface JwtModuleOptions {\r\n jwtOptionsProvider?: Provider;\r\n config?: JwtConfig;\r\n}\r\n\r\n/**\r\n * Provides Jwt configuration at the root level:\r\n * ```ts\r\n * bootstrapApplication(AppComponent, {\r\n * providers: [provideJwtConfig(...)]\r\n * });\r\n * ```\r\n */\r\nexport const provideJwtConfig = (config: JwtConfig): EnvironmentProviders =>\r\n makeEnvironmentProviders([\r\n { provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true },\r\n { provide: JWT_OPTIONS, useValue: config },\r\n JwtHelperService,\r\n ]);\r\n","/*\r\n * Public API Surface of angular-jwt\r\n */\r\n\r\nexport * from \"./lib/jwt.interceptor\";\r\nexport * from \"./lib/jwthelper.service\";\r\nexport * from \"./lib/jwtoptions.token\";\r\nexport * from \"./lib/provide-jwt-config\";\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@jjmhalew/angular-jwt",
3
+ "version": "21.0.0",
4
+ "description": "JSON Web Token helper library for Angular",
5
+ "private": false,
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/jjmhalew/angular-jwt.git"
9
+ },
10
+ "author": "Jim Halewijn",
11
+ "license": "MIT",
12
+ "bugs": {
13
+ "url": "https://github.com/jjmhalew/angular-jwt/issues"
14
+ },
15
+ "keywords": [
16
+ "angular",
17
+ "angular 2",
18
+ "authentication",
19
+ "jwt",
20
+ "zoneless"
21
+ ],
22
+ "homepage": "https://github.com/jjmhalew/angular-jwt",
23
+ "peerDependencies": {
24
+ "@angular/common": ">=21.0.0"
25
+ },
26
+ "dependencies": {
27
+ "tslib": "^2.8.1"
28
+ },
29
+ "module": "fesm2022/jjmhalew-angular-jwt.mjs",
30
+ "typings": "types/jjmhalew-angular-jwt.d.ts",
31
+ "exports": {
32
+ "./package.json": {
33
+ "default": "./package.json"
34
+ },
35
+ ".": {
36
+ "types": "./types/jjmhalew-angular-jwt.d.ts",
37
+ "default": "./fesm2022/jjmhalew-angular-jwt.mjs"
38
+ }
39
+ },
40
+ "sideEffects": false
41
+ }
@@ -0,0 +1,75 @@
1
+ import { HttpRequest, HttpInterceptor, HttpHandler, HttpEvent } from '@angular/common/http';
2
+ import * as i0 from '@angular/core';
3
+ import { InjectionToken, Provider, EnvironmentProviders } from '@angular/core';
4
+ import { Observable } from 'rxjs';
5
+
6
+ declare class JwtHelperService {
7
+ tokenGetter: () => string | Promise<string>;
8
+ constructor(config?: any);
9
+ urlBase64Decode(str: string): string;
10
+ private b64decode;
11
+ private b64DecodeUnicode;
12
+ decodeToken<T = any>(token: string): T | null;
13
+ decodeToken<T = any>(token: Promise<string>): Promise<T | null>;
14
+ decodeToken<T = any>(): null | T | Promise<T | null>;
15
+ private _decodeToken;
16
+ getTokenExpirationDate(token: string): Date | null;
17
+ getTokenExpirationDate(token: Promise<string>): Promise<Date | null>;
18
+ getTokenExpirationDate(): null | Date | Promise<Date | null>;
19
+ private _getTokenExpirationDate;
20
+ isTokenExpired(token?: undefined, offsetSeconds?: number): boolean | Promise<boolean>;
21
+ isTokenExpired(token: string | null, offsetSeconds?: number): boolean;
22
+ isTokenExpired(token: Promise<string>, offsetSeconds?: number): Promise<boolean>;
23
+ private _isTokenExpired;
24
+ getAuthScheme(authScheme: Function | string | undefined, request: HttpRequest<any>): string | undefined;
25
+ static ɵfac: i0.ɵɵFactoryDeclaration<JwtHelperService, never>;
26
+ static ɵprov: i0.ɵɵInjectableDeclaration<JwtHelperService>;
27
+ }
28
+
29
+ declare class JwtInterceptor implements HttpInterceptor {
30
+ private document;
31
+ tokenGetter: (request?: HttpRequest<any>) => string | null | Promise<string | null>;
32
+ headerName: string;
33
+ authScheme: string | ((request?: HttpRequest<any>) => string);
34
+ allowedDomains: Array<string | RegExp>;
35
+ disallowedRoutes: Array<string | RegExp>;
36
+ throwNoTokenError: boolean;
37
+ skipWhenExpired: boolean;
38
+ standardPorts: string[];
39
+ jwtHelper: JwtHelperService;
40
+ constructor(config: any, document: Document);
41
+ isAllowedDomain(request: HttpRequest<any>): boolean;
42
+ isDisallowedRoute(request: HttpRequest<any>): boolean;
43
+ handleInterception(token: string | null, request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>;
44
+ intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>;
45
+ static ɵfac: i0.ɵɵFactoryDeclaration<JwtInterceptor, never>;
46
+ static ɵprov: i0.ɵɵInjectableDeclaration<JwtInterceptor>;
47
+ }
48
+
49
+ declare const JWT_OPTIONS: InjectionToken<unknown>;
50
+
51
+ interface JwtConfig {
52
+ tokenGetter?: (request?: HttpRequest<unknown>) => string | null | Promise<string | null>;
53
+ headerName?: string;
54
+ authScheme?: string | ((request?: HttpRequest<unknown>) => string);
55
+ allowedDomains?: Array<string | RegExp>;
56
+ disallowedRoutes?: Array<string | RegExp>;
57
+ throwNoTokenError?: boolean;
58
+ skipWhenExpired?: boolean;
59
+ }
60
+ interface JwtModuleOptions {
61
+ jwtOptionsProvider?: Provider;
62
+ config?: JwtConfig;
63
+ }
64
+ /**
65
+ * Provides Jwt configuration at the root level:
66
+ * ```ts
67
+ * bootstrapApplication(AppComponent, {
68
+ * providers: [provideJwtConfig(...)]
69
+ * });
70
+ * ```
71
+ */
72
+ declare const provideJwtConfig: (config: JwtConfig) => EnvironmentProviders;
73
+
74
+ export { JWT_OPTIONS, JwtHelperService, JwtInterceptor, provideJwtConfig };
75
+ export type { JwtConfig, JwtModuleOptions };