ngx-oauth 4.1.0 → 4.2.2
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.
- package/esm2020/lib/models/index.mjs +2 -1
- package/esm2020/lib/oauth.module.mjs +12 -3
- package/esm2020/lib/services/oauth.interceptor.mjs +4 -4
- package/esm2020/lib/services/oauth.service.mjs +6 -6
- package/esm2020/lib/services/token.service.mjs +9 -6
- package/fesm2015/ngx-oauth.mjs +37 -22
- package/fesm2015/ngx-oauth.mjs.map +1 -1
- package/fesm2020/ngx-oauth.mjs +35 -22
- package/fesm2020/ngx-oauth.mjs.map +1 -1
- package/lib/models/index.d.ts +3 -1
- package/lib/services/oauth.service.d.ts +1 -0
- package/package.json +1 -1
package/fesm2015/ngx-oauth.mjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { InjectionToken, inject, Injectable, Inject, Component, ViewEncapsulation, Input, Output, ContentChild, HostListener, PLATFORM_ID, Optional, NgModule } from '@angular/core';
|
|
3
|
-
import * as
|
|
4
|
-
import { HttpHeaders, HttpParams, HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
|
|
3
|
+
import * as i3 from '@angular/common/http';
|
|
4
|
+
import { HttpHeaders, HttpParams, HttpClient, HttpBackend, HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
|
|
5
5
|
import { __classPrivateFieldGet, __awaiter, __classPrivateFieldSet } from 'tslib';
|
|
6
6
|
import { shareReplay, map, catchError, filter, switchMap as switchMap$1, tap, concatMap, delay } from 'rxjs/operators';
|
|
7
7
|
import { BehaviorSubject, distinctUntilChanged, switchMap, of, ReplaySubject, from, noop, firstValueFrom, throwError, take, Subscription } from 'rxjs';
|
|
8
|
-
import * as i2
|
|
8
|
+
import * as i2 from '@angular/common';
|
|
9
9
|
import { isPlatformBrowser, CommonModule } from '@angular/common';
|
|
10
|
-
import * as i3 from '@angular/forms';
|
|
10
|
+
import * as i3$1 from '@angular/forms';
|
|
11
11
|
import { FormsModule } from '@angular/forms';
|
|
12
12
|
import { RouterModule } from '@angular/router';
|
|
13
13
|
|
|
@@ -18,6 +18,7 @@ const STORAGE = new InjectionToken('Storage');
|
|
|
18
18
|
const OAUTH_CONFIG = new InjectionToken('OAuthConfig');
|
|
19
19
|
const OAUTH_TOKEN = new InjectionToken('OAuthToken');
|
|
20
20
|
const HEADER_APPLICATION = new HttpHeaders({ 'Content-Type': 'application/x-www-form-urlencoded' });
|
|
21
|
+
const OAUTH_HTTP_CLIENT = new InjectionToken('OAuthHttpClient');
|
|
21
22
|
class OAuthConfig {
|
|
22
23
|
}
|
|
23
24
|
OAuthConfig.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthConfig, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
@@ -62,7 +63,7 @@ class TokenService {
|
|
|
62
63
|
this.http = http;
|
|
63
64
|
this.zone = zone;
|
|
64
65
|
_TokenService_token$.set(this, new BehaviorSubject(this.saved));
|
|
65
|
-
this.token$ = __classPrivateFieldGet(this, _TokenService_token$, "f").pipe(distinctUntilChanged((p, c) => JSON.stringify(p || null) === JSON.stringify(c || null)), switchMap(token => !isExpiredToken(token) && of(token) || this.refreshToken(token))
|
|
66
|
+
this.token$ = __classPrivateFieldGet(this, _TokenService_token$, "f").pipe(distinctUntilChanged((p, c) => JSON.stringify(p || null) === JSON.stringify(c || null)), shareReplay(1), switchMap(token => !isExpiredToken(token) && of(token) || this.refreshToken(token)));
|
|
66
67
|
this.type$ = this.token$.pipe(map(token => token === null || token === void 0 ? void 0 : token.type), shareReplay(1));
|
|
67
68
|
this.accessToken$ = this.token$.pipe(map(token => token === null || token === void 0 ? void 0 : token.access_token), shareReplay(1));
|
|
68
69
|
}
|
|
@@ -107,11 +108,16 @@ class TokenService {
|
|
|
107
108
|
}
|
|
108
109
|
}
|
|
109
110
|
_TokenService_token$ = new WeakMap();
|
|
110
|
-
TokenService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: TokenService, deps: [{ token: OAuthConfig }, { token:
|
|
111
|
+
TokenService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: TokenService, deps: [{ token: OAuthConfig }, { token: OAUTH_HTTP_CLIENT }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
111
112
|
TokenService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: TokenService });
|
|
112
113
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: TokenService, decorators: [{
|
|
113
114
|
type: Injectable
|
|
114
|
-
}], ctorParameters: function () {
|
|
115
|
+
}], ctorParameters: function () {
|
|
116
|
+
return [{ type: OAuthConfig }, { type: i3.HttpClient, decorators: [{
|
|
117
|
+
type: Inject,
|
|
118
|
+
args: [OAUTH_HTTP_CLIENT]
|
|
119
|
+
}] }, { type: i0.NgZone }];
|
|
120
|
+
} });
|
|
115
121
|
|
|
116
122
|
const arrToString = (buf) => buf.reduce((s, b) => s + String.fromCharCode(b), '');
|
|
117
123
|
const base64url = (str) => btoa(str)
|
|
@@ -157,7 +163,6 @@ class OAuthService {
|
|
|
157
163
|
}
|
|
158
164
|
else if (isAuthCodeRedirect) {
|
|
159
165
|
const parameters = parseOauthUri(search && search.substring(1) || hash && hash.substring(1));
|
|
160
|
-
console.log(parameters);
|
|
161
166
|
if (!this.checkResponse(this.token, parameters)) {
|
|
162
167
|
this.token = parameters;
|
|
163
168
|
}
|
|
@@ -175,10 +180,7 @@ class OAuthService {
|
|
|
175
180
|
}
|
|
176
181
|
}), switchMap$1(() => this.tokenService.token$), shareReplay(1));
|
|
177
182
|
this.status$ = this.token$.pipe(map(token => token.access_token && OAuthStatus.AUTHORIZED || token.error && OAuthStatus.DENIED || OAuthStatus.NOT_AUTHORIZED), shareReplay(1));
|
|
178
|
-
this.userInfo$ = this.status$.pipe(filter(s => s === OAuthStatus.AUTHORIZED), map(() =>
|
|
179
|
-
const { config } = this.authConfig;
|
|
180
|
-
return config.userPath;
|
|
181
|
-
}), filter(Boolean), switchMap$1(path => this.http.get(path)), shareReplay(1));
|
|
183
|
+
this.userInfo$ = this.status$.pipe(filter(s => s === OAuthStatus.AUTHORIZED), map(() => this.config.userPath), filter(Boolean), switchMap$1(path => this.getUserInfo(path)), shareReplay(1));
|
|
182
184
|
this.type$ = this.tokenService.type$;
|
|
183
185
|
this.ignorePaths = this.authConfig.ignorePaths || [];
|
|
184
186
|
}
|
|
@@ -219,6 +221,10 @@ class OAuthService {
|
|
|
219
221
|
this.location.replace(`${logoutPath}?post_logout_redirect_uri=${logoutRedirectUri || currentPath}`);
|
|
220
222
|
}
|
|
221
223
|
}
|
|
224
|
+
getUserInfo(path) {
|
|
225
|
+
const { userPath } = this.config;
|
|
226
|
+
return this.http.get(path || userPath);
|
|
227
|
+
}
|
|
222
228
|
revoke() {
|
|
223
229
|
const { revokePath, clientId, clientSecret } = this.authConfig.config;
|
|
224
230
|
if (revokePath) {
|
|
@@ -338,15 +344,15 @@ class OAuthService {
|
|
|
338
344
|
state && this.state$.next(state);
|
|
339
345
|
}
|
|
340
346
|
}
|
|
341
|
-
OAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthService, deps: [{ token: OAuthConfig }, { token: TokenService }, { token:
|
|
347
|
+
OAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthService, deps: [{ token: OAuthConfig }, { token: TokenService }, { token: i3.HttpClient }, { token: LOCATION }, { token: i2.Location }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
342
348
|
OAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthService });
|
|
343
349
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthService, decorators: [{
|
|
344
350
|
type: Injectable
|
|
345
351
|
}], ctorParameters: function () {
|
|
346
|
-
return [{ type: OAuthConfig }, { type: TokenService }, { type:
|
|
352
|
+
return [{ type: OAuthConfig }, { type: TokenService }, { type: i3.HttpClient }, { type: Location, decorators: [{
|
|
347
353
|
type: Inject,
|
|
348
354
|
args: [LOCATION]
|
|
349
|
-
}] }, { type: i2
|
|
355
|
+
}] }, { type: i2.Location }];
|
|
350
356
|
} });
|
|
351
357
|
|
|
352
358
|
class OAuthInterceptor {
|
|
@@ -355,8 +361,8 @@ class OAuthInterceptor {
|
|
|
355
361
|
this.authConfig = authConfig;
|
|
356
362
|
}
|
|
357
363
|
intercept(req, next) {
|
|
358
|
-
return this.tokenService.token$.pipe(take(1), map(token => {
|
|
359
|
-
if (
|
|
364
|
+
return this.isPathExcepted(req) && next.handle(req) || this.tokenService.token$.pipe(take(1), map(token => {
|
|
365
|
+
if (token === null || token === void 0 ? void 0 : token.access_token) {
|
|
360
366
|
req = req.clone({
|
|
361
367
|
setHeaders: {
|
|
362
368
|
Authorization: `${token.token_type} ${token.access_token}`
|
|
@@ -365,7 +371,7 @@ class OAuthInterceptor {
|
|
|
365
371
|
}
|
|
366
372
|
return req;
|
|
367
373
|
}), switchMap(req => next.handle(req)), catchError((err) => {
|
|
368
|
-
if (err.status === 401
|
|
374
|
+
if (err.status === 401) {
|
|
369
375
|
this.tokenService.token = {
|
|
370
376
|
error: `${err.status}`,
|
|
371
377
|
error_description: err.message
|
|
@@ -475,13 +481,13 @@ class OAuthLoginComponent {
|
|
|
475
481
|
}
|
|
476
482
|
}
|
|
477
483
|
_OAuthLoginComponent_subscription = new WeakMap(), _OAuthLoginComponent_redirectUri = new WeakMap(), _OAuthLoginComponent_responseType = new WeakMap(), _OAuthLoginComponent_i18n = new WeakMap();
|
|
478
|
-
OAuthLoginComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthLoginComponent, deps: [{ token: OAuthService }, { token: i2
|
|
479
|
-
OAuthLoginComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: OAuthLoginComponent, selector: "oauth-login", inputs: { type: "type", i18n: "i18n", redirectUri: "redirectUri", responseType: "responseType", useLogoutUrl: "useLogoutUrl", state: "state", profileName$: "profileName$" }, outputs: { stateChange: "stateChange" }, host: { listeners: { "window:keydown.escape": "keyboardEvent()" } }, queries: [{ propertyName: "loginTemplate", first: true, predicate: ["login"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\"\r\n #form=\"ngForm\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED || status === OAuthStatus.DENIED\"\r\n (submit)=\"login({username: username, password: password})\">\r\n <div class=\"mb-3\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n name=\"username\"\r\n required\r\n [(ngModel)]=\"username\"\r\n [placeholder]=\"i18n.username\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <input type=\"password\"\r\n class=\"form-control\"\r\n name=\"password\"\r\n required\r\n [(ngModel)]=\"password\"\r\n [placeholder]=\"i18n.password\">\r\n </div>\r\n <div class=\"text-end\">\r\n <button type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid\">{{i18n.submit}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noResource>\r\n <a role=\"button\"\r\n class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({responseType: responseType, redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span class=\"not-authorized\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\"\r\n [innerHTML]=\"i18n.notAuthorized\"></span>\r\n <span class=\"authorized\"\r\n *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n <span class=\"welcome\" [innerHTML]=\"i18n.authorized + ' '\"></span>\r\n <strong class=\"profile-name\"\r\n [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span class=\"denied\"\r\n *ngIf=\"status === OAuthStatus.DENIED\"\r\n [innerHTML]=\"i18n.denied\"></span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n", styles: [".oauth .dropdown-menu{left:auto;right:0;box-shadow:0 5px 10px #0003;min-width:250px}.oauth .dropdown-menu:before{content:\"\";display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:#0003;position:absolute;top:-7px;left:auto;right:15px}.oauth .dropdown-menu:after{content:\"\";display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:auto;right:16px}\n"], dependencies: [{ kind: "directive", type: i2
|
|
484
|
+
OAuthLoginComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthLoginComponent, deps: [{ token: OAuthService }, { token: i2.Location }, { token: LOCATION }], target: i0.ɵɵFactoryTarget.Component });
|
|
485
|
+
OAuthLoginComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: OAuthLoginComponent, selector: "oauth-login", inputs: { type: "type", i18n: "i18n", redirectUri: "redirectUri", responseType: "responseType", useLogoutUrl: "useLogoutUrl", state: "state", profileName$: "profileName$" }, outputs: { stateChange: "stateChange" }, host: { listeners: { "window:keydown.escape": "keyboardEvent()" } }, queries: [{ propertyName: "loginTemplate", first: true, predicate: ["login"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\"\r\n #form=\"ngForm\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED || status === OAuthStatus.DENIED\"\r\n (submit)=\"login({username: username, password: password})\">\r\n <div class=\"mb-3\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n name=\"username\"\r\n required\r\n [(ngModel)]=\"username\"\r\n [placeholder]=\"i18n.username\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <input type=\"password\"\r\n class=\"form-control\"\r\n name=\"password\"\r\n required\r\n [(ngModel)]=\"password\"\r\n [placeholder]=\"i18n.password\">\r\n </div>\r\n <div class=\"text-end\">\r\n <button type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid\">{{i18n.submit}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noResource>\r\n <a role=\"button\"\r\n class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({responseType: responseType, redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span class=\"not-authorized\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\"\r\n [innerHTML]=\"i18n.notAuthorized\"></span>\r\n <span class=\"authorized\"\r\n *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n <span class=\"welcome\" [innerHTML]=\"i18n.authorized + ' '\"></span>\r\n <strong class=\"profile-name\"\r\n [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span class=\"denied\"\r\n *ngIf=\"status === OAuthStatus.DENIED\"\r\n [innerHTML]=\"i18n.denied\"></span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n", styles: [".oauth .dropdown-menu{left:auto;right:0;box-shadow:0 5px 10px #0003;min-width:250px}.oauth .dropdown-menu:before{content:\"\";display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:#0003;position:absolute;top:-7px;left:auto;right:15px}.oauth .dropdown-menu:after{content:\"\";display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:auto;right:16px}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3$1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
|
|
480
486
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthLoginComponent, decorators: [{
|
|
481
487
|
type: Component,
|
|
482
488
|
args: [{ selector: 'oauth-login', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\"\r\n #form=\"ngForm\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED || status === OAuthStatus.DENIED\"\r\n (submit)=\"login({username: username, password: password})\">\r\n <div class=\"mb-3\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n name=\"username\"\r\n required\r\n [(ngModel)]=\"username\"\r\n [placeholder]=\"i18n.username\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <input type=\"password\"\r\n class=\"form-control\"\r\n name=\"password\"\r\n required\r\n [(ngModel)]=\"password\"\r\n [placeholder]=\"i18n.password\">\r\n </div>\r\n <div class=\"text-end\">\r\n <button type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid\">{{i18n.submit}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noResource>\r\n <a role=\"button\"\r\n class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({responseType: responseType, redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span class=\"not-authorized\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\"\r\n [innerHTML]=\"i18n.notAuthorized\"></span>\r\n <span class=\"authorized\"\r\n *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n <span class=\"welcome\" [innerHTML]=\"i18n.authorized + ' '\"></span>\r\n <strong class=\"profile-name\"\r\n [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span class=\"denied\"\r\n *ngIf=\"status === OAuthStatus.DENIED\"\r\n [innerHTML]=\"i18n.denied\"></span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n", styles: [".oauth .dropdown-menu{left:auto;right:0;box-shadow:0 5px 10px #0003;min-width:250px}.oauth .dropdown-menu:before{content:\"\";display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:#0003;position:absolute;top:-7px;left:auto;right:15px}.oauth .dropdown-menu:after{content:\"\";display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:auto;right:16px}\n"] }]
|
|
483
489
|
}], ctorParameters: function () {
|
|
484
|
-
return [{ type: OAuthService }, { type: i2
|
|
490
|
+
return [{ type: OAuthService }, { type: i2.Location }, { type: Location, decorators: [{
|
|
485
491
|
type: Inject,
|
|
486
492
|
args: [LOCATION]
|
|
487
493
|
}] }];
|
|
@@ -556,6 +562,14 @@ const StorageService = {
|
|
|
556
562
|
},
|
|
557
563
|
deps: [PLATFORM_ID]
|
|
558
564
|
};
|
|
565
|
+
const OAuthHttpClient = {
|
|
566
|
+
provide: OAUTH_HTTP_CLIENT,
|
|
567
|
+
useFactory(httpBackend) {
|
|
568
|
+
// avoid http interceptors
|
|
569
|
+
return new HttpClient(httpBackend);
|
|
570
|
+
},
|
|
571
|
+
deps: [HttpBackend]
|
|
572
|
+
};
|
|
559
573
|
const OAuthInterceptorService = {
|
|
560
574
|
provide: HTTP_INTERCEPTORS,
|
|
561
575
|
useClass: OAuthInterceptor,
|
|
@@ -575,6 +589,7 @@ class OAuthModule {
|
|
|
575
589
|
providers: [
|
|
576
590
|
LocationService,
|
|
577
591
|
StorageService,
|
|
592
|
+
OAuthHttpClient,
|
|
578
593
|
provideOAuthConfigFactory((storage) => (Object.assign(Object.assign({}, defaultConfig(storage)), config)), [STORAGE]),
|
|
579
594
|
TokenService,
|
|
580
595
|
OAuthInterceptorService,
|
|
@@ -614,5 +629,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImpor
|
|
|
614
629
|
* Generated bundle index. Do not edit.
|
|
615
630
|
*/
|
|
616
631
|
|
|
617
|
-
export { HEADER_APPLICATION, LOCATION, OAUTH_CONFIG, OAUTH_TOKEN, OAuthConfig, OAuthInterceptor, OAuthLoginComponent, OAuthModule, OAuthService, OAuthStatus, OAuthType, SERVER_HOST, SERVER_PATH, STORAGE, provideOAuthConfig, provideOAuthConfigFactory };
|
|
632
|
+
export { HEADER_APPLICATION, LOCATION, OAUTH_CONFIG, OAUTH_HTTP_CLIENT, OAUTH_TOKEN, OAuthConfig, OAuthInterceptor, OAuthLoginComponent, OAuthModule, OAuthService, OAuthStatus, OAuthType, SERVER_HOST, SERVER_PATH, STORAGE, provideOAuthConfig, provideOAuthConfigFactory };
|
|
618
633
|
//# sourceMappingURL=ngx-oauth.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-oauth.mjs","sources":["../../../projects/ngx-oauth/src/lib/models/index.ts","../../../projects/ngx-oauth/src/lib/services/token.service.ts","../../../projects/ngx-oauth/src/lib/services/oauth.service.ts","../../../projects/ngx-oauth/src/lib/services/oauth.interceptor.ts","../../../projects/ngx-oauth/src/lib/components/login/oauth-login.component.ts","../../../projects/ngx-oauth/src/lib/components/login/oauth-login.component.html","../../../projects/ngx-oauth/src/lib/oauth.module.ts","../../../projects/ngx-oauth/src/index.ts","../../../projects/ngx-oauth/src/ngx-oauth.ts"],"sourcesContent":["import {FactoryProvider, inject, Injectable, InjectionToken, ValueProvider} from '@angular/core';\nimport {HttpHeaders} from '@angular/common/http';\n\nexport const SERVER_HOST = new InjectionToken<string>('SERVER_HOST');\nexport const SERVER_PATH = new InjectionToken<string>('SERVER_PATH');\nexport const LOCATION = new InjectionToken<Location>('Location');\nexport const STORAGE = new InjectionToken<Storage>('Storage');\nexport const OAUTH_CONFIG = new InjectionToken<OAuthConfig[]>('OAuthConfig');\nexport const OAUTH_TOKEN = new InjectionToken<OAuthToken>('OAuthToken');\nexport const HEADER_APPLICATION = new HttpHeaders({'Content-Type': 'application/x-www-form-urlencoded'});\n\n@Injectable({\n providedIn: 'root',\n useFactory: () => inject(OAUTH_CONFIG).reduce((p, c) => ({...p, ...c}), {})\n})\nexport abstract class OAuthConfig {\n config?: OAuthTypeConfig;\n storageKey?: string;\n storage?: Storage;\n ignorePaths?: RegExp[];\n}\n\nexport const provideOAuthConfig = (config: OAuthConfig = {}): ValueProvider => ({\n provide: OAUTH_CONFIG,\n useValue: config,\n multi: true\n});\n\nexport const provideOAuthConfigFactory = (factory: Function, deps?: any[]): FactoryProvider => ({\n provide: OAUTH_CONFIG,\n useFactory: factory,\n deps: deps,\n multi: true\n});\n\nexport enum OAuthType {\n RESOURCE = 'password',\n AUTHORIZATION_CODE = 'code',\n IMPLICIT = 'token',\n CLIENT_CREDENTIAL = 'client_credentials'\n}\n\nexport interface ClientCredentialConfig {\n tokenPath: string;\n revokePath?: string;\n clientId: string;\n clientSecret?: string;\n scope?: string;\n}\n\n// tslint:disable-next-line:no-empty-interface\nexport interface ResourceConfig extends ClientCredentialConfig {\n}\n\nexport interface ImplicitConfig {\n authorizePath: string;\n revokePath?: string;\n clientId: string;\n scope?: string;\n logoutPath?: string;\n logoutRedirectUri?: string;\n}\n\nexport interface AuthorizationCodeConfig extends ResourceConfig {\n authorizePath: string;\n}\n\nexport interface AuthorizationCodePKCEConfig extends AuthorizationCodeConfig {\n pkce: boolean;\n}\n\nexport interface OpenIdConfig {\n issuerPath: string;\n clientId: string;\n clientSecret?: string;\n scope?: string;\n}\n\nexport interface ResourceParameters {\n username: string;\n password: string;\n}\n\nexport interface AuthorizationParameters {\n redirectUri: string;\n responseType: OAuthType.IMPLICIT | OAuthType.AUTHORIZATION_CODE | string;\n state?: string;\n}\n\nexport type OAuthParameters = ResourceParameters | AuthorizationParameters;\nexport type OAuthTypeConfig = OpenIdConfig\n | AuthorizationCodePKCEConfig\n | AuthorizationCodeConfig\n | ImplicitConfig\n | ResourceConfig\n | ClientCredentialConfig;\n\nexport interface OAuthToken {\n id_token?: string;\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n state?: string;\n error?: string;\n error_description?: string;\n expires_in?: number | string;\n refresh_expires_in?: number | string;\n scope?: string;\n codeVerifier?: string;\n nonce?: string;\n type?: OAuthType;\n expires?: number;\n}\n\nexport enum OAuthStatus {\n NOT_AUTHORIZED = 'NOT_AUTHORIZED',\n AUTHORIZED = 'AUTHORIZED',\n DENIED = 'DENIED'\n}\n\nexport interface OpenIdConfiguration {\n issuer?: string;\n authorization_endpoint?: string;\n introspection_endpoint?: string;\n token_endpoint?: string;\n userinfo_endpoint?: string;\n end_session_endpoint?: string;\n revocation_endpoint?: string;\n scopes_supported?: string[];\n code_challenge_methods_supported?: string[];\n}\n\nexport interface UserInfo {\n email?: string;\n email_verified?: boolean;\n family_name?: string;\n given_name?: string;\n name?: string;\n preferred_username?: string;\n sub?: string;\n address?: object;\n picture?: string;\n locale?: string;\n}\n\nexport interface IntrospectInfo extends UserInfo {\n active: boolean;\n scope: string;\n client_id?: string;\n username: string;\n exp: number;\n}\n","import {Injectable, NgZone} from '@angular/core';\nimport {BehaviorSubject, distinctUntilChanged, Observable, of, switchMap} from 'rxjs';\nimport {HEADER_APPLICATION, OAuthConfig, OAuthToken} from '../models';\nimport {catchError, map, shareReplay} from 'rxjs/operators';\nimport {HttpClient, HttpParams} from '@angular/common/http';\n\nconst isExpiredToken = (token?: OAuthToken) => token && token.expires && Date.now() > token.expires || false;\n\n@Injectable()\nexport class TokenService {\n\n #token$ = new BehaviorSubject<OAuthToken>(this.saved);\n token$ = this.#token$.pipe(\n distinctUntilChanged((p, c) => JSON.stringify(p || null) === JSON.stringify(c || null)),\n switchMap(token => !isExpiredToken(token) && of(token) || this.refreshToken(token)),\n shareReplay(1)\n );\n type$ = this.token$.pipe(\n map(token => token?.type),\n shareReplay(1)\n );\n accessToken$ = this.token$.pipe(\n map(token => token?.access_token),\n shareReplay(1),\n );\n\n constructor(protected authConfig: OAuthConfig,\n protected http: HttpClient,\n protected zone: NgZone) {\n }\n\n get token() {\n return this.#token$.value;\n }\n\n set token(token) {\n const expiresIn = Number(token.expires_in) || 0;\n const result = {\n ...token,\n ...expiresIn && {expires: Date.now() + expiresIn * 1000} || {}\n };\n this.saved = result;\n this.#token$.next(result);\n }\n\n get saved() {\n const {storageKey, storage} = this.authConfig;\n return storageKey && storage && storage[storageKey] && JSON.parse(storage[storageKey]) || {};\n }\n\n set saved(token: OAuthToken) {\n const {storageKey, storage} = this.authConfig;\n if (storage && storageKey) {\n if (token) {\n storage[storageKey] = JSON.stringify(token);\n } else {\n delete storage[storageKey];\n }\n }\n }\n\n protected refreshToken(token?: OAuthToken): Observable<OAuthToken> {\n const {tokenPath, clientId, clientSecret, scope} = this.authConfig.config as any;\n const {refresh_token} = token || {};\n return tokenPath && refresh_token && this.http.post<OAuthToken>(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n grant_type: 'refresh_token',\n refresh_token,\n ...scope && {scope} || {},\n }\n }), {\n headers: HEADER_APPLICATION\n }).pipe(\n catchError(() => {\n this.token = {};\n return of(this.token);\n }),\n map(token => {\n this.token = {\n ...this.token,\n ...token\n };\n return this.token;\n })\n ) || of(token);\n }\n}\n","import {Inject, Injectable} from '@angular/core';\nimport {HttpClient, HttpParams} from '@angular/common/http';\nimport {catchError, concatMap, delay, filter, map, shareReplay, switchMap, tap} from 'rxjs/operators';\nimport {firstValueFrom, from, noop, of, ReplaySubject, throwError} from 'rxjs';\nimport {\n AuthorizationCodeConfig,\n AuthorizationParameters,\n HEADER_APPLICATION,\n LOCATION,\n OAuthConfig,\n OAuthParameters,\n OAuthStatus,\n OAuthToken,\n OAuthType,\n OAuthTypeConfig,\n OpenIdConfig,\n OpenIdConfiguration,\n ResourceParameters,\n UserInfo\n} from '../models';\nimport {Location as Location2} from '@angular/common';\nimport {TokenService} from './token.service';\n\nconst arrToString = (buf: Uint8Array) => buf.reduce((s, b) => s + String.fromCharCode(b), '');\n\nconst base64url = (str: string) => btoa(str)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\nconst randomString = (length: number = 48) => {\n const buff = arrToString(crypto.getRandomValues(new Uint8Array(length * 2)));\n return base64url(buff).substring(0, length);\n};\n\nconst pkce = async (value: string) => {\n const buff = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));\n return base64url(arrToString(new Uint8Array(buff)));\n};\n\nconst parseOauthUri = (hash: string) => {\n const regex = /([^&=]+)=([^&]*)/g;\n const params: Record<string, string> = {};\n let m;\n // tslint:disable-next-line:no-conditional-assignment\n while ((m = regex.exec(hash)) !== null) {\n params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);\n }\n return Object.keys(params).length && params || {};\n};\n\nconst jwt = (token: string) => JSON.parse(atob(token.split('.')[1]));\n\n@Injectable()\nexport class OAuthService {\n\n state$ = new ReplaySubject<string>(1);\n config$ = of(this.config).pipe(\n filter(Boolean),\n filter(config => !!config?.clientId),\n map(config => config as OpenIdConfig),\n switchMap(config => !config.issuerPath && of(config) || this.http.get<OpenIdConfiguration>(`${config.issuerPath}/.well-known/openid-configuration`).pipe(\n tap(v => this.config = {\n ...v.authorization_endpoint && {authorizePath: v.authorization_endpoint} || {},\n ...v.token_endpoint && {tokenPath: v.token_endpoint} || {},\n ...v.revocation_endpoint && {revokePath: v.revocation_endpoint} || {},\n ...v.code_challenge_methods_supported && {pkce: v.code_challenge_methods_supported.indexOf('S256') > -1} || {},\n ...v.userinfo_endpoint && {userPath: v.userinfo_endpoint} || {},\n ...v.introspection_endpoint && {introspectionPath: v.introspection_endpoint} || {},\n ...v.end_session_endpoint && {logoutPath: v.end_session_endpoint} || {},\n ...{scope: config.scope || 'openid'}\n } as any),\n map(() => this.config)\n )),\n shareReplay(1)\n );\n token$ = this.config$.pipe(\n tap(config => {\n const {hash, search, origin, pathname} = this.location;\n const isImplicitRedirect = hash && /(access_token=)|(error=)/.test(hash);\n const isAuthCodeRedirect = search && /(code=)|(error=)/.test(search) || hash && /(code=)|(error=)/.test(hash);\n if (isImplicitRedirect) {\n const parameters = parseOauthUri(hash.substring(1));\n this.token = {\n ...parameters,\n type: OAuthType.IMPLICIT,\n };\n this.checkResponse(this.token, parameters);\n } else if (isAuthCodeRedirect) {\n const parameters = parseOauthUri(search && search.substring(1) || hash && hash.substring(1));\n console.log(parameters);\n if (!this.checkResponse(this.token, parameters)) {\n this.token = parameters;\n } else {\n const newParametersString = this.getCleanedUnSearchParameters();\n const {clientId, clientSecret, tokenPath, scope} = config as AuthorizationCodeConfig;\n const {codeVerifier} = this.token || {}; //should be set by authorizationUrl construction\n this.http.post(tokenPath, new HttpParams({\n fromObject: {\n code: parameters?.['code'],\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n redirect_uri: `${origin}${pathname}`,\n grant_type: 'authorization_code',\n ...scope && {scope} || {},\n ...codeVerifier && {code_verifier: codeVerifier} || {}\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n ).subscribe(token => {\n this.token = {\n ...token,\n type: OAuthType.AUTHORIZATION_CODE\n };\n this.locationService.replaceState(`${pathname}${newParametersString}`);\n });\n }\n }\n }),\n switchMap(() => this.tokenService.token$),\n shareReplay(1)\n );\n status$ = this.token$.pipe(\n map(token => token.access_token && OAuthStatus.AUTHORIZED || token.error && OAuthStatus.DENIED || OAuthStatus.NOT_AUTHORIZED),\n shareReplay(1)\n );\n userInfo$ = this.status$.pipe(\n filter(s => s === OAuthStatus.AUTHORIZED),\n map(() => {\n const {config} = this.authConfig as any;\n return config.userPath;\n }),\n filter(Boolean),\n switchMap(path => this.http.get<UserInfo>(path)),\n shareReplay(1)\n );\n type$ = this.tokenService.type$;\n ignorePaths = this.authConfig.ignorePaths || [];\n\n get token() {\n return this.tokenService.token;\n }\n\n set token(token) {\n this.tokenService.token = token;\n }\n\n get config() {\n return this.authConfig.config;\n }\n\n set config(config: OAuthTypeConfig | undefined) {\n if (config) {\n this.authConfig.config = {\n ...this.authConfig.config,\n ...config\n };\n }\n }\n\n constructor(protected authConfig: OAuthConfig,\n protected tokenService: TokenService,\n protected http: HttpClient,\n @Inject(LOCATION) protected location: Location,\n protected locationService: Location2) {\n }\n\n async login(parameters?: OAuthParameters) {\n if (!!parameters && (parameters as ResourceParameters).password) {\n await this.resourceLogin(parameters as ResourceParameters);\n } else if (!!parameters && (parameters as AuthorizationParameters).redirectUri && (parameters as AuthorizationParameters).responseType\n ) {\n await this.toAuthorizationUrl(parameters as AuthorizationParameters);\n } else {\n await this.clientCredentialLogin();\n }\n }\n\n logout(useLogoutUrl?: boolean) {\n this.revoke();\n this.token = {};\n const {logoutPath, logoutRedirectUri} = this.authConfig.config as any;\n if (useLogoutUrl && logoutPath) {\n const {origin, pathname} = this.location;\n const currentPath = `${origin}${pathname}`;\n this.location.replace(`${logoutPath}?post_logout_redirect_uri=${logoutRedirectUri || currentPath}`);\n }\n }\n\n protected revoke() {\n const {revokePath, clientId, clientSecret} = this.authConfig.config as any;\n if (revokePath) {\n const {access_token, refresh_token} = this.token || {};\n const toRevoke = [];\n if (access_token) {\n toRevoke.push({\n ...clientId && {client_id: clientId} || {},\n ...clientSecret && {client_secret: clientSecret} || {},\n token: access_token,\n token_type_hint: 'access_token'\n });\n }\n if (refresh_token) {\n toRevoke.push({\n ...clientId && {client_id: clientId} || {},\n ...clientSecret && {client_secret: clientSecret} || {},\n token: refresh_token,\n token_type_hint: 'refresh_token'\n });\n }\n from(toRevoke).pipe(\n concatMap(o => of(o).pipe(delay(300))), // space request to avoid cancellation\n switchMap(o => this.http.post(revokePath, new HttpParams({fromObject: o}))),\n ).subscribe(noop);\n }\n }\n\n protected clientCredentialLogin() {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n return firstValueFrom(this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n client_secret: clientSecret,\n grant_type: OAuthType.CLIENT_CREDENTIAL,\n ...scope ? {scope} : {},\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n catchError((err) => {\n this.token = err;\n return throwError(() => err);\n }),\n tap(params => {\n this.token = {\n ...params,\n type: OAuthType.CLIENT_CREDENTIAL,\n };\n }),\n ));\n }\n\n protected resourceLogin(parameters: ResourceParameters) {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n const {username, password} = parameters;\n return firstValueFrom(this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n grant_type: OAuthType.RESOURCE,\n ...scope && {scope} || {},\n username,\n password\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n catchError(err => {\n this.token = err;\n return throwError(() => err);\n }),\n tap(params => {\n this.token = {\n ...params,\n type: OAuthType.RESOURCE,\n };\n })\n ));\n }\n\n protected async toAuthorizationUrl(parameters: AuthorizationParameters) {\n const {config} = this.authConfig as any;\n let authorizationUrl = `${config.authorizePath}`;\n authorizationUrl += config.authorizePath.includes('?') && '&' || '?';\n authorizationUrl += `client_id=${config.clientId}`;\n authorizationUrl += `&redirect_uri=${encodeURIComponent(parameters.redirectUri)}`;\n authorizationUrl += `&response_type=${parameters.responseType}`;\n authorizationUrl += `&scope=${encodeURIComponent(config.scope || '')}`;\n authorizationUrl += `&state=${encodeURIComponent(parameters.state || '')}`;\n return this.location.replace(`${authorizationUrl}${this.generateNonce(config)}${await this.generateCodeChallenge(config)}`);\n }\n\n protected async generateCodeChallenge(config: any) {\n if (config.pkce) {\n const codeVerifier = randomString();\n this.token = {...this.token, codeVerifier};\n return `&code_challenge=${await pkce(codeVerifier)}&code_challenge_method=S256`;\n }\n return '';\n }\n\n protected generateNonce(config: any) {\n if (config && config.scope && config.scope.indexOf('openid') > -1) {\n const nonce = randomString(10);\n this.token = {...this.token, nonce};\n return `&nonce=${nonce}`;\n }\n return '';\n }\n\n private checkResponse(token?: OAuthToken,\n parameters?: Record<string, string>) {\n this.emitState(parameters);\n this.cleanLocationHash();\n if (!parameters || parameters['error']) {\n return false;\n }\n if (token && token.nonce && parameters['access_token']) {\n const jwtToken = jwt(parameters['access_token']);\n return token.nonce === jwtToken.nonce;\n }\n return parameters['access_token'] || parameters['code'];\n }\n\n private getCleanedUnSearchParameters() {\n const {search} = this.location;\n let searchString = search && search.substring(1) || '';\n const hashKeys = ['code', 'state', 'error', 'error_description', 'session_state', 'scope', 'authuser', 'prompt'];\n hashKeys.forEach(hashKey => {\n const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');\n searchString = searchString.replace(re, '');\n });\n return searchString.length && `?${searchString}` || '';\n }\n\n private cleanLocationHash() {\n const {hash} = this.location;\n let curHash = hash && hash.substring(1) || '';\n const hashKeys = [\n 'access_token',\n 'token_type',\n 'expires_in',\n 'scope',\n 'state',\n 'error',\n 'error_description',\n 'session_state',\n 'nonce',\n 'id_token',\n 'code'\n ];\n hashKeys.forEach(hashKey => {\n const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');\n curHash = curHash.replace(re, '');\n });\n this.location.hash = curHash;\n }\n\n private emitState(parameters?: Record<string, string>) {\n const {state} = parameters || {};\n state && this.state$.next(state);\n }\n}\n","import {Injectable} from '@angular/core';\nimport {HttpErrorResponse, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {switchMap, take, throwError} from 'rxjs';\nimport {catchError, map} from 'rxjs/operators';\nimport {OAuthConfig} from '../models';\nimport {TokenService} from './token.service';\n\n@Injectable()\nexport class OAuthInterceptor implements HttpInterceptor {\n\n constructor(protected tokenService: TokenService,\n protected authConfig: OAuthConfig) {\n }\n\n intercept(req: HttpRequest<any>, next: HttpHandler) {\n return this.tokenService.token$.pipe(\n take(1),\n map(token => {\n if (token?.access_token && !this.isPathExcepted(req)) {\n req = req.clone({\n setHeaders: {\n Authorization: `${token.token_type} ${token.access_token}`\n }\n });\n }\n return req;\n }),\n switchMap(req => next.handle(req)),\n catchError((err: HttpErrorResponse) => {\n if (err.status === 401 && !this.isPathExcepted(req)) {\n this.tokenService.token = {\n error: `${err.status}`,\n error_description: err.message\n };\n }\n return throwError(() => err);\n })\n );\n }\n\n private isPathExcepted(req: HttpRequest<any>) {\n const {ignorePaths} = this.authConfig || {};\n if (ignorePaths) {\n for (const ignorePath of ignorePaths) {\n try {\n if (req.url.match(ignorePath)) {\n return true;\n }\n } catch (err) {\n }\n }\n }\n return false;\n }\n}\n","import {Component, ContentChild, HostListener, Inject, Input, OnDestroy, Output, TemplateRef, ViewEncapsulation} from '@angular/core';\r\nimport {Observable, Subscription, take} from 'rxjs';\r\nimport {LOCATION, OAuthParameters, OAuthStatus, OAuthType} from '../../models';\r\nimport {tap} from 'rxjs/operators';\r\nimport {OAuthService} from '../../services/oauth.service';\r\nimport {Location as Location2} from '@angular/common';\r\n\r\nexport interface OAuthLoginI18n {\r\n username?: string;\r\n password?: string;\r\n submit?: string;\r\n notAuthorized?: string;\r\n authorized?: string;\r\n denied?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'oauth-login',\r\n templateUrl: 'oauth-login.component.html',\r\n styleUrls: ['oauth-login.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class OAuthLoginComponent implements OnDestroy {\r\n\r\n #subscription = new Subscription();\r\n #redirectUri?: string;\r\n #responseType?: string;\r\n #i18n: OAuthLoginI18n = {\r\n username: 'Username',\r\n password: 'Password',\r\n submit: 'Sign in',\r\n notAuthorized: 'Sign in',\r\n authorized: 'Welcome',\r\n denied: 'Access Denied. Try again!'\r\n };\r\n\r\n get i18n() {\r\n return this.#i18n;\r\n }\r\n\r\n @Input()\r\n type: OAuthType = OAuthType.RESOURCE;\r\n\r\n @Input()\r\n set i18n(i18n) {\r\n this.#i18n = {\r\n ...this.#i18n,\r\n ...i18n\r\n };\r\n }\r\n\r\n get redirectUri() {\r\n return this.#redirectUri || `${this.location.origin}${this.locationService.path(true) || '/'}`;\r\n }\r\n\r\n @Input()\r\n set redirectUri(redirectUri: string) {\r\n if (redirectUri) {\r\n this.#redirectUri = redirectUri;\r\n }\r\n }\r\n\r\n @Input()\r\n set responseType(responseType: string) {\r\n if (this.responseType) {\r\n this.#responseType = responseType;\r\n }\r\n }\r\n\r\n get responseType() {\r\n return this.#responseType || this.type;\r\n }\r\n\r\n @Input()\r\n useLogoutUrl = false;\r\n @Input()\r\n state = '';\r\n @Output()\r\n stateChange = this.oauthService.state$.asObservable();\r\n @Input()\r\n profileName$: Observable<string | undefined> | undefined;\r\n @ContentChild('login', {static: false})\r\n loginTemplate: TemplateRef<any> | undefined;\r\n username = '';\r\n password = '';\r\n profileName?: string;\r\n OAuthStatus = OAuthStatus;\r\n OAuthType = OAuthType;\r\n collapse = false;\r\n status$ = this.oauthService.status$.pipe(\r\n tap(s => {\r\n if (s === OAuthStatus.AUTHORIZED && this.profileName$) {\r\n this.#subscription.add(this.profileName$.pipe(\r\n take(1)\r\n ).subscribe(n => this.profileName = n));\r\n } else {\r\n const {token} = this.oauthService;\r\n const userInfo = token && token.id_token && JSON.parse(atob(token.id_token.split('.')[1])) || {};\r\n this.profileName = userInfo.name || userInfo.username || userInfo.email || userInfo.sub || '';\r\n }\r\n })\r\n );\r\n loginFunction = (p: OAuthParameters) => this.login(p);\r\n logoutFunction = () => this.logout();\r\n\r\n constructor(private oauthService: OAuthService,\r\n private locationService: Location2,\r\n @Inject(LOCATION) private location: Location) {\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n logout() {\r\n this.oauthService.logout(this.useLogoutUrl);\r\n }\r\n\r\n login(parameters: OAuthParameters) {\r\n this.collapse = false;\r\n return this.oauthService.login(parameters);\r\n }\r\n\r\n toggleCollapse() {\r\n this.collapse = !this.collapse;\r\n }\r\n\r\n @HostListener('window:keydown.escape')\r\n keyboardEvent() {\r\n this.collapse = false;\r\n }\r\n}\r\n","<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\"\r\n #form=\"ngForm\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED || status === OAuthStatus.DENIED\"\r\n (submit)=\"login({username: username, password: password})\">\r\n <div class=\"mb-3\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n name=\"username\"\r\n required\r\n [(ngModel)]=\"username\"\r\n [placeholder]=\"i18n.username\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <input type=\"password\"\r\n class=\"form-control\"\r\n name=\"password\"\r\n required\r\n [(ngModel)]=\"password\"\r\n [placeholder]=\"i18n.password\">\r\n </div>\r\n <div class=\"text-end\">\r\n <button type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid\">{{i18n.submit}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noResource>\r\n <a role=\"button\"\r\n class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({responseType: responseType, redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span class=\"not-authorized\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\"\r\n [innerHTML]=\"i18n.notAuthorized\"></span>\r\n <span class=\"authorized\"\r\n *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n <span class=\"welcome\" [innerHTML]=\"i18n.authorized + ' '\"></span>\r\n <strong class=\"profile-name\"\r\n [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span class=\"denied\"\r\n *ngIf=\"status === OAuthStatus.DENIED\"\r\n [innerHTML]=\"i18n.denied\"></span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n","import {ModuleWithProviders, NgModule, Optional, PLATFORM_ID} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http';\nimport {RouterModule} from '@angular/router';\nimport {LOCATION, OAuthConfig, provideOAuthConfigFactory, SERVER_HOST, SERVER_PATH, STORAGE} from './models';\nimport {OAuthService} from './services/oauth.service';\nimport {OAuthLoginComponent} from './components/login/oauth-login.component';\nimport {CommonModule, isPlatformBrowser} from '@angular/common';\nimport {OAuthInterceptor} from './services/oauth.interceptor';\nimport {TokenService} from './services/token.service';\n\nconst mockLocation = (serverHost: string, serverPath: string): Location => {\n const url = new URL(serverHost && serverPath ? `${serverHost}${serverPath}` : 'http://localhost');\n const {href, origin, protocol, host, hostname, port, pathname, search, hash} = url;\n return {\n href, origin, protocol, host, hostname, port, pathname, search, hash,\n reload() {\n },\n assign(_: string) {\n },\n ancestorOrigins: {} as any,\n replace(_: string) {\n }\n };\n};\n\nconst LocationService = {\n provide: LOCATION,\n useFactory(platformId: Object, serverHost: string, serverPath: string) {\n return isPlatformBrowser(platformId) ? location : mockLocation(serverHost, serverPath);\n },\n deps: [\n PLATFORM_ID,\n [new Optional(), SERVER_HOST],\n [new Optional(), SERVER_PATH]\n ]\n};\n\nconst mockStorage: Storage = {\n clear() {\n },\n getItem(key: string) {\n return null;\n },\n key(index: number) {\n return null;\n },\n removeItem(key: string) {\n },\n setItem(key: string, value: string) {\n },\n length: 0\n};\n\nconst StorageService = {\n provide: STORAGE,\n useFactory(platformId: Object) {\n return isPlatformBrowser(platformId) ? localStorage : mockStorage;\n },\n deps: [PLATFORM_ID]\n};\n\nconst OAuthInterceptorService = {\n provide: HTTP_INTERCEPTORS,\n useClass: OAuthInterceptor,\n multi: true,\n};\n\nconst defaultConfig = (storage: Storage) => {\n return {\n storage,\n storageKey: 'token',\n ignorePaths: []\n };\n};\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n HttpClientModule,\n RouterModule,\n ],\n declarations: [OAuthLoginComponent],\n exports: [OAuthLoginComponent]\n})\nexport class OAuthModule {\n\n static forRoot(config: OAuthConfig = {}): ModuleWithProviders<OAuthModule> {\n return {\n ngModule: OAuthModule,\n providers: [\n LocationService,\n StorageService,\n provideOAuthConfigFactory((storage: Storage) => ({\n ...defaultConfig(storage),\n ...config\n }), [STORAGE]),\n TokenService,\n OAuthInterceptorService,\n OAuthService,\n ]\n };\n }\n}\n","/*\n * Public API Surface of ngx-oauth\n */\nexport * from './lib/models';\nexport * from './lib/services/oauth.service';\nexport * from './lib/services/oauth.interceptor';\nexport * from './lib/components/login/oauth-login.component';\nexport * from './lib/oauth.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.OAuthConfig","switchMap","i4","i1.TokenService","i2.OAuthConfig","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-oauth.mjs","sources":["../../../projects/ngx-oauth/src/lib/models/index.ts","../../../projects/ngx-oauth/src/lib/services/token.service.ts","../../../projects/ngx-oauth/src/lib/services/oauth.service.ts","../../../projects/ngx-oauth/src/lib/services/oauth.interceptor.ts","../../../projects/ngx-oauth/src/lib/components/login/oauth-login.component.ts","../../../projects/ngx-oauth/src/lib/components/login/oauth-login.component.html","../../../projects/ngx-oauth/src/lib/oauth.module.ts","../../../projects/ngx-oauth/src/index.ts","../../../projects/ngx-oauth/src/ngx-oauth.ts"],"sourcesContent":["import {FactoryProvider, inject, Injectable, InjectionToken, ValueProvider} from '@angular/core';\nimport {HttpClient, HttpHeaders} from '@angular/common/http';\n\nexport const SERVER_HOST = new InjectionToken<string>('SERVER_HOST');\nexport const SERVER_PATH = new InjectionToken<string>('SERVER_PATH');\nexport const LOCATION = new InjectionToken<Location>('Location');\nexport const STORAGE = new InjectionToken<Storage>('Storage');\nexport const OAUTH_CONFIG = new InjectionToken<OAuthConfig[]>('OAuthConfig');\nexport const OAUTH_TOKEN = new InjectionToken<OAuthToken>('OAuthToken');\nexport const HEADER_APPLICATION = new HttpHeaders({'Content-Type': 'application/x-www-form-urlencoded'});\nexport const OAUTH_HTTP_CLIENT = new InjectionToken<HttpClient>('OAuthHttpClient');\n\n@Injectable({\n providedIn: 'root',\n useFactory: () => inject(OAUTH_CONFIG).reduce((p, c) => ({...p, ...c}), {})\n})\nexport abstract class OAuthConfig {\n config?: OAuthTypeConfig;\n storageKey?: string;\n storage?: Storage;\n ignorePaths?: RegExp[];\n}\n\nexport const provideOAuthConfig = (config: OAuthConfig = {}): ValueProvider => ({\n provide: OAUTH_CONFIG,\n useValue: config,\n multi: true\n});\n\nexport const provideOAuthConfigFactory = (factory: Function, deps?: any[]): FactoryProvider => ({\n provide: OAUTH_CONFIG,\n useFactory: factory,\n deps: deps,\n multi: true\n});\n\nexport enum OAuthType {\n RESOURCE = 'password',\n AUTHORIZATION_CODE = 'code',\n IMPLICIT = 'token',\n CLIENT_CREDENTIAL = 'client_credentials'\n}\n\nexport interface ClientCredentialConfig {\n tokenPath: string;\n revokePath?: string;\n clientId: string;\n clientSecret?: string;\n scope?: string;\n}\n\n// tslint:disable-next-line:no-empty-interface\nexport interface ResourceConfig extends ClientCredentialConfig {\n}\n\nexport interface ImplicitConfig {\n authorizePath: string;\n revokePath?: string;\n clientId: string;\n scope?: string;\n logoutPath?: string;\n logoutRedirectUri?: string;\n}\n\nexport interface AuthorizationCodeConfig extends ResourceConfig {\n authorizePath: string;\n}\n\nexport interface AuthorizationCodePKCEConfig extends AuthorizationCodeConfig {\n pkce: boolean;\n}\n\nexport interface OpenIdConfig {\n issuerPath: string;\n clientId: string;\n clientSecret?: string;\n scope?: string;\n}\n\nexport interface ResourceParameters {\n username: string;\n password: string;\n}\n\nexport interface AuthorizationParameters {\n redirectUri: string;\n responseType: OAuthType.IMPLICIT | OAuthType.AUTHORIZATION_CODE | string;\n state?: string;\n}\n\nexport type OAuthParameters = ResourceParameters | AuthorizationParameters;\nexport type OAuthTypeConfig = OpenIdConfig\n | AuthorizationCodePKCEConfig\n | AuthorizationCodeConfig\n | ImplicitConfig\n | ResourceConfig\n | ClientCredentialConfig;\n\nexport interface OAuthToken {\n id_token?: string;\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n state?: string;\n error?: string;\n error_description?: string;\n expires_in?: number | string;\n refresh_expires_in?: number | string;\n scope?: string;\n codeVerifier?: string;\n nonce?: string;\n type?: OAuthType;\n expires?: number;\n \n [x: string]: any;\n}\n\nexport enum OAuthStatus {\n NOT_AUTHORIZED = 'NOT_AUTHORIZED',\n AUTHORIZED = 'AUTHORIZED',\n DENIED = 'DENIED'\n}\n\nexport interface OpenIdConfiguration {\n issuer?: string;\n authorization_endpoint?: string;\n introspection_endpoint?: string;\n token_endpoint?: string;\n userinfo_endpoint?: string;\n end_session_endpoint?: string;\n revocation_endpoint?: string;\n scopes_supported?: string[];\n code_challenge_methods_supported?: string[];\n}\n\nexport interface UserInfo {\n email?: string;\n email_verified?: boolean;\n family_name?: string;\n given_name?: string;\n name?: string;\n preferred_username?: string;\n sub?: string;\n address?: object;\n picture?: string;\n locale?: string;\n}\n\nexport interface IntrospectInfo extends UserInfo {\n active: boolean;\n scope: string;\n client_id?: string;\n username: string;\n exp: number;\n}\n","import {Inject, Injectable, NgZone} from '@angular/core';\nimport {BehaviorSubject, distinctUntilChanged, Observable, of, switchMap} from 'rxjs';\nimport {HEADER_APPLICATION, OAUTH_HTTP_CLIENT, OAuthConfig, OAuthToken} from '../models';\nimport {catchError, map, shareReplay} from 'rxjs/operators';\nimport {HttpClient, HttpParams} from '@angular/common/http';\n\nconst isExpiredToken = (token?: OAuthToken) => token && token.expires && Date.now() > token.expires || false;\n\n@Injectable()\nexport class TokenService {\n\n #token$ = new BehaviorSubject<OAuthToken>(this.saved);\n token$ = this.#token$.pipe(\n distinctUntilChanged((p, c) => JSON.stringify(p || null) === JSON.stringify(c || null)),\n shareReplay(1),\n switchMap(token => !isExpiredToken(token) && of(token) || this.refreshToken(token)),\n );\n type$ = this.token$.pipe(\n map(token => token?.type),\n shareReplay(1)\n );\n accessToken$ = this.token$.pipe(\n map(token => token?.access_token),\n shareReplay(1),\n );\n\n constructor(protected authConfig: OAuthConfig,\n @Inject(OAUTH_HTTP_CLIENT) protected http: HttpClient,\n protected zone: NgZone) {\n }\n\n get token() {\n return this.#token$.value;\n }\n\n set token(token) {\n const expiresIn = Number(token.expires_in) || 0;\n const result = {\n ...token,\n ...expiresIn && {expires: Date.now() + expiresIn * 1000} || {}\n };\n this.saved = result;\n this.#token$.next(result);\n }\n\n get saved() {\n const {storageKey, storage} = this.authConfig;\n return storageKey && storage && storage[storageKey] && JSON.parse(storage[storageKey]) || {};\n }\n\n set saved(token: OAuthToken) {\n const {storageKey, storage} = this.authConfig;\n if (storage && storageKey) {\n if (token) {\n storage[storageKey] = JSON.stringify(token);\n } else {\n delete storage[storageKey];\n }\n }\n }\n\n protected refreshToken(token?: OAuthToken): Observable<OAuthToken> {\n const {tokenPath, clientId, clientSecret, scope} = this.authConfig.config as any;\n const {refresh_token} = token || {};\n return tokenPath && refresh_token && this.http.post<OAuthToken>(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n grant_type: 'refresh_token',\n refresh_token,\n ...scope && {scope} || {},\n }\n }), {\n headers: HEADER_APPLICATION\n }).pipe(\n catchError(() => {\n this.token = {};\n return of(this.token);\n }),\n map(token => {\n this.token = {\n ...this.token,\n ...token\n };\n return this.token;\n })\n ) || of(token);\n }\n}\n","import {Inject, Injectable} from '@angular/core';\nimport {HttpClient, HttpParams} from '@angular/common/http';\nimport {catchError, concatMap, delay, filter, map, shareReplay, switchMap, tap} from 'rxjs/operators';\nimport {firstValueFrom, from, noop, of, ReplaySubject, throwError} from 'rxjs';\nimport {\n AuthorizationCodeConfig,\n AuthorizationParameters,\n HEADER_APPLICATION,\n LOCATION,\n OAuthConfig,\n OAuthParameters,\n OAuthStatus,\n OAuthToken,\n OAuthType,\n OAuthTypeConfig,\n OpenIdConfig,\n OpenIdConfiguration,\n ResourceParameters,\n UserInfo\n} from '../models';\nimport {Location as Location2} from '@angular/common';\nimport {TokenService} from './token.service';\n\nconst arrToString = (buf: Uint8Array) => buf.reduce((s, b) => s + String.fromCharCode(b), '');\n\nconst base64url = (str: string) => btoa(str)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\nconst randomString = (length: number = 48) => {\n const buff = arrToString(crypto.getRandomValues(new Uint8Array(length * 2)));\n return base64url(buff).substring(0, length);\n};\n\nconst pkce = async (value: string) => {\n const buff = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));\n return base64url(arrToString(new Uint8Array(buff)));\n};\n\nconst parseOauthUri = (hash: string) => {\n const regex = /([^&=]+)=([^&]*)/g;\n const params: Record<string, string> = {};\n let m;\n // tslint:disable-next-line:no-conditional-assignment\n while ((m = regex.exec(hash)) !== null) {\n params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);\n }\n return Object.keys(params).length && params || {};\n};\n\nconst jwt = (token: string) => JSON.parse(atob(token.split('.')[1]));\n\n@Injectable()\nexport class OAuthService {\n\n state$ = new ReplaySubject<string>(1);\n config$ = of(this.config).pipe(\n filter(Boolean),\n filter(config => !!config?.clientId),\n map(config => config as OpenIdConfig),\n switchMap(config => !config.issuerPath && of(config) || this.http.get<OpenIdConfiguration>(`${config.issuerPath}/.well-known/openid-configuration`).pipe(\n tap(v => this.config = {\n ...v.authorization_endpoint && {authorizePath: v.authorization_endpoint} || {},\n ...v.token_endpoint && {tokenPath: v.token_endpoint} || {},\n ...v.revocation_endpoint && {revokePath: v.revocation_endpoint} || {},\n ...v.code_challenge_methods_supported && {pkce: v.code_challenge_methods_supported.indexOf('S256') > -1} || {},\n ...v.userinfo_endpoint && {userPath: v.userinfo_endpoint} || {},\n ...v.introspection_endpoint && {introspectionPath: v.introspection_endpoint} || {},\n ...v.end_session_endpoint && {logoutPath: v.end_session_endpoint} || {},\n ...{scope: config.scope || 'openid'}\n } as any),\n map(() => this.config)\n )),\n shareReplay(1)\n );\n token$ = this.config$.pipe(\n tap(config => {\n const {hash, search, origin, pathname} = this.location;\n const isImplicitRedirect = hash && /(access_token=)|(error=)/.test(hash);\n const isAuthCodeRedirect = search && /(code=)|(error=)/.test(search) || hash && /(code=)|(error=)/.test(hash);\n if (isImplicitRedirect) {\n const parameters = parseOauthUri(hash.substring(1));\n this.token = {\n ...parameters,\n type: OAuthType.IMPLICIT,\n };\n this.checkResponse(this.token, parameters);\n } else if (isAuthCodeRedirect) {\n const parameters = parseOauthUri(search && search.substring(1) || hash && hash.substring(1));\n if (!this.checkResponse(this.token, parameters)) {\n this.token = parameters;\n } else {\n const newParametersString = this.getCleanedUnSearchParameters();\n const {clientId, clientSecret, tokenPath, scope} = config as AuthorizationCodeConfig;\n const {codeVerifier} = this.token || {}; //should be set by authorizationUrl construction\n this.http.post(tokenPath, new HttpParams({\n fromObject: {\n code: parameters?.['code'],\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n redirect_uri: `${origin}${pathname}`,\n grant_type: 'authorization_code',\n ...scope && {scope} || {},\n ...codeVerifier && {code_verifier: codeVerifier} || {}\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n ).subscribe(token => {\n this.token = {\n ...token,\n type: OAuthType.AUTHORIZATION_CODE\n };\n this.locationService.replaceState(`${pathname}${newParametersString}`);\n });\n }\n }\n }),\n switchMap(() => this.tokenService.token$),\n shareReplay(1)\n );\n status$ = this.token$.pipe(\n map(token => token.access_token && OAuthStatus.AUTHORIZED || token.error && OAuthStatus.DENIED || OAuthStatus.NOT_AUTHORIZED),\n shareReplay(1)\n );\n userInfo$ = this.status$.pipe(\n filter(s => s === OAuthStatus.AUTHORIZED),\n map(() => (this.config as any).userPath),\n filter(Boolean),\n switchMap(path => this.getUserInfo(path)),\n shareReplay(1)\n );\n type$ = this.tokenService.type$;\n ignorePaths = this.authConfig.ignorePaths || [];\n\n get token() {\n return this.tokenService.token;\n }\n\n set token(token) {\n this.tokenService.token = token;\n }\n\n get config() {\n return this.authConfig.config;\n }\n\n set config(config: OAuthTypeConfig | undefined) {\n if (config) {\n this.authConfig.config = {\n ...this.authConfig.config,\n ...config\n };\n }\n }\n\n constructor(protected authConfig: OAuthConfig,\n protected tokenService: TokenService,\n protected http: HttpClient,\n @Inject(LOCATION) protected location: Location,\n protected locationService: Location2) {\n }\n\n async login(parameters?: OAuthParameters) {\n if (!!parameters && (parameters as ResourceParameters).password) {\n await this.resourceLogin(parameters as ResourceParameters);\n } else if (!!parameters && (parameters as AuthorizationParameters).redirectUri && (parameters as AuthorizationParameters).responseType\n ) {\n await this.toAuthorizationUrl(parameters as AuthorizationParameters);\n } else {\n await this.clientCredentialLogin();\n }\n }\n\n logout(useLogoutUrl?: boolean) {\n this.revoke();\n this.token = {};\n const {logoutPath, logoutRedirectUri} = this.authConfig.config as any;\n if (useLogoutUrl && logoutPath) {\n const {origin, pathname} = this.location;\n const currentPath = `${origin}${pathname}`;\n this.location.replace(`${logoutPath}?post_logout_redirect_uri=${logoutRedirectUri || currentPath}`);\n }\n }\n\n getUserInfo(path?: string) {\n const {userPath} = this.config as any;\n return this.http.get<UserInfo>(path || userPath);\n }\n\n protected revoke() {\n const {revokePath, clientId, clientSecret} = this.authConfig.config as any;\n if (revokePath) {\n const {access_token, refresh_token} = this.token || {};\n const toRevoke = [];\n if (access_token) {\n toRevoke.push({\n ...clientId && {client_id: clientId} || {},\n ...clientSecret && {client_secret: clientSecret} || {},\n token: access_token,\n token_type_hint: 'access_token'\n });\n }\n if (refresh_token) {\n toRevoke.push({\n ...clientId && {client_id: clientId} || {},\n ...clientSecret && {client_secret: clientSecret} || {},\n token: refresh_token,\n token_type_hint: 'refresh_token'\n });\n }\n from(toRevoke).pipe(\n concatMap(o => of(o).pipe(delay(300))), // space request to avoid cancellation\n switchMap(o => this.http.post(revokePath, new HttpParams({fromObject: o}))),\n ).subscribe(noop);\n }\n }\n\n protected clientCredentialLogin() {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n return firstValueFrom(this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n client_secret: clientSecret,\n grant_type: OAuthType.CLIENT_CREDENTIAL,\n ...scope ? {scope} : {},\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n catchError((err) => {\n this.token = err;\n return throwError(() => err);\n }),\n tap(params => {\n this.token = {\n ...params,\n type: OAuthType.CLIENT_CREDENTIAL,\n };\n }),\n ));\n }\n\n protected resourceLogin(parameters: ResourceParameters) {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n const {username, password} = parameters;\n return firstValueFrom(this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n grant_type: OAuthType.RESOURCE,\n ...scope && {scope} || {},\n username,\n password\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n catchError(err => {\n this.token = err;\n return throwError(() => err);\n }),\n tap(params => {\n this.token = {\n ...params,\n type: OAuthType.RESOURCE,\n };\n })\n ));\n }\n\n protected async toAuthorizationUrl(parameters: AuthorizationParameters) {\n const {config} = this.authConfig as any;\n let authorizationUrl = `${config.authorizePath}`;\n authorizationUrl += config.authorizePath.includes('?') && '&' || '?';\n authorizationUrl += `client_id=${config.clientId}`;\n authorizationUrl += `&redirect_uri=${encodeURIComponent(parameters.redirectUri)}`;\n authorizationUrl += `&response_type=${parameters.responseType}`;\n authorizationUrl += `&scope=${encodeURIComponent(config.scope || '')}`;\n authorizationUrl += `&state=${encodeURIComponent(parameters.state || '')}`;\n return this.location.replace(`${authorizationUrl}${this.generateNonce(config)}${await this.generateCodeChallenge(config)}`);\n }\n\n protected async generateCodeChallenge(config: any) {\n if (config.pkce) {\n const codeVerifier = randomString();\n this.token = {...this.token, codeVerifier};\n return `&code_challenge=${await pkce(codeVerifier)}&code_challenge_method=S256`;\n }\n return '';\n }\n\n protected generateNonce(config: any) {\n if (config && config.scope && config.scope.indexOf('openid') > -1) {\n const nonce = randomString(10);\n this.token = {...this.token, nonce};\n return `&nonce=${nonce}`;\n }\n return '';\n }\n\n private checkResponse(token?: OAuthToken,\n parameters?: Record<string, string>) {\n this.emitState(parameters);\n this.cleanLocationHash();\n if (!parameters || parameters['error']) {\n return false;\n }\n if (token && token.nonce && parameters['access_token']) {\n const jwtToken = jwt(parameters['access_token']);\n return token.nonce === jwtToken.nonce;\n }\n return parameters['access_token'] || parameters['code'];\n }\n\n private getCleanedUnSearchParameters() {\n const {search} = this.location;\n let searchString = search && search.substring(1) || '';\n const hashKeys = ['code', 'state', 'error', 'error_description', 'session_state', 'scope', 'authuser', 'prompt'];\n hashKeys.forEach(hashKey => {\n const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');\n searchString = searchString.replace(re, '');\n });\n return searchString.length && `?${searchString}` || '';\n }\n\n private cleanLocationHash() {\n const {hash} = this.location;\n let curHash = hash && hash.substring(1) || '';\n const hashKeys = [\n 'access_token',\n 'token_type',\n 'expires_in',\n 'scope',\n 'state',\n 'error',\n 'error_description',\n 'session_state',\n 'nonce',\n 'id_token',\n 'code'\n ];\n hashKeys.forEach(hashKey => {\n const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');\n curHash = curHash.replace(re, '');\n });\n this.location.hash = curHash;\n }\n\n private emitState(parameters?: Record<string, string>) {\n const {state} = parameters || {};\n state && this.state$.next(state);\n }\n}\n","import {Injectable} from '@angular/core';\nimport {HttpErrorResponse, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {switchMap, take, throwError} from 'rxjs';\nimport {catchError, map} from 'rxjs/operators';\nimport {OAuthConfig} from '../models';\nimport {TokenService} from './token.service';\n\n@Injectable()\nexport class OAuthInterceptor implements HttpInterceptor {\n\n constructor(protected tokenService: TokenService,\n protected authConfig: OAuthConfig) {\n }\n\n intercept(req: HttpRequest<any>, next: HttpHandler) {\n return this.isPathExcepted(req) && next.handle(req) || this.tokenService.token$.pipe(\n take(1),\n map(token => {\n if (token?.access_token) {\n req = req.clone({\n setHeaders: {\n Authorization: `${token.token_type} ${token.access_token}`\n }\n });\n }\n return req;\n }),\n switchMap(req => next.handle(req)),\n catchError((err: HttpErrorResponse) => {\n if (err.status === 401) {\n this.tokenService.token = {\n error: `${err.status}`,\n error_description: err.message\n };\n }\n return throwError(() => err);\n })\n );\n }\n\n private isPathExcepted(req: HttpRequest<any>) {\n const {ignorePaths} = this.authConfig || {};\n if (ignorePaths) {\n for (const ignorePath of ignorePaths) {\n try {\n if (req.url.match(ignorePath)) {\n return true;\n }\n } catch (err) {\n }\n }\n }\n return false;\n }\n}\n","import {Component, ContentChild, HostListener, Inject, Input, OnDestroy, Output, TemplateRef, ViewEncapsulation} from '@angular/core';\r\nimport {Observable, Subscription, take} from 'rxjs';\r\nimport {LOCATION, OAuthParameters, OAuthStatus, OAuthType} from '../../models';\r\nimport {tap} from 'rxjs/operators';\r\nimport {OAuthService} from '../../services/oauth.service';\r\nimport {Location as Location2} from '@angular/common';\r\n\r\nexport interface OAuthLoginI18n {\r\n username?: string;\r\n password?: string;\r\n submit?: string;\r\n notAuthorized?: string;\r\n authorized?: string;\r\n denied?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'oauth-login',\r\n templateUrl: 'oauth-login.component.html',\r\n styleUrls: ['oauth-login.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class OAuthLoginComponent implements OnDestroy {\r\n\r\n #subscription = new Subscription();\r\n #redirectUri?: string;\r\n #responseType?: string;\r\n #i18n: OAuthLoginI18n = {\r\n username: 'Username',\r\n password: 'Password',\r\n submit: 'Sign in',\r\n notAuthorized: 'Sign in',\r\n authorized: 'Welcome',\r\n denied: 'Access Denied. Try again!'\r\n };\r\n\r\n get i18n() {\r\n return this.#i18n;\r\n }\r\n\r\n @Input()\r\n type: OAuthType = OAuthType.RESOURCE;\r\n\r\n @Input()\r\n set i18n(i18n) {\r\n this.#i18n = {\r\n ...this.#i18n,\r\n ...i18n\r\n };\r\n }\r\n\r\n get redirectUri() {\r\n return this.#redirectUri || `${this.location.origin}${this.locationService.path(true) || '/'}`;\r\n }\r\n\r\n @Input()\r\n set redirectUri(redirectUri: string) {\r\n if (redirectUri) {\r\n this.#redirectUri = redirectUri;\r\n }\r\n }\r\n\r\n @Input()\r\n set responseType(responseType: string) {\r\n if (this.responseType) {\r\n this.#responseType = responseType;\r\n }\r\n }\r\n\r\n get responseType() {\r\n return this.#responseType || this.type;\r\n }\r\n\r\n @Input()\r\n useLogoutUrl = false;\r\n @Input()\r\n state = '';\r\n @Output()\r\n stateChange = this.oauthService.state$.asObservable();\r\n @Input()\r\n profileName$: Observable<string | undefined> | undefined;\r\n @ContentChild('login', {static: false})\r\n loginTemplate: TemplateRef<any> | undefined;\r\n username = '';\r\n password = '';\r\n profileName?: string;\r\n OAuthStatus = OAuthStatus;\r\n OAuthType = OAuthType;\r\n collapse = false;\r\n status$ = this.oauthService.status$.pipe(\r\n tap(s => {\r\n if (s === OAuthStatus.AUTHORIZED && this.profileName$) {\r\n this.#subscription.add(this.profileName$.pipe(\r\n take(1)\r\n ).subscribe(n => this.profileName = n));\r\n } else {\r\n const {token} = this.oauthService;\r\n const userInfo = token && token.id_token && JSON.parse(atob(token.id_token.split('.')[1])) || {};\r\n this.profileName = userInfo.name || userInfo.username || userInfo.email || userInfo.sub || '';\r\n }\r\n })\r\n );\r\n loginFunction = (p: OAuthParameters) => this.login(p);\r\n logoutFunction = () => this.logout();\r\n\r\n constructor(private oauthService: OAuthService,\r\n private locationService: Location2,\r\n @Inject(LOCATION) private location: Location) {\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n logout() {\r\n this.oauthService.logout(this.useLogoutUrl);\r\n }\r\n\r\n login(parameters: OAuthParameters) {\r\n this.collapse = false;\r\n return this.oauthService.login(parameters);\r\n }\r\n\r\n toggleCollapse() {\r\n this.collapse = !this.collapse;\r\n }\r\n\r\n @HostListener('window:keydown.escape')\r\n keyboardEvent() {\r\n this.collapse = false;\r\n }\r\n}\r\n","<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\"\r\n #form=\"ngForm\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED || status === OAuthStatus.DENIED\"\r\n (submit)=\"login({username: username, password: password})\">\r\n <div class=\"mb-3\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n name=\"username\"\r\n required\r\n [(ngModel)]=\"username\"\r\n [placeholder]=\"i18n.username\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <input type=\"password\"\r\n class=\"form-control\"\r\n name=\"password\"\r\n required\r\n [(ngModel)]=\"password\"\r\n [placeholder]=\"i18n.password\">\r\n </div>\r\n <div class=\"text-end\">\r\n <button type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid\">{{i18n.submit}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noResource>\r\n <a role=\"button\"\r\n class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({responseType: responseType, redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span class=\"not-authorized\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\"\r\n [innerHTML]=\"i18n.notAuthorized\"></span>\r\n <span class=\"authorized\"\r\n *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n <span class=\"welcome\" [innerHTML]=\"i18n.authorized + ' '\"></span>\r\n <strong class=\"profile-name\"\r\n [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span class=\"denied\"\r\n *ngIf=\"status === OAuthStatus.DENIED\"\r\n [innerHTML]=\"i18n.denied\"></span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n","import {ModuleWithProviders, NgModule, Optional, PLATFORM_ID} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {HTTP_INTERCEPTORS, HttpBackend, HttpClient, HttpClientModule} from '@angular/common/http';\nimport {RouterModule} from '@angular/router';\nimport {LOCATION, OAUTH_HTTP_CLIENT, OAuthConfig, provideOAuthConfigFactory, SERVER_HOST, SERVER_PATH, STORAGE} from './models';\nimport {OAuthService} from './services/oauth.service';\nimport {OAuthLoginComponent} from './components/login/oauth-login.component';\nimport {CommonModule, isPlatformBrowser} from '@angular/common';\nimport {OAuthInterceptor} from './services/oauth.interceptor';\nimport {TokenService} from './services/token.service';\n\nconst mockLocation = (serverHost: string, serverPath: string): Location => {\n const url = new URL(serverHost && serverPath ? `${serverHost}${serverPath}` : 'http://localhost');\n const {href, origin, protocol, host, hostname, port, pathname, search, hash} = url;\n return {\n href, origin, protocol, host, hostname, port, pathname, search, hash,\n reload() {\n },\n assign(_: string) {\n },\n ancestorOrigins: {} as any,\n replace(_: string) {\n }\n };\n};\n\nconst LocationService = {\n provide: LOCATION,\n useFactory(platformId: Object, serverHost: string, serverPath: string) {\n return isPlatformBrowser(platformId) ? location : mockLocation(serverHost, serverPath);\n },\n deps: [\n PLATFORM_ID,\n [new Optional(), SERVER_HOST],\n [new Optional(), SERVER_PATH]\n ]\n};\n\nconst mockStorage: Storage = {\n clear() {\n },\n getItem(key: string) {\n return null;\n },\n key(index: number) {\n return null;\n },\n removeItem(key: string) {\n },\n setItem(key: string, value: string) {\n },\n length: 0\n};\n\nconst StorageService = {\n provide: STORAGE,\n useFactory(platformId: Object) {\n return isPlatformBrowser(platformId) ? localStorage : mockStorage;\n },\n deps: [PLATFORM_ID]\n};\n\nconst OAuthHttpClient = {\n provide: OAUTH_HTTP_CLIENT,\n useFactory(httpBackend: HttpBackend) {\n // avoid http interceptors\n return new HttpClient(httpBackend);\n },\n deps: [HttpBackend]\n};\n\nconst OAuthInterceptorService = {\n provide: HTTP_INTERCEPTORS,\n useClass: OAuthInterceptor,\n multi: true,\n};\n\nconst defaultConfig = (storage: Storage) => {\n return {\n storage,\n storageKey: 'token',\n ignorePaths: []\n };\n};\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n HttpClientModule,\n RouterModule,\n ],\n declarations: [OAuthLoginComponent],\n exports: [OAuthLoginComponent]\n})\nexport class OAuthModule {\n\n static forRoot(config: OAuthConfig = {}): ModuleWithProviders<OAuthModule> {\n return {\n ngModule: OAuthModule,\n providers: [\n LocationService,\n StorageService,\n OAuthHttpClient,\n provideOAuthConfigFactory((storage: Storage) => ({\n ...defaultConfig(storage),\n ...config\n }), [STORAGE]),\n TokenService,\n OAuthInterceptorService,\n OAuthService,\n ]\n };\n }\n}\n","/*\n * Public API Surface of ngx-oauth\n */\nexport * from './lib/models';\nexport * from './lib/services/oauth.service';\nexport * from './lib/services/oauth.interceptor';\nexport * from './lib/components/login/oauth-login.component';\nexport * from './lib/oauth.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["switchMap","i4","i1.TokenService","i2.OAuthConfig","i3"],"mappings":"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"}
|