ngx-oauth 2.1.2 → 2.2.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.
@@ -85,7 +85,7 @@ class OAuthService {
85
85
  if (config && config.clientId) {
86
86
  const { issuerPath, scope } = config;
87
87
  if (issuerPath) {
88
- return this.http.get(`${issuerPath}/.well-known/openid-configuration`).pipe(tap(v => this.set(this.type, Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, v.authorization_endpoint && { authorizePath: v.authorization_endpoint } || {}), v.token_endpoint && { tokenPath: v.token_endpoint } || {}), v.revocation_endpoint && { revokePath: v.revocation_endpoint } || {}), v.code_challenge_methods_supported && { pkce: v.code_challenge_methods_supported.indexOf('S256') > -1 } || {}), v.userinfo_endpoint && { userPath: v.userinfo_endpoint } || {}), v.introspection_endpoint && { introspectionPath: v.introspection_endpoint } || {}), scope && {} || { scope: 'openid' }))), map(() => this.authConfig.config));
88
+ return this.http.get(`${issuerPath}/.well-known/openid-configuration`).pipe(tap(v => this.set(this.type, Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, v.authorization_endpoint && { authorizePath: v.authorization_endpoint } || {}), v.token_endpoint && { tokenPath: v.token_endpoint } || {}), v.revocation_endpoint && { revokePath: v.revocation_endpoint } || {}), v.code_challenge_methods_supported && { pkce: v.code_challenge_methods_supported.indexOf('S256') > -1 } || {}), v.userinfo_endpoint && { userPath: v.userinfo_endpoint } || {}), v.introspection_endpoint && { introspectionPath: v.introspection_endpoint } || {}), v.end_session_endpoint && { logoutPath: v.end_session_endpoint } || {}), scope && {} || { scope: 'openid' }))), map(() => this.authConfig.config));
89
89
  }
90
90
  return of(config);
91
91
  }
