ngx-oauth 2.2.0 → 3.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.
@@ -120,7 +120,7 @@ class OAuthService {
120
120
  const { clientId, clientSecret, tokenPath, scope } = config;
121
121
  const codeVerifier = savedToken && savedToken.codeVerifier;
122
122
  this.http.post(tokenPath, new HttpParams({
123
- fromObject: Object.assign(Object.assign(Object.assign(Object.assign({ code: parameters === null || parameters === void 0 ? void 0 : parameters.code, client_id: clientId }, clientSecret && { client_secret: clientSecret } || {}), { redirect_uri: `${origin}${pathname}`, grant_type: 'authorization_code' }), scope && { scope } || {}), codeVerifier && { code_verifier: codeVerifier } || {})
123
+ fromObject: Object.assign(Object.assign(Object.assign(Object.assign({ code: parameters === null || parameters === void 0 ? void 0 : parameters['code'], client_id: clientId }, clientSecret && { client_secret: clientSecret } || {}), { redirect_uri: `${origin}${pathname}`, grant_type: 'authorization_code' }), scope && { scope } || {}), codeVerifier && { code_verifier: codeVerifier } || {})
124
124
  }), { headers: REQUEST_HEADER }).pipe(catchError((err) => {
125
125
  this.token = err;
126
126
  this.status = OAuthStatus.DENIED;
@@ -245,8 +245,8 @@ class OAuthService {
245
245
  const { clientId, clientSecret, tokenPath, scope } = this.authConfig.config;
246
246
  this.http.post(tokenPath, new HttpParams({
247
247
  fromObject: Object.assign({ client_id: clientId, client_secret: clientSecret, grant_type: OAuthType.CLIENT_CREDENTIAL }, scope ? { scope } : {})
248
- }), { headers: REQUEST_HEADER }).pipe(catchError(() => {
249
- this.token = null;
248
+ }), { headers: REQUEST_HEADER }).pipe(catchError((err) => {
249
+ this.token = err;
250
250
  this.status = OAuthStatus.DENIED;
251
251
  return EMPTY;
252
252
  })).subscribe(params => {
@@ -300,14 +300,14 @@ class OAuthService {
300
300
  checkResponse(token, parameters) {
301
301
  this.emitState(parameters);
302
302
  this.cleanLocationHash();
303
- if (!parameters || parameters.error) {
303
+ if (!parameters || parameters['error']) {
304
304
  return false;
305
305
  }
306
- if (token && token.nonce && parameters.access_token) {
307
- const jwtToken = jwt(parameters.access_token);
306
+ if (token && token.nonce && parameters['access_token']) {
307
+ const jwtToken = jwt(parameters['access_token']);
308
308
  return token.nonce === jwtToken.nonce;
309
309
  }
310
- return parameters.access_token || parameters.code;
310
+ return parameters['access_token'] || parameters['code'];
311
311
  }
312
312
  set token(token) {
313
313
  this._token = token;
@@ -377,9 +377,9 @@ class OAuthService {
377
377
  }
378
378
  }
379
379
  }
380
- OAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthService, deps: [{ token: i1.HttpClient }, { token: i0.NgZone }, { token: OAUTH_CONFIG }, { token: LOCATION }, { token: i2.Location }], target: i0.ɵɵFactoryTarget.Injectable });
381
- OAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthService });
382
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthService, decorators: [{
380
+ OAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: OAuthService, deps: [{ token: i1.HttpClient }, { token: i0.NgZone }, { token: OAUTH_CONFIG }, { token: LOCATION }, { token: i2.Location }], target: i0.ɵɵFactoryTarget.Injectable });
381
+ OAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: OAuthService });
382
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: OAuthService, decorators: [{
383
383
  type: Injectable
384
384
  }], ctorParameters: function () {
385
385
  return [{ type: i1.HttpClient }, { type: i0.NgZone }, { type: undefined, decorators: [{
@@ -408,12 +408,11 @@ class OAuthInterceptor {
408
408
  }
409
409
  }
410
410
  return next.handle(req).pipe(catchError((err) => {
411
- if (err.status === 401) {
411
+ if (err.status === 401 && !this.isPathExcepted(req)) {
412
412
  this.oauthService.token = null;
413
413
  this.oauthService.status = OAuthStatus.DENIED;
414
- return EMPTY;
415
414
  }
416
- return throwError(() => new Error(err));
415
+ return throwError(err);
417
416
  }));
418
417
  }
419
418
  else {
@@ -436,9 +435,9 @@ class OAuthInterceptor {
436
435
  return false;
437
436
  }
438
437
  }
439
- OAuthInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthInterceptor, deps: [{ token: OAuthService }], target: i0.ɵɵFactoryTarget.Injectable });
440
- OAuthInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthInterceptor });
441
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthInterceptor, decorators: [{
438
+ OAuthInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: OAuthInterceptor, deps: [{ token: OAuthService }], target: i0.ɵɵFactoryTarget.Injectable });
439
+ OAuthInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: OAuthInterceptor });
440
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: OAuthInterceptor, decorators: [{
442
441
  type: Injectable
443
442
  }], ctorParameters: function () { return [{ type: OAuthService }]; } });
444
443
 
@@ -512,9 +511,9 @@ class OAuthLoginComponent {
512
511
  this.collapse = false;
513
512
  }
514
513
  }
515
- OAuthLoginComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthLoginComponent, deps: [{ token: OAuthService }, { token: i2.Location }, { token: LOCATION }], target: i0.ɵɵFactoryTarget.Component });
516
- OAuthLoginComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: OAuthLoginComponent, selector: "oauth-login", inputs: { i18n: "i18n", redirectUri: "redirectUri", 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=\"state$ | async\"></ng-container>\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 p-3 {{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\" #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\" class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({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 *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\" class=\"not-authorized\">{{i18n.notAuthorized}}</span>\r\n <span *ngIf=\"status === OAuthStatus.AUTHORIZED\" class=\"authorized\">\r\n <span class=\"welcome\">{{i18n.authorized}}&nbsp;</span>\r\n <strong class=\"profile-name\" [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span *ngIf=\"status === OAuthStatus.DENIED\" class=\"denied\">{{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"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "async": i2.AsyncPipe }, encapsulation: i0.ViewEncapsulation.None });
517
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthLoginComponent, decorators: [{
514
+ OAuthLoginComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: OAuthLoginComponent, deps: [{ token: OAuthService }, { token: i2.Location }, { token: LOCATION }], target: i0.ɵɵFactoryTarget.Component });
515
+ OAuthLoginComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.0", type: OAuthLoginComponent, selector: "oauth-login", inputs: { i18n: "i18n", redirectUri: "redirectUri", 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=\"state$ | async\"></ng-container>\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 p-3 {{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\" #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\" class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({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 *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\" class=\"not-authorized\">{{i18n.notAuthorized}}</span>\r\n <span *ngIf=\"status === OAuthStatus.AUTHORIZED\" class=\"authorized\">\r\n <span class=\"welcome\">{{i18n.authorized}}&nbsp;</span>\r\n <strong class=\"profile-name\" [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span *ngIf=\"status === OAuthStatus.DENIED\" class=\"denied\">{{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.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.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 });
516
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: OAuthLoginComponent, decorators: [{
518
517
  type: Component,
519
518
  args: [{ selector: 'oauth-login', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"state$ | async\"></ng-container>\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 p-3 {{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\" #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\" class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({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 *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\" class=\"not-authorized\">{{i18n.notAuthorized}}</span>\r\n <span *ngIf=\"status === OAuthStatus.AUTHORIZED\" class=\"authorized\">\r\n <span class=\"welcome\">{{i18n.authorized}}&nbsp;</span>\r\n <strong class=\"profile-name\" [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span *ngIf=\"status === OAuthStatus.DENIED\" class=\"denied\">{{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"] }]
520
519
  }], ctorParameters: function () {
@@ -623,23 +622,21 @@ class OAuthModule {
623
622
  };
624
623
  }
625
624
  }
626
- OAuthModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
627
- OAuthModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthModule, declarations: [OAuthLoginComponent], imports: [CommonModule,
625
+ OAuthModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: OAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
626
+ OAuthModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.0", ngImport: i0, type: OAuthModule, declarations: [OAuthLoginComponent], imports: [CommonModule,
628
627
  FormsModule,
629
628
  HttpClientModule,
630
629
  RouterModule], exports: [OAuthLoginComponent] });