@@ -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}${newParametersString}`, 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;
@@ -169,10 +169,16 @@ class OAuthService {
169
169
  }
170
170
  });
171
171
  }
172
- logout() {
172
+ logout(useLogoutUrl) {
173
173
  this.revoke();
174
174
  this.token = null;
175
175
  this.status = OAuthStatus.NOT_AUTHORIZED;
176
+ const { logoutPath, logoutRedirectUri } = this.authConfig.config;
177
+ if (useLogoutUrl && logoutPath) {
178
+ const { origin, pathname } = this.location;
179
+ const currentPath = `${origin}${pathname}`;
180
+ this.location.replace(`${logoutPath}?post_logout_redirect_uri=${logoutRedirectUri || currentPath}`);
181
+ }
176
182
  }
177
183
  revoke() {
178
184
  const { revokePath, clientId, clientSecret } = this.authConfig.config;
@@ -347,7 +353,7 @@ class OAuthService {
347
353
  getCleanedUnSearchParameters() {
348
354
  const { search } = this.location;
349
355
  let searchString = search.substr(1);
350
- const hashKeys = ['code', 'state', 'error', 'error_description', 'session_state'];
356
+ const hashKeys = ['code', 'state', 'error', 'error_description', 'session_state', 'scope', 'authuser', 'prompt'];
351
357
  hashKeys.forEach((hashKey) => {
352
358
  const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');
353
359
  searchString = searchString.replace(re, '');
@@ -371,9 +377,9 @@ class OAuthService {
371
377
  }
372
378
  }
373
379
  }
374
- OAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OAuthService, deps: [{ token: i1.HttpClient }, { token: i0.NgZone }, { token: OAUTH_CONFIG }, { token: LOCATION }, { token: i2.Location }], target: i0.ɵɵFactoryTarget.Injectable });
375
- OAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OAuthService });
376
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OAuthService, decorators: [{
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: [{
377
383
  type: Injectable
378
384
  }], ctorParameters: function () {
379
385
  return [{ type: i1.HttpClient }, { type: i0.NgZone }, { type: undefined, decorators: [{
@@ -430,9 +436,9 @@ class OAuthInterceptor {
430
436
  return false;
431
437
  }
432
438
  }
433
- OAuthInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OAuthInterceptor, deps: [{ token: OAuthService }], target: i0.ɵɵFactoryTarget.Injectable });
434
- OAuthInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OAuthInterceptor });
435
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OAuthInterceptor, decorators: [{
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: [{
436
442
  type: Injectable
437
443
  }], ctorParameters: function () { return [{ type: OAuthService }]; } });
438
444
 
@@ -450,6 +456,7 @@ class OAuthLoginComponent {
450
456
  authorized: 'Welcome',
451
457
  denied: 'Access Denied. Try again!'
452
458
  };
459
+ this.useLogoutUrl = false;
453
460
  this.state = '';
454
461
  this.stateChange = new EventEmitter();
455
462
  this.username = '';
@@ -490,7 +497,7 @@ class OAuthLoginComponent {
490
497
  this.subscription.unsubscribe();
491
498
  }
492
499
  logout() {
493
- this.oauthService.logout();
500
+ this.oauthService.logout(this.useLogoutUrl);
494
501
  }
495
502
  login(parameters) {
496
503
  return __awaiter(this, void 0, void 0, function* () {
@@ -505,11 +512,11 @@ class OAuthLoginComponent {
505
512
  this.collapse = false;
506
513
  }
507
514
  }
508
- OAuthLoginComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OAuthLoginComponent, deps: [{ token: OAuthService }, { token: i2.Location }, { token: LOCATION }], target: i0.ɵɵFactoryTarget.Component });
509
- OAuthLoginComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: OAuthLoginComponent, selector: "oauth-login", inputs: { i18n: "i18n", redirectUri: "redirectUri", 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\">{{i18n.notAuthorized}}</span>\r\n <span *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n {{i18n.authorized}}<strong>&nbsp;{{profileName}}</strong>\r\n </span>\r\n <span *ngIf=\"status === OAuthStatus.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 });
510
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OAuthLoginComponent, decorators: [{
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: [{
511
518
  type: Component,
512
- 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\">{{i18n.notAuthorized}}</span>\r\n <span *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n {{i18n.authorized}}<strong>&nbsp;{{profileName}}</strong>\r\n </span>\r\n <span *ngIf=\"status === OAuthStatus.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"] }]
519
+ 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"] }]
513
520
  }], ctorParameters: function () {
514
521
  return [{ type: OAuthService }, { type: i2.Location }, { type: Location, decorators: [{
515
522
  type: Inject,
@@ -519,6 +526,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImpor
519
526
  type: Input
520
527
  }], redirectUri: [{
521
528
  type: Input
529
+ }], useLogoutUrl: [{
530
+ type: Input
522
531
  }], state: [{
523
532
  type: Input
524
533
  }], stateChange: [{
@@ -614,12 +623,12 @@ class OAuthModule {
614
623
  };
615
624
  }
616
625
  }
617
- OAuthModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
618
- OAuthModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OAuthModule, declarations: [OAuthLoginComponent], imports: [CommonModule,
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,
619
628
  FormsModule,
620
629
  HttpClientModule,
621
630
  RouterModule], exports: [OAuthLoginComponent] });
622
- OAuthModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OAuthModule, providers: [
631
+ OAuthModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthModule, providers: [
623
632
  LocationService,
624
633
  StorageService,
625
634
  OAuthService,
@@ -630,7 +639,7 @@ OAuthModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "1
630
639
  HttpClientModule,
631
640
  RouterModule,
632
641
  ]] });
633
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OAuthModule, decorators: [{
642
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthModule, decorators: [{
634
643
  type: NgModule,
635
644
  args: [{
636
645
  imports: [
@@ -659,3 +668,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImpor
659
668
  */
660
669
 
661
670
  export { LOCATION, OAUTH_CONFIG, OAUTH_TOKEN, OAuthInterceptor, OAuthLoginComponent, OAuthModule, OAuthService, OAuthStatus, OAuthType, SERVER_HOST, SERVER_PATH, STORAGE };
671
+ //# 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/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}\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}\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 ...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}${newParametersString}`,\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() {\n this.revoke();\n this.token = null;\n this.status = OAuthStatus.NOT_AUTHORIZED;\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'];\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 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();\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\">{{i18n.notAuthorized}}</span>\r\n <span *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n {{i18n.authorized}}<strong>&nbsp;{{profileName}}</strong>\r\n </span>\r\n <span *ngIf=\"status === OAuthStatus.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(() => {\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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"}