631
- OAuthModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthModule, providers: [
630
+ OAuthModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: OAuthModule, providers: [
632
631
  LocationService,
633
632
  StorageService,
634
633
  OAuthService,
635
634
  OAuthInterceptorService,
636
- ], imports: [[
637
- CommonModule,
638
- FormsModule,
639
- HttpClientModule,
640
- RouterModule,
641
- ]] });
642
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthModule, decorators: [{
635
+ ], imports: [CommonModule,
636
+ FormsModule,
637
+ HttpClientModule,
638
+ RouterModule] });
639
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: OAuthModule, decorators: [{
643
640
  type: NgModule,
644
641
  args: [{
645
642
  imports: [
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-oauth.mjs","sources":["../../../projects/ngx-oauth/src/lib/models/index.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 {InjectionToken} from '@angular/core';\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');\n\nexport enum OAuthType {\n RESOURCE = 'password',\n AUTHORIZATION_CODE = 'code',\n IMPLICIT = 'token',\n CLIENT_CREDENTIAL = 'client_credentials'\n}\n\nexport interface OAuthConfig {\n type: OAuthType;\n config: OAuthTypeConfig;\n storageKey?: string;\n storage?: Storage;\n ignorePaths?: RegExp[];\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 ImplicitParameters {\n redirectUri: string;\n state?: string;\n}\n\n// tslint:disable-next-line:no-empty-interface\nexport interface AuthorizationCodeParameters extends ImplicitParameters {\n}\n\nexport type OAuthParameters = ResourceParameters | AuthorizationCodeParameters | ImplicitParameters;\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;\n scope?: string;\n codeVerifier?: string;\n nonce?: string;\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 {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http';\nimport {catchError, concatMap, delay, filter, map, shareReplay, switchMap, tap} from 'rxjs/operators';\nimport {EMPTY, from, noop, Observable, of, ReplaySubject} from 'rxjs';\nimport {\n AuthorizationCodeParameters,\n ImplicitParameters,\n LOCATION,\n OAUTH_CONFIG,\n OAuthConfig,\n OAuthParameters,\n OAuthStatus,\n OAuthToken,\n OAuthType,\n OAuthTypeConfig, OpenIdConfig, OpenIdConfiguration,\n ResourceParameters, UserInfo\n} from '../models';\nimport {Location as Location2} from '@angular/common';\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 REQUEST_HEADER = new HttpHeaders({'Content-Type': 'application/x-www-form-urlencoded'});\n\nconst parseOauthUri = (hash: string): Record<string, string> | null => {\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 if (Object.keys(params).length) {\n return params;\n }\n return null;\n};\n\nconst jwt = (token: string) => JSON.parse(atob(token.split('.')[1]));\n\n@Injectable()\nexport class OAuthService {\n\n private _token: OAuthToken | null = null;\n private _status = OAuthStatus.NOT_AUTHORIZED;\n private timer: any;\n state$: ReplaySubject<string> = new ReplaySubject(1);\n status$: ReplaySubject<OAuthStatus> = new ReplaySubject(1);\n userInfo$: Observable<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(p => !!p),\n switchMap(path => this.http.get<UserInfo>(path)),\n shareReplay()\n );\n\n constructor(private http: HttpClient,\n private zone: NgZone,\n @Inject(OAUTH_CONFIG) private authConfig: OAuthConfig,\n @Inject(LOCATION) private location: Location,\n private locationService: Location2) {\n setTimeout(() => this.init()); // decouple for http interceptor\n }\n\n /**\n * Get the oauth config for initialize. If OpenId with issuerPath is configured then configure from server openid configuration.\n * @protected\n */\n protected get config$() {\n let {config} = this.authConfig;\n if (config && config.clientId) {\n const {issuerPath, scope} = config as OpenIdConfig;\n if (issuerPath) {\n return this.http.get<OpenIdConfiguration>(`${issuerPath}/.well-known/openid-configuration`).pipe(\n tap(v => this.set(this.type, {\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 && {} || {scope: 'openid'}\n } as any)),\n map(() => this.authConfig.config)\n );\n }\n return of(config);\n }\n console.warn('clientId is missing in oauth config');\n return EMPTY;\n }\n\n /**\n * Init. Will check the url implicit or authorization flow or existing saved token.\n * @protected\n */\n protected init(): void {\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);\n const {storageKey} = this.authConfig;\n const savedToken = storageKey && this.authConfig.storage && this.authConfig.storage[storageKey] &&\n JSON.parse(this.authConfig.storage[storageKey]);\n this.config$.subscribe(config => {\n if (isImplicitRedirect) {\n const parameters = parseOauthUri(hash.substr(1));\n this.token = parameters;\n this.status = this.checkResponse(savedToken, parameters) && OAuthStatus.AUTHORIZED || OAuthStatus.DENIED;\n } else if (isAuthCodeRedirect) {\n const parameters = parseOauthUri(search.substr(1));\n if (!this.checkResponse(savedToken, parameters)) {\n this.token = parameters;\n this.status = OAuthStatus.DENIED;\n } else {\n const newParametersString = this.getCleanedUnSearchParameters();\n const {clientId, clientSecret, tokenPath, scope} = config as any;\n const codeVerifier = savedToken && savedToken.codeVerifier;\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: REQUEST_HEADER}).pipe(\n catchError((err) => {\n this.token = err;\n this.status = OAuthStatus.DENIED;\n this.locationService.replaceState(`${pathname}${newParametersString}`);\n return EMPTY;\n })\n ).subscribe(token => {\n this.token = token;\n this.status = OAuthStatus.AUTHORIZED;\n this.locationService.replaceState(`${pathname}${newParametersString}`);\n });\n }\n } else if (savedToken) {\n this._token = savedToken;\n const {access_token, refresh_token, error} = savedToken;\n if (access_token) {\n if (refresh_token) { // force refresh since might be a manual page refresh\n this.refreshToken();\n } else {\n this.status = OAuthStatus.AUTHORIZED;\n }\n } else {\n this.status = error && OAuthStatus.DENIED || OAuthStatus.NOT_AUTHORIZED;\n }\n } else {\n this.status = OAuthStatus.NOT_AUTHORIZED;\n }\n });\n }\n\n async login(parameters?: OAuthParameters) {\n if (this.isResourceType(parameters as ResourceParameters)) {\n this.resourceLogin(parameters as ResourceParameters);\n } else if (this.isAuthorizationCodeType(parameters as AuthorizationCodeParameters)) {\n await this.authorizationCodeLogin(parameters as AuthorizationCodeParameters);\n } else if (this.isImplicitType(parameters as ImplicitParameters)) {\n await this.implicitLogin(parameters as ImplicitParameters);\n } else if (this.isClientCredentialType()) {\n this.clientCredentialLogin();\n }\n }\n\n logout(useLogoutUrl?: boolean) {\n this.revoke();\n this.token = null;\n this.status = OAuthStatus.NOT_AUTHORIZED;\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 revoke() {\n const {revokePath, clientId, clientSecret} = this.authConfig.config as any;\n if (revokePath) {\n const {access_token, refresh_token} = this.token as OAuthToken;\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 get status(): OAuthStatus {\n return this._status;\n }\n\n set status(status) {\n this._status = status;\n this.status$.next(status);\n }\n\n set(type: OAuthType, config?: OAuthTypeConfig): void {\n this.authConfig.type = type;\n if (config) {\n this.authConfig.config = {\n ...this.authConfig.config,\n ...config\n };\n }\n }\n\n get type(): OAuthType {\n return this.authConfig.type;\n }\n\n get ignorePaths(): RegExp[] {\n return this.authConfig.ignorePaths || [];\n }\n\n private resourceLogin(parameters: ResourceParameters) {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n const {username, password} = parameters;\n 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: REQUEST_HEADER}).pipe(\n catchError(err => {\n this.token = err;\n this.status = OAuthStatus.DENIED;\n return EMPTY;\n })\n ).subscribe(params => {\n this.token = params;\n this.status = OAuthStatus.AUTHORIZED;\n });\n }\n\n private async authorizationCodeLogin(parameters: AuthorizationCodeParameters) {\n const authUrl = await this.toAuthorizationUrl(parameters, OAuthType.AUTHORIZATION_CODE);\n this.location.replace(authUrl);\n }\n\n private async implicitLogin(parameters: ImplicitParameters) {\n const authUrl = await this.toAuthorizationUrl(parameters, OAuthType.IMPLICIT);\n this.location.replace(authUrl);\n }\n\n private clientCredentialLogin() {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n 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: REQUEST_HEADER}).pipe(\n catchError(() => {\n this.token = null;\n this.status = OAuthStatus.DENIED;\n return EMPTY;\n })\n ).subscribe(params => {\n this.token = params;\n this.status = OAuthStatus.AUTHORIZED;\n });\n }\n\n private isClientCredentialType(): boolean {\n return this.authConfig.type === OAuthType.CLIENT_CREDENTIAL;\n }\n\n private isResourceType(parameters?: ResourceParameters): boolean {\n return this.authConfig.type === OAuthType.RESOURCE && !!parameters?.password;\n }\n\n private isImplicitType(parameters?: ImplicitParameters): boolean {\n return this.authConfig.type === OAuthType.IMPLICIT && !!parameters?.redirectUri;\n }\n\n private isAuthorizationCodeType(parameters?: AuthorizationCodeParameters): boolean {\n return this.authConfig.type === OAuthType.AUTHORIZATION_CODE && !!parameters?.redirectUri;\n }\n\n private async toAuthorizationUrl(parameters: AuthorizationCodeParameters | ImplicitParameters, responseType: OAuthType): Promise<string> {\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=${responseType}`;\n authorizationUrl += `&scope=${encodeURIComponent(config.scope || '')}`;\n authorizationUrl += `&state=${encodeURIComponent(parameters.state || '')}`;\n return `${authorizationUrl}${this.generateNonce(config)}${await this.generateCodeChallenge(config)}`;\n }\n\n private 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 private 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: any, parameters: Record<string, string> | null) {\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 set token(token: OAuthToken | null) {\n this._token = token;\n const {storageKey} = this.authConfig;\n if (token) {\n // @ts-ignore\n this.authConfig.storage[storageKey] = JSON.stringify(this.token);\n clearTimeout(this.timer);\n if (this.token && this.token.expires_in) {\n this.zone.runOutsideAngular(() => {\n this.timer = setTimeout(() => {\n this.zone.run(() => {\n this.refreshToken();\n });\n }, Number(this.token?.expires_in) * 1000);\n });\n }\n } else {\n // @ts-ignore\n delete this.authConfig.storage[storageKey];\n }\n }\n\n get token() {\n return this._token;\n }\n\n private refreshToken() {\n const {tokenPath, clientId, clientSecret, scope} = this.authConfig.config as any;\n const {refresh_token} = this.token as OAuthToken;\n if (tokenPath && refresh_token) {\n this.http.post(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 }), {headers: REQUEST_HEADER}).pipe(\n catchError(() => {\n this.logout();\n return EMPTY;\n })\n ).subscribe(params => {\n this.token = {\n ...this.token,\n ...params\n };\n this.status = OAuthStatus.AUTHORIZED;\n });\n }\n }\n\n private getCleanedUnSearchParameters(): string {\n const {search} = this.location;\n let searchString = search.substr(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.substr(1);\n const hashKeys = ['access_token', 'token_type', 'expires_in', 'scope', 'state', 'error', 'error_description', 'session_state', 'nonce'];\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> | null) {\n const {state} = parameters as any;\n if (state) {\n this.state$.next(state);\n }\n }\n}\n","import {Injectable} from '@angular/core';\nimport {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {EMPTY, Observable, throwError} from 'rxjs';\nimport {catchError} from 'rxjs/operators';\nimport {OAuthService} from './oauth.service';\nimport {OAuthStatus} from '../models';\n\n@Injectable()\nexport class OAuthInterceptor implements HttpInterceptor {\n\n constructor(private oauthService: OAuthService) {\n }\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n if (this.oauthService) {\n if (!this.isPathExcepted(req)) {\n const {token} = this.oauthService;\n if (token && token.access_token) {\n req = req.clone({\n setHeaders: {\n Authorization: `${token.token_type} ${token.access_token}`\n }\n });\n }\n }\n return next.handle(req).pipe(\n catchError((err) => {\n if (err.status === 401) {\n this.oauthService.token = null;\n this.oauthService.status = OAuthStatus.DENIED;\n return EMPTY;\n }\n return throwError(() => new Error(err));\n })\n );\n } else {\n return next.handle(req);\n }\n }\n\n private isPathExcepted(req: HttpRequest<any>) {\n const {ignorePaths} = this.oauthService;\n if (ignorePaths) {\n for (const ignorePath of this.oauthService.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 {\r\n Component,\r\n ContentChild,\r\n EventEmitter,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n TemplateRef,\r\n ViewEncapsulation\r\n} 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 private _redirectUri: string | undefined;\r\n private subscription = new Subscription();\r\n private _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 set i18n(i18n) {\r\n this._i18n = {\r\n ...this._i18n,\r\n ...i18n\r\n };\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 get redirectUri() {\r\n return this._redirectUri || `${this.location.origin}${this.locationService.path(true) || '/'}`;\r\n }\r\n\r\n @Input()\r\n useLogoutUrl = false;\r\n @Input()\r\n state = '';\r\n @Output()\r\n stateChange: EventEmitter<string> = new EventEmitter();\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 | undefined;\r\n OAuthStatus = OAuthStatus;\r\n OAuthType = OAuthType;\r\n collapse = false;\r\n type = this.oauthService.type;\r\n state$ = this.oauthService.state$.pipe(\r\n tap(s => this.stateChange.emit(s))\r\n );\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(take(1)).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 async login(parameters: OAuthParameters) {\r\n await this.oauthService.login(parameters);\r\n this.collapse = false;\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=\"state$ | async\"></ng-container>\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 p-3 {{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\" #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\" class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({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 *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\" class=\"not-authorized\">{{i18n.notAuthorized}}</span>\r\n <span *ngIf=\"status === OAuthStatus.AUTHORIZED\" class=\"authorized\">\r\n <span class=\"welcome\">{{i18n.authorized}}&nbsp;</span>\r\n <strong class=\"profile-name\" [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span *ngIf=\"status === OAuthStatus.DENIED\" class=\"denied\">{{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 {OAuthConfig, OAUTH_CONFIG, LOCATION, 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';\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(u: string) {\n },\n ancestorOrigins: {} as any,\n replace(u: 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 providers: [\n LocationService,\n StorageService,\n OAuthService,\n OAuthInterceptorService,\n ]\n})\nexport class OAuthModule {\n\n static forRoot(config: OAuthConfig): ModuleWithProviders<OAuthModule> {\n return {\n ngModule: OAuthModule,\n providers: [\n LocationService,\n StorageService,\n OAuthService,\n OAuthInterceptorService,\n {\n provide: OAUTH_CONFIG,\n useFactory(storage: Storage) {\n return {\n ...defaultConfig(storage),\n ...config,\n };\n },\n deps: [\n STORAGE\n ]\n }\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":[],"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/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 {InjectionToken} from '@angular/core';\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');\n\nexport enum OAuthType {\n RESOURCE = 'password',\n AUTHORIZATION_CODE = 'code',\n IMPLICIT = 'token',\n CLIENT_CREDENTIAL = 'client_credentials'\n}\n\nexport interface OAuthConfig {\n type: OAuthType;\n config: OAuthTypeConfig;\n storageKey?: string;\n storage?: Storage;\n ignorePaths?: RegExp[];\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 ImplicitParameters {\n redirectUri: string;\n state?: string;\n}\n\n// tslint:disable-next-line:no-empty-interface\nexport interface AuthorizationCodeParameters extends ImplicitParameters {\n}\n\nexport type OAuthParameters = ResourceParameters | AuthorizationCodeParameters | ImplicitParameters;\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;\n scope?: string;\n codeVerifier?: string;\n nonce?: string;\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 {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http';\nimport {catchError, concatMap, delay, filter, map, shareReplay, switchMap, tap} from 'rxjs/operators';\nimport {EMPTY, from, noop, Observable, of, ReplaySubject} from 'rxjs';\nimport {\n AuthorizationCodeParameters,\n ImplicitParameters,\n LOCATION,\n OAUTH_CONFIG,\n OAuthConfig,\n OAuthParameters,\n OAuthStatus,\n OAuthToken,\n OAuthType,\n OAuthTypeConfig, OpenIdConfig, OpenIdConfiguration,\n ResourceParameters, UserInfo\n} from '../models';\nimport {Location as Location2} from '@angular/common';\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 REQUEST_HEADER = new HttpHeaders({'Content-Type': 'application/x-www-form-urlencoded'});\n\nconst parseOauthUri = (hash: string): Record<string, string> | null => {\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 if (Object.keys(params).length) {\n return params;\n }\n return null;\n};\n\nconst jwt = (token: string) => JSON.parse(atob(token.split('.')[1]));\n\n@Injectable()\nexport class OAuthService {\n\n private _token: OAuthToken | null = null;\n private _status = OAuthStatus.NOT_AUTHORIZED;\n private timer: any;\n state$: ReplaySubject<string> = new ReplaySubject(1);\n status$: ReplaySubject<OAuthStatus> = new ReplaySubject(1);\n userInfo$: Observable<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(p => !!p),\n switchMap(path => this.http.get<UserInfo>(path)),\n shareReplay()\n );\n\n constructor(private http: HttpClient,\n private zone: NgZone,\n @Inject(OAUTH_CONFIG) private authConfig: OAuthConfig,\n @Inject(LOCATION) private location: Location,\n private locationService: Location2) {\n setTimeout(() => this.init()); // decouple for http interceptor\n }\n\n /**\n * Get the oauth config for initialize. If OpenId with issuerPath is configured then configure from server openid configuration.\n * @protected\n */\n protected get config$() {\n let {config} = this.authConfig;\n if (config && config.clientId) {\n const {issuerPath, scope} = config as OpenIdConfig;\n if (issuerPath) {\n return this.http.get<OpenIdConfiguration>(`${issuerPath}/.well-known/openid-configuration`).pipe(\n tap(v => this.set(this.type, {\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 && {} || {scope: 'openid'}\n } as any)),\n map(() => this.authConfig.config)\n );\n }\n return of(config);\n }\n console.warn('clientId is missing in oauth config');\n return EMPTY;\n }\n\n /**\n * Init. Will check the url implicit or authorization flow or existing saved token.\n * @protected\n */\n protected init(): void {\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);\n const {storageKey} = this.authConfig;\n const savedToken = storageKey && this.authConfig.storage && this.authConfig.storage[storageKey] &&\n JSON.parse(this.authConfig.storage[storageKey]);\n this.config$.subscribe(config => {\n if (isImplicitRedirect) {\n const parameters = parseOauthUri(hash.substr(1));\n this.token = parameters;\n this.status = this.checkResponse(savedToken, parameters) && OAuthStatus.AUTHORIZED || OAuthStatus.DENIED;\n } else if (isAuthCodeRedirect) {\n const parameters = parseOauthUri(search.substr(1));\n if (!this.checkResponse(savedToken, parameters)) {\n this.token = parameters;\n this.status = OAuthStatus.DENIED;\n } else {\n const newParametersString = this.getCleanedUnSearchParameters();\n const {clientId, clientSecret, tokenPath, scope} = config as any;\n const codeVerifier = savedToken && savedToken.codeVerifier;\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: REQUEST_HEADER}).pipe(\n catchError((err) => {\n this.token = err;\n this.status = OAuthStatus.DENIED;\n this.locationService.replaceState(`${pathname}${newParametersString}`);\n return EMPTY;\n })\n ).subscribe(token => {\n this.token = token;\n this.status = OAuthStatus.AUTHORIZED;\n this.locationService.replaceState(`${pathname}${newParametersString}`);\n });\n }\n } else if (savedToken) {\n this._token = savedToken;\n const {access_token, refresh_token, error} = savedToken;\n if (access_token) {\n if (refresh_token) { // force refresh since might be a manual page refresh\n this.refreshToken();\n } else {\n this.status = OAuthStatus.AUTHORIZED;\n }\n } else {\n this.status = error && OAuthStatus.DENIED || OAuthStatus.NOT_AUTHORIZED;\n }\n } else {\n this.status = OAuthStatus.NOT_AUTHORIZED;\n }\n });\n }\n\n async login(parameters?: OAuthParameters) {\n if (this.isResourceType(parameters as ResourceParameters)) {\n this.resourceLogin(parameters as ResourceParameters);\n } else if (this.isAuthorizationCodeType(parameters as AuthorizationCodeParameters)) {\n await this.authorizationCodeLogin(parameters as AuthorizationCodeParameters);\n } else if (this.isImplicitType(parameters as ImplicitParameters)) {\n await this.implicitLogin(parameters as ImplicitParameters);\n } else if (this.isClientCredentialType()) {\n this.clientCredentialLogin();\n }\n }\n\n logout(useLogoutUrl?: boolean) {\n this.revoke();\n this.token = null;\n this.status = OAuthStatus.NOT_AUTHORIZED;\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 revoke() {\n const {revokePath, clientId, clientSecret} = this.authConfig.config as any;\n if (revokePath) {\n const {access_token, refresh_token} = this.token as OAuthToken;\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 get status(): OAuthStatus {\n return this._status;\n }\n\n set status(status) {\n this._status = status;\n this.status$.next(status);\n }\n\n set(type: OAuthType, config?: OAuthTypeConfig): void {\n this.authConfig.type = type;\n if (config) {\n this.authConfig.config = {\n ...this.authConfig.config,\n ...config\n };\n }\n }\n\n get type(): OAuthType {\n return this.authConfig.type;\n }\n\n get ignorePaths(): RegExp[] {\n return this.authConfig.ignorePaths || [];\n }\n\n private resourceLogin(parameters: ResourceParameters) {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n const {username, password} = parameters;\n 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: REQUEST_HEADER}).pipe(\n catchError(err => {\n this.token = err;\n this.status = OAuthStatus.DENIED;\n return EMPTY;\n })\n ).subscribe(params => {\n this.token = params;\n this.status = OAuthStatus.AUTHORIZED;\n });\n }\n\n private async authorizationCodeLogin(parameters: AuthorizationCodeParameters) {\n const authUrl = await this.toAuthorizationUrl(parameters, OAuthType.AUTHORIZATION_CODE);\n this.location.replace(authUrl);\n }\n\n private async implicitLogin(parameters: ImplicitParameters) {\n const authUrl = await this.toAuthorizationUrl(parameters, OAuthType.IMPLICIT);\n this.location.replace(authUrl);\n }\n\n private clientCredentialLogin() {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n 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: REQUEST_HEADER}).pipe(\n catchError((err) => {\n this.token = err;\n this.status = OAuthStatus.DENIED;\n return EMPTY;\n })\n ).subscribe(params => {\n this.token = params;\n this.status = OAuthStatus.AUTHORIZED;\n });\n }\n\n private isClientCredentialType(): boolean {\n return this.authConfig.type === OAuthType.CLIENT_CREDENTIAL;\n }\n\n private isResourceType(parameters?: ResourceParameters): boolean {\n return this.authConfig.type === OAuthType.RESOURCE && !!parameters?.password;\n }\n\n private isImplicitType(parameters?: ImplicitParameters): boolean {\n return this.authConfig.type === OAuthType.IMPLICIT && !!parameters?.redirectUri;\n }\n\n private isAuthorizationCodeType(parameters?: AuthorizationCodeParameters): boolean {\n return this.authConfig.type === OAuthType.AUTHORIZATION_CODE && !!parameters?.redirectUri;\n }\n\n private async toAuthorizationUrl(parameters: AuthorizationCodeParameters | ImplicitParameters, responseType: OAuthType): Promise<string> {\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=${responseType}`;\n authorizationUrl += `&scope=${encodeURIComponent(config.scope || '')}`;\n authorizationUrl += `&state=${encodeURIComponent(parameters.state || '')}`;\n return `${authorizationUrl}${this.generateNonce(config)}${await this.generateCodeChallenge(config)}`;\n }\n\n private 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 private 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: any, parameters: Record<string, string> | null) {\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 set token(token: OAuthToken | null) {\n this._token = token;\n const {storageKey} = this.authConfig;\n if (token) {\n // @ts-ignore\n this.authConfig.storage[storageKey] = JSON.stringify(this.token);\n clearTimeout(this.timer);\n if (this.token && this.token.expires_in) {\n this.zone.runOutsideAngular(() => {\n this.timer = setTimeout(() => {\n this.zone.run(() => {\n this.refreshToken();\n });\n }, Number(this.token?.expires_in) * 1000);\n });\n }\n } else {\n // @ts-ignore\n delete this.authConfig.storage[storageKey];\n }\n }\n\n get token() {\n return this._token;\n }\n\n private refreshToken() {\n const {tokenPath, clientId, clientSecret, scope} = this.authConfig.config as any;\n const {refresh_token} = this.token as OAuthToken;\n if (tokenPath && refresh_token) {\n this.http.post(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 }), {headers: REQUEST_HEADER}).pipe(\n catchError(() => {\n this.logout();\n return EMPTY;\n })\n ).subscribe(params => {\n this.token = {\n ...this.token,\n ...params\n };\n this.status = OAuthStatus.AUTHORIZED;\n });\n }\n }\n\n private getCleanedUnSearchParameters(): string {\n const {search} = this.location;\n let searchString = search.substr(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.substr(1);\n const hashKeys = ['access_token', 'token_type', 'expires_in', 'scope', 'state', 'error', 'error_description', 'session_state', 'nonce'];\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> | null) {\n const {state} = parameters as any;\n if (state) {\n this.state$.next(state);\n }\n }\n}\n","import {Injectable} from '@angular/core';\nimport {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {Observable, throwError} from 'rxjs';\nimport {catchError} from 'rxjs/operators';\nimport {OAuthService} from './oauth.service';\nimport {OAuthStatus} from '../models';\n\n@Injectable()\nexport class OAuthInterceptor implements HttpInterceptor {\n\n constructor(private oauthService: OAuthService) {\n }\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n if (this.oauthService) {\n if (!this.isPathExcepted(req)) {\n const {token} = this.oauthService;\n if (token && token.access_token) {\n req = req.clone({\n setHeaders: {\n Authorization: `${token.token_type} ${token.access_token}`\n }\n });\n }\n }\n return next.handle(req).pipe(\n catchError((err) => {\n if (err.status === 401 && !this.isPathExcepted(req)) {\n this.oauthService.token = null;\n this.oauthService.status = OAuthStatus.DENIED;\n }\n return throwError(err);\n })\n );\n } else {\n return next.handle(req);\n }\n }\n\n private isPathExcepted(req: HttpRequest<any>) {\n const {ignorePaths} = this.oauthService;\n if (ignorePaths) {\n for (const ignorePath of this.oauthService.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 {\r\n Component,\r\n ContentChild,\r\n EventEmitter,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n TemplateRef,\r\n ViewEncapsulation\r\n} 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 private _redirectUri: string | undefined;\r\n private subscription = new Subscription();\r\n private _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 set i18n(i18n) {\r\n this._i18n = {\r\n ...this._i18n,\r\n ...i18n\r\n };\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 get redirectUri() {\r\n return this._redirectUri || `${this.location.origin}${this.locationService.path(true) || '/'}`;\r\n }\r\n\r\n @Input()\r\n useLogoutUrl = false;\r\n @Input()\r\n state = '';\r\n @Output()\r\n stateChange: EventEmitter<string> = new EventEmitter();\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 | undefined;\r\n OAuthStatus = OAuthStatus;\r\n OAuthType = OAuthType;\r\n collapse = false;\r\n type = this.oauthService.type;\r\n state$ = this.oauthService.state$.pipe(\r\n tap(s => this.stateChange.emit(s))\r\n );\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(take(1)).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 async login(parameters: OAuthParameters) {\r\n await this.oauthService.login(parameters);\r\n this.collapse = false;\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=\"state$ | async\"></ng-container>\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 p-3 {{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\" #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\" class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({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 *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\" class=\"not-authorized\">{{i18n.notAuthorized}}</span>\r\n <span *ngIf=\"status === OAuthStatus.AUTHORIZED\" class=\"authorized\">\r\n <span class=\"welcome\">{{i18n.authorized}}&nbsp;</span>\r\n <strong class=\"profile-name\" [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span *ngIf=\"status === OAuthStatus.DENIED\" class=\"denied\">{{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 {OAuthConfig, OAUTH_CONFIG, LOCATION, 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';\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(u: string) {\n },\n ancestorOrigins: {} as any,\n replace(u: 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 providers: [\n LocationService,\n StorageService,\n OAuthService,\n OAuthInterceptorService,\n ]\n})\nexport class OAuthModule {\n\n static forRoot(config: OAuthConfig): ModuleWithProviders<OAuthModule> {\n return {\n ngModule: OAuthModule,\n providers: [\n LocationService,\n StorageService,\n OAuthService,\n OAuthInterceptorService,\n {\n provide: OAUTH_CONFIG,\n useFactory(storage: Storage) {\n return {\n ...defaultConfig(storage),\n ...config,\n };\n },\n deps: [\n STORAGE\n ]\n }\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.OAuthService"],"mappings":"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"}