ngx-oauth 4.0.0 → 4.1.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.
@@ -20,9 +20,9 @@ const OAUTH_TOKEN = new InjectionToken('OAuthToken');
20
20
  const HEADER_APPLICATION = new HttpHeaders({ 'Content-Type': 'application/x-www-form-urlencoded' });
21
21
  class OAuthConfig {
22
22
  }
23
- OAuthConfig.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthConfig, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
24
- OAuthConfig.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthConfig, providedIn: 'root', useFactory: () => inject(OAUTH_CONFIG).reduce((p, c) => (Object.assign(Object.assign({}, p), c)), {}) });
25
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthConfig, decorators: [{
23
+ OAuthConfig.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthConfig, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
24
+ OAuthConfig.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthConfig, providedIn: 'root', useFactory: () => inject(OAUTH_CONFIG).reduce((p, c) => (Object.assign(Object.assign({}, p), c)), {}) });
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthConfig, decorators: [{
26
26
  type: Injectable,
27
27
  args: [{
28
28
  providedIn: 'root',
@@ -107,9 +107,9 @@ class TokenService {
107
107
  }
108
108
  }
109
109
  _TokenService_token$ = new WeakMap();
110
- TokenService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: TokenService, deps: [{ token: OAuthConfig }, { token: i2.HttpClient }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
111
- TokenService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: TokenService });
112
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: TokenService, decorators: [{
110
+ TokenService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: TokenService, deps: [{ token: OAuthConfig }, { token: i2.HttpClient }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
111
+ TokenService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: TokenService });
112
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: TokenService, decorators: [{
113
113
  type: Injectable
114
114
  }], ctorParameters: function () { return [{ type: OAuthConfig }, { type: i2.HttpClient }, { type: i0.NgZone }]; } });
115
115
 
@@ -149,21 +149,22 @@ class OAuthService {
149
149
  this.token$ = this.config$.pipe(tap(config => {
150
150
  const { hash, search, origin, pathname } = this.location;
151
151
  const isImplicitRedirect = hash && /(access_token=)|(error=)/.test(hash);
152
- const isAuthCodeRedirect = search && /(code=)|(error=)/.test(search);
152
+ const isAuthCodeRedirect = search && /(code=)|(error=)/.test(search) || hash && /(code=)|(error=)/.test(hash);
153
153
  if (isImplicitRedirect) {
154
154
  const parameters = parseOauthUri(hash.substring(1));
155
155
  this.token = Object.assign(Object.assign({}, parameters), { type: OAuthType.IMPLICIT });
156
156
  this.checkResponse(this.token, parameters);
157
157
  }
158
158
  else if (isAuthCodeRedirect) {
159
- const parameters = parseOauthUri(search.substring(1));
159
+ const parameters = parseOauthUri(search && search.substring(1) || hash && hash.substring(1));
160
+ console.log(parameters);
160
161
  if (!this.checkResponse(this.token, parameters)) {
161
162
  this.token = parameters;
162
163
  }
163
164
  else {
164
165
  const newParametersString = this.getCleanedUnSearchParameters();
165
166
  const { clientId, clientSecret, tokenPath, scope } = config;
166
- const { codeVerifier } = this.token || {}; //should be set by autorizationUrl construction
167
+ const { codeVerifier } = this.token || {}; //should be set by authorizationUrl construction
167
168
  this.http.post(tokenPath, new HttpParams({
168
169
  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 } || {})
169
170
  }), { headers: HEADER_APPLICATION }).pipe().subscribe(token => {
@@ -200,10 +201,7 @@ class OAuthService {
200
201
  if (!!parameters && parameters.password) {
201
202
  yield this.resourceLogin(parameters);
202
203
  }
203
- else if (!!parameters
204
- && parameters.redirectUri
205
- && (parameters.responseType === OAuthType.IMPLICIT
206
- || parameters.responseType === OAuthType.AUTHORIZATION_CODE)) {
204
+ else if (!!parameters && parameters.redirectUri && parameters.responseType) {
207
205
  yield this.toAuthorizationUrl(parameters);
208
206
  }
209
207
  else {
@@ -316,7 +314,19 @@ class OAuthService {
316
314
  cleanLocationHash() {
317
315
  const { hash } = this.location;
318
316
  let curHash = hash && hash.substring(1) || '';
319
- const hashKeys = ['access_token', 'token_type', 'expires_in', 'scope', 'state', 'error', 'error_description', 'session_state', 'nonce'];
317
+ const hashKeys = [
318
+ 'access_token',
319
+ 'token_type',
320
+ 'expires_in',
321
+ 'scope',
322
+ 'state',
323
+ 'error',
324
+ 'error_description',
325
+ 'session_state',
326
+ 'nonce',
327
+ 'id_token',
328
+ 'code'
329
+ ];
320
330
  hashKeys.forEach(hashKey => {
321
331
  const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');
322
332
  curHash = curHash.replace(re, '');
@@ -328,9 +338,9 @@ class OAuthService {
328
338
  state && this.state$.next(state);
329
339
  }
330
340
  }
331
- OAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthService, deps: [{ token: OAuthConfig }, { token: TokenService }, { token: i2.HttpClient }, { token: LOCATION }, { token: i2$1.Location }], target: i0.ɵɵFactoryTarget.Injectable });
332
- OAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthService });
333
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthService, decorators: [{
341
+ OAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthService, deps: [{ token: OAuthConfig }, { token: TokenService }, { token: i2.HttpClient }, { token: LOCATION }, { token: i2$1.Location }], target: i0.ɵɵFactoryTarget.Injectable });
342
+ OAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthService });
343
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthService, decorators: [{
334
344
  type: Injectable
335
345
  }], ctorParameters: function () {
336
346
  return [{ type: OAuthConfig }, { type: TokenService }, { type: i2.HttpClient }, { type: Location, decorators: [{
@@ -380,13 +390,13 @@ class OAuthInterceptor {
380
390
  return false;
381
391
  }
382
392
  }
383
- OAuthInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthInterceptor, deps: [{ token: TokenService }, { token: OAuthConfig }], target: i0.ɵɵFactoryTarget.Injectable });
384
- OAuthInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthInterceptor });
385
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthInterceptor, decorators: [{
393
+ OAuthInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthInterceptor, deps: [{ token: TokenService }, { token: OAuthConfig }], target: i0.ɵɵFactoryTarget.Injectable });
394
+ OAuthInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthInterceptor });
395
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthInterceptor, decorators: [{
386
396
  type: Injectable
387
397
  }], ctorParameters: function () { return [{ type: TokenService }, { type: OAuthConfig }]; } });
388
398
 
389
- var _OAuthLoginComponent_subscription, _OAuthLoginComponent_redirectUri, _OAuthLoginComponent_i18n;
399
+ var _OAuthLoginComponent_subscription, _OAuthLoginComponent_redirectUri, _OAuthLoginComponent_responseType, _OAuthLoginComponent_i18n;
390
400
  class OAuthLoginComponent {
391
401
  constructor(oauthService, locationService, location) {
392
402
  this.oauthService = oauthService;
@@ -394,6 +404,7 @@ class OAuthLoginComponent {
394
404
  this.location = location;
395
405
  _OAuthLoginComponent_subscription.set(this, new Subscription());
396
406
  _OAuthLoginComponent_redirectUri.set(this, void 0);
407
+ _OAuthLoginComponent_responseType.set(this, void 0);
397
408
  _OAuthLoginComponent_i18n.set(this, {
398
409
  username: 'Username',
399
410
  password: 'Password',
@@ -402,6 +413,7 @@ class OAuthLoginComponent {
402
413
  authorized: 'Welcome',
403
414
  denied: 'Access Denied. Try again!'
404
415
  });
416
+ this.type = OAuthType.RESOURCE;
405
417
  this.useLogoutUrl = false;
406
418
  this.state = '';
407
419
  this.stateChange = this.oauthService.state$.asObservable();
@@ -410,7 +422,6 @@ class OAuthLoginComponent {
410
422
  this.OAuthStatus = OAuthStatus;
411
423
  this.OAuthType = OAuthType;
412
424
  this.collapse = false;
413
- this.type = OAuthType.RESOURCE;
414
425
  this.status$ = this.oauthService.status$.pipe(tap(s => {
415
426
  if (s === OAuthStatus.AUTHORIZED && this.profileName$) {
416
427
  __classPrivateFieldGet(this, _OAuthLoginComponent_subscription, "f").add(this.profileName$.pipe(take(1)).subscribe(n => this.profileName = n));
@@ -438,6 +449,14 @@ class OAuthLoginComponent {
438
449
  __classPrivateFieldSet(this, _OAuthLoginComponent_redirectUri, redirectUri, "f");
439
450
  }
440
451
  }
452
+ set responseType(responseType) {
453
+ if (this.responseType) {
454
+ __classPrivateFieldSet(this, _OAuthLoginComponent_responseType, responseType, "f");
455
+ }
456
+ }
457
+ get responseType() {
458
+ return __classPrivateFieldGet(this, _OAuthLoginComponent_responseType, "f") || this.type;
459
+ }
441
460
  ngOnDestroy() {
442
461
  __classPrivateFieldGet(this, _OAuthLoginComponent_subscription, "f").unsubscribe();
443
462
  }
@@ -454,25 +473,26 @@ class OAuthLoginComponent {
454
473
  keyboardEvent() {
455
474
  this.collapse = false;
456
475
  }
457
- get responseType() {
458
- return this.type; //avoid complains
459
- }
460
476
  }
461
- _OAuthLoginComponent_subscription = new WeakMap(), _OAuthLoginComponent_redirectUri = new WeakMap(), _OAuthLoginComponent_i18n = new WeakMap();
462
- OAuthLoginComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthLoginComponent, deps: [{ token: OAuthService }, { token: i2$1.Location }, { token: LOCATION }], target: i0.ɵɵFactoryTarget.Component });
463
- OAuthLoginComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.5", type: OAuthLoginComponent, selector: "oauth-login", inputs: { i18n: "i18n", redirectUri: "redirectUri", useLogoutUrl: "useLogoutUrl", state: "state", profileName$: "profileName$", type: "type" }, outputs: { stateChange: "stateChange" }, host: { listeners: { "window:keydown.escape": "keyboardEvent()" } }, queries: [{ propertyName: "loginTemplate", first: true, predicate: ["login"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\" #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({responseType: responseType, redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span class=\"not-authorized\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\"\r\n [innerHTML]=\"i18n.notAuthorized\"></span>\r\n <span class=\"authorized\"\r\n *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n <span class=\"welcome\" [innerHTML]=\"i18n.authorized + '&nbsp;'\"></span>\r\n <strong class=\"profile-name\"\r\n [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span class=\"denied\"\r\n *ngIf=\"status === OAuthStatus.DENIED\"\r\n [innerHTML]=\"i18n.denied\"></span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n", styles: [".oauth .dropdown-menu{left:auto;right:0;box-shadow:0 5px 10px #0003;min-width:250px}.oauth .dropdown-menu:before{content:\"\";display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:#0003;position:absolute;top:-7px;left:auto;right:15px}.oauth .dropdown-menu:after{content:\"\";display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:auto;right:16px}\n"], dependencies: [{ kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.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$1.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
464
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthLoginComponent, decorators: [{
477
+ _OAuthLoginComponent_subscription = new WeakMap(), _OAuthLoginComponent_redirectUri = new WeakMap(), _OAuthLoginComponent_responseType = new WeakMap(), _OAuthLoginComponent_i18n = new WeakMap();
478
+ OAuthLoginComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthLoginComponent, deps: [{ token: OAuthService }, { token: i2$1.Location }, { token: LOCATION }], target: i0.ɵɵFactoryTarget.Component });
479
+ OAuthLoginComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: OAuthLoginComponent, selector: "oauth-login", inputs: { type: "type", i18n: "i18n", redirectUri: "redirectUri", responseType: "responseType", useLogoutUrl: "useLogoutUrl", state: "state", profileName$: "profileName$" }, outputs: { stateChange: "stateChange" }, host: { listeners: { "window:keydown.escape": "keyboardEvent()" } }, queries: [{ propertyName: "loginTemplate", first: true, predicate: ["login"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\"\r\n #form=\"ngForm\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED || status === OAuthStatus.DENIED\"\r\n (submit)=\"login({username: username, password: password})\">\r\n <div class=\"mb-3\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n name=\"username\"\r\n required\r\n [(ngModel)]=\"username\"\r\n [placeholder]=\"i18n.username\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <input type=\"password\"\r\n class=\"form-control\"\r\n name=\"password\"\r\n required\r\n [(ngModel)]=\"password\"\r\n [placeholder]=\"i18n.password\">\r\n </div>\r\n <div class=\"text-end\">\r\n <button type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid\">{{i18n.submit}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noResource>\r\n <a role=\"button\"\r\n class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({responseType: responseType, redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span class=\"not-authorized\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\"\r\n [innerHTML]=\"i18n.notAuthorized\"></span>\r\n <span class=\"authorized\"\r\n *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n <span class=\"welcome\" [innerHTML]=\"i18n.authorized + '&nbsp;'\"></span>\r\n <strong class=\"profile-name\"\r\n [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span class=\"denied\"\r\n *ngIf=\"status === OAuthStatus.DENIED\"\r\n [innerHTML]=\"i18n.denied\"></span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n", styles: [".oauth .dropdown-menu{left:auto;right:0;box-shadow:0 5px 10px #0003;min-width:250px}.oauth .dropdown-menu:before{content:\"\";display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:#0003;position:absolute;top:-7px;left:auto;right:15px}.oauth .dropdown-menu:after{content:\"\";display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:auto;right:16px}\n"], dependencies: [{ kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.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$1.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
480
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthLoginComponent, decorators: [{
465
481
  type: Component,
466
- args: [{ selector: 'oauth-login', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\" #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({responseType: responseType, redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span class=\"not-authorized\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\"\r\n [innerHTML]=\"i18n.notAuthorized\"></span>\r\n <span class=\"authorized\"\r\n *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n <span class=\"welcome\" [innerHTML]=\"i18n.authorized + '&nbsp;'\"></span>\r\n <strong class=\"profile-name\"\r\n [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span class=\"denied\"\r\n *ngIf=\"status === OAuthStatus.DENIED\"\r\n [innerHTML]=\"i18n.denied\"></span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n", styles: [".oauth .dropdown-menu{left:auto;right:0;box-shadow:0 5px 10px #0003;min-width:250px}.oauth .dropdown-menu:before{content:\"\";display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:#0003;position:absolute;top:-7px;left:auto;right:15px}.oauth .dropdown-menu:after{content:\"\";display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:auto;right:16px}\n"] }]
482
+ args: [{ selector: 'oauth-login', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\"\r\n #form=\"ngForm\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED || status === OAuthStatus.DENIED\"\r\n (submit)=\"login({username: username, password: password})\">\r\n <div class=\"mb-3\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n name=\"username\"\r\n required\r\n [(ngModel)]=\"username\"\r\n [placeholder]=\"i18n.username\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <input type=\"password\"\r\n class=\"form-control\"\r\n name=\"password\"\r\n required\r\n [(ngModel)]=\"password\"\r\n [placeholder]=\"i18n.password\">\r\n </div>\r\n <div class=\"text-end\">\r\n <button type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid\">{{i18n.submit}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noResource>\r\n <a role=\"button\"\r\n class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({responseType: responseType, redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span class=\"not-authorized\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\"\r\n [innerHTML]=\"i18n.notAuthorized\"></span>\r\n <span class=\"authorized\"\r\n *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n <span class=\"welcome\" [innerHTML]=\"i18n.authorized + '&nbsp;'\"></span>\r\n <strong class=\"profile-name\"\r\n [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span class=\"denied\"\r\n *ngIf=\"status === OAuthStatus.DENIED\"\r\n [innerHTML]=\"i18n.denied\"></span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n", styles: [".oauth .dropdown-menu{left:auto;right:0;box-shadow:0 5px 10px #0003;min-width:250px}.oauth .dropdown-menu:before{content:\"\";display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:#0003;position:absolute;top:-7px;left:auto;right:15px}.oauth .dropdown-menu:after{content:\"\";display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:auto;right:16px}\n"] }]
467
483
  }], ctorParameters: function () {
468
484
  return [{ type: OAuthService }, { type: i2$1.Location }, { type: Location, decorators: [{
469
485
  type: Inject,
470
486
  args: [LOCATION]
471
487
  }] }];
472
- }, propDecorators: { i18n: [{
488
+ }, propDecorators: { type: [{
489
+ type: Input
490
+ }], i18n: [{
473
491
  type: Input
474
492
  }], redirectUri: [{
475
493
  type: Input
494
+ }], responseType: [{
495
+ type: Input
476
496
  }], useLogoutUrl: [{
477
497
  type: Input
478
498
  }], state: [{
@@ -484,8 +504,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImpor
484
504
  }], loginTemplate: [{
485
505
  type: ContentChild,
486
506
  args: ['login', { static: false }]
487
- }], type: [{
488
- type: Input
489
507
  }], keyboardEvent: [{
490
508
  type: HostListener,
491
509
  args: ['window:keydown.escape']
@@ -565,16 +583,16 @@ class OAuthModule {
565
583
  };
566
584
  }
567
585
  }
568
- OAuthModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
569
- OAuthModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.5", ngImport: i0, type: OAuthModule, declarations: [OAuthLoginComponent], imports: [CommonModule,
586
+ OAuthModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
587
+ OAuthModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.1.3", ngImport: i0, type: OAuthModule, declarations: [OAuthLoginComponent], imports: [CommonModule,
570
588
  FormsModule,
571
589
  HttpClientModule,
572
590
  RouterModule], exports: [OAuthLoginComponent] });
573
- OAuthModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthModule, imports: [CommonModule,
591
+ OAuthModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthModule, imports: [CommonModule,
574
592
  FormsModule,
575
593
  HttpClientModule,
576
594
  RouterModule] });
577
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthModule, decorators: [{
595
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthModule, decorators: [{
578
596
  type: NgModule,
579
597
  args: [{
580
598
  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/token.service.ts","../../../projects/ngx-oauth/src/lib/services/oauth.service.ts","../../../projects/ngx-oauth/src/lib/services/oauth.interceptor.ts","../../../projects/ngx-oauth/src/lib/components/login/oauth-login.component.ts","../../../projects/ngx-oauth/src/lib/components/login/oauth-login.component.html","../../../projects/ngx-oauth/src/lib/oauth.module.ts","../../../projects/ngx-oauth/src/index.ts","../../../projects/ngx-oauth/src/ngx-oauth.ts"],"sourcesContent":["import {FactoryProvider, inject, Injectable, InjectionToken, ValueProvider} from '@angular/core';\nimport {HttpHeaders} from '@angular/common/http';\n\nexport const SERVER_HOST = new InjectionToken<string>('SERVER_HOST');\nexport const SERVER_PATH = new InjectionToken<string>('SERVER_PATH');\nexport const LOCATION = new InjectionToken<Location>('Location');\nexport const STORAGE = new InjectionToken<Storage>('Storage');\nexport const OAUTH_CONFIG = new InjectionToken<OAuthConfig[]>('OAuthConfig');\nexport const OAUTH_TOKEN = new InjectionToken<OAuthToken>('OAuthToken');\nexport const HEADER_APPLICATION = new HttpHeaders({'Content-Type': 'application/x-www-form-urlencoded'});\n\n@Injectable({\n providedIn: 'root',\n useFactory: () => inject(OAUTH_CONFIG).reduce((p, c) => ({...p, ...c}), {})\n})\nexport abstract class OAuthConfig {\n config?: OAuthTypeConfig;\n storageKey?: string;\n storage?: Storage;\n ignorePaths?: RegExp[];\n}\n\nexport const provideOAuthConfig = (config: OAuthConfig = {}): ValueProvider => ({\n provide: OAUTH_CONFIG,\n useValue: config,\n multi: true\n});\n\nexport const provideOAuthConfigFactory = (factory: Function, deps?: any[]): FactoryProvider => ({\n provide: OAUTH_CONFIG,\n useFactory: factory,\n deps: deps,\n multi: true\n});\n\nexport enum OAuthType {\n RESOURCE = 'password',\n AUTHORIZATION_CODE = 'code',\n IMPLICIT = 'token',\n CLIENT_CREDENTIAL = 'client_credentials'\n}\n\nexport interface ClientCredentialConfig {\n tokenPath: string;\n revokePath?: string;\n clientId: string;\n clientSecret?: string;\n scope?: string;\n}\n\n// tslint:disable-next-line:no-empty-interface\nexport interface ResourceConfig extends ClientCredentialConfig {\n}\n\nexport interface ImplicitConfig {\n authorizePath: string;\n revokePath?: string;\n clientId: string;\n scope?: string;\n logoutPath?: string;\n logoutRedirectUri?: string;\n}\n\nexport interface AuthorizationCodeConfig extends ResourceConfig {\n authorizePath: string;\n}\n\nexport interface AuthorizationCodePKCEConfig extends AuthorizationCodeConfig {\n pkce: boolean;\n}\n\nexport interface OpenIdConfig {\n issuerPath: string;\n clientId: string;\n clientSecret?: string;\n scope?: string;\n}\n\nexport interface ResourceParameters {\n username: string;\n password: string;\n}\n\nexport interface AuthorizationParameters {\n redirectUri: string;\n responseType: OAuthType.IMPLICIT | OAuthType.AUTHORIZATION_CODE;\n state?: string;\n}\n\nexport type OAuthParameters = ResourceParameters | AuthorizationParameters;\nexport type OAuthTypeConfig = OpenIdConfig\n | AuthorizationCodePKCEConfig\n | AuthorizationCodeConfig\n | ImplicitConfig\n | ResourceConfig\n | ClientCredentialConfig;\n\nexport interface OAuthToken {\n id_token?: string;\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n state?: string;\n error?: string;\n error_description?: string;\n expires_in?: number | string;\n refresh_expires_in?: number | string;\n scope?: string;\n codeVerifier?: string;\n nonce?: string;\n type?: OAuthType;\n expires?: number;\n}\n\nexport enum OAuthStatus {\n NOT_AUTHORIZED = 'NOT_AUTHORIZED',\n AUTHORIZED = 'AUTHORIZED',\n DENIED = 'DENIED'\n}\n\nexport interface OpenIdConfiguration {\n issuer?: string;\n authorization_endpoint?: string;\n introspection_endpoint?: string;\n token_endpoint?: string;\n userinfo_endpoint?: string;\n end_session_endpoint?: string;\n revocation_endpoint?: string;\n scopes_supported?: string[];\n code_challenge_methods_supported?: string[];\n}\n\nexport interface UserInfo {\n email?: string;\n email_verified?: boolean;\n family_name?: string;\n given_name?: string;\n name?: string;\n preferred_username?: string;\n sub?: string;\n address?: object;\n picture?: string;\n locale?: string;\n}\n\nexport interface IntrospectInfo extends UserInfo {\n active: boolean;\n scope: string;\n client_id?: string;\n username: string;\n exp: number;\n}\n","import {Injectable, NgZone} from '@angular/core';\nimport {BehaviorSubject, distinctUntilChanged, Observable, of, switchMap} from 'rxjs';\nimport {HEADER_APPLICATION, OAuthConfig, OAuthToken} from '../models';\nimport {catchError, map, shareReplay} from 'rxjs/operators';\nimport {HttpClient, HttpParams} from '@angular/common/http';\n\nconst isExpiredToken = (token?: OAuthToken) => token && token.expires && Date.now() > token.expires || false;\n\n@Injectable()\nexport class TokenService {\n\n #token$ = new BehaviorSubject<OAuthToken>(this.saved);\n token$ = this.#token$.pipe(\n distinctUntilChanged((p, c) => JSON.stringify(p || null) === JSON.stringify(c || null)),\n switchMap(token => !isExpiredToken(token) && of(token) || this.refreshToken(token)),\n shareReplay(1)\n );\n type$ = this.token$.pipe(\n map(token => token?.type),\n shareReplay(1)\n );\n accessToken$ = this.token$.pipe(\n map(token => token?.access_token),\n shareReplay(1),\n );\n\n constructor(protected authConfig: OAuthConfig,\n protected http: HttpClient,\n protected zone: NgZone) {\n }\n\n get token() {\n return this.#token$.value;\n }\n\n set token(token) {\n const expiresIn = Number(token.expires_in) || 0;\n const result = {\n ...token,\n ...expiresIn && {expires: Date.now() + expiresIn * 1000} || {}\n };\n this.saved = result;\n this.#token$.next(result);\n }\n\n get saved() {\n const {storageKey, storage} = this.authConfig;\n return storageKey && storage && storage[storageKey] && JSON.parse(storage[storageKey]) || {};\n }\n\n set saved(token: OAuthToken) {\n const {storageKey, storage} = this.authConfig;\n if (storage && storageKey) {\n if (token) {\n storage[storageKey] = JSON.stringify(token);\n } else {\n delete storage[storageKey];\n }\n }\n }\n\n protected refreshToken(token?: OAuthToken): Observable<OAuthToken> {\n const {tokenPath, clientId, clientSecret, scope} = this.authConfig.config as any;\n const {refresh_token} = token || {};\n return tokenPath && refresh_token && this.http.post<OAuthToken>(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n grant_type: 'refresh_token',\n refresh_token,\n ...scope && {scope} || {},\n }\n }), {\n headers: HEADER_APPLICATION\n }).pipe(\n catchError(() => {\n this.token = {};\n return of(this.token);\n }),\n map(token => {\n this.token = {\n ...this.token,\n ...token\n };\n return this.token;\n })\n ) || of(token);\n }\n}\n","import {Inject, Injectable} from '@angular/core';\nimport {HttpClient, HttpParams} from '@angular/common/http';\nimport {catchError, concatMap, delay, filter, map, shareReplay, switchMap, tap} from 'rxjs/operators';\nimport {firstValueFrom, from, noop, of, ReplaySubject, throwError} from 'rxjs';\nimport {\n AuthorizationCodeConfig,\n AuthorizationParameters,\n HEADER_APPLICATION,\n LOCATION,\n OAuthConfig,\n OAuthParameters,\n OAuthStatus,\n OAuthToken,\n OAuthType,\n OAuthTypeConfig,\n OpenIdConfig,\n OpenIdConfiguration,\n ResourceParameters,\n UserInfo\n} from '../models';\nimport {Location as Location2} from '@angular/common';\nimport {TokenService} from './token.service';\n\nconst arrToString = (buf: Uint8Array) => buf.reduce((s, b) => s + String.fromCharCode(b), '');\n\nconst base64url = (str: string) => btoa(str)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\nconst randomString = (length: number = 48) => {\n const buff = arrToString(crypto.getRandomValues(new Uint8Array(length * 2)));\n return base64url(buff).substring(0, length);\n};\n\nconst pkce = async (value: string) => {\n const buff = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));\n return base64url(arrToString(new Uint8Array(buff)));\n};\n\nconst parseOauthUri = (hash: string) => {\n const regex = /([^&=]+)=([^&]*)/g;\n const params: Record<string, string> = {};\n let m;\n // tslint:disable-next-line:no-conditional-assignment\n while ((m = regex.exec(hash)) !== null) {\n params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);\n }\n return Object.keys(params).length && params || {};\n};\n\nconst jwt = (token: string) => JSON.parse(atob(token.split('.')[1]));\n\n@Injectable()\nexport class OAuthService {\n\n state$ = new ReplaySubject<string>(1);\n config$ = of(this.config).pipe(\n filter(Boolean),\n filter(config => !!config?.clientId),\n map(config => config as OpenIdConfig),\n switchMap(config => !config.issuerPath && of(config) || this.http.get<OpenIdConfiguration>(`${config.issuerPath}/.well-known/openid-configuration`).pipe(\n tap(v => this.config = {\n ...v.authorization_endpoint && {authorizePath: v.authorization_endpoint} || {},\n ...v.token_endpoint && {tokenPath: v.token_endpoint} || {},\n ...v.revocation_endpoint && {revokePath: v.revocation_endpoint} || {},\n ...v.code_challenge_methods_supported && {pkce: v.code_challenge_methods_supported.indexOf('S256') > -1} || {},\n ...v.userinfo_endpoint && {userPath: v.userinfo_endpoint} || {},\n ...v.introspection_endpoint && {introspectionPath: v.introspection_endpoint} || {},\n ...v.end_session_endpoint && {logoutPath: v.end_session_endpoint} || {},\n ...{scope: config.scope || 'openid'}\n } as any),\n map(() => this.config)\n )),\n shareReplay(1)\n );\n token$ = this.config$.pipe(\n tap(config => {\n const {hash, search, origin, pathname} = this.location;\n const isImplicitRedirect = hash && /(access_token=)|(error=)/.test(hash);\n const isAuthCodeRedirect = search && /(code=)|(error=)/.test(search);\n if (isImplicitRedirect) {\n const parameters = parseOauthUri(hash.substring(1));\n this.token = {\n ...parameters,\n type: OAuthType.IMPLICIT,\n };\n this.checkResponse(this.token, parameters);\n } else if (isAuthCodeRedirect) {\n const parameters = parseOauthUri(search.substring(1));\n if (!this.checkResponse(this.token, parameters)) {\n this.token = parameters;\n } else {\n const newParametersString = this.getCleanedUnSearchParameters();\n const {clientId, clientSecret, tokenPath, scope} = config as AuthorizationCodeConfig;\n const {codeVerifier} = this.token || {}; //should be set by autorizationUrl construction\n this.http.post(tokenPath, new HttpParams({\n fromObject: {\n code: parameters?.['code'],\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n redirect_uri: `${origin}${pathname}`,\n grant_type: 'authorization_code',\n ...scope && {scope} || {},\n ...codeVerifier && {code_verifier: codeVerifier} || {}\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n ).subscribe(token => {\n this.token = {\n ...token,\n type: OAuthType.AUTHORIZATION_CODE\n };\n this.locationService.replaceState(`${pathname}${newParametersString}`);\n });\n }\n }\n }),\n switchMap(() => this.tokenService.token$),\n shareReplay(1)\n );\n status$ = this.token$.pipe(\n map(token => token.access_token && OAuthStatus.AUTHORIZED || token.error && OAuthStatus.DENIED || OAuthStatus.NOT_AUTHORIZED),\n shareReplay(1)\n );\n userInfo$ = this.status$.pipe(\n filter(s => s === OAuthStatus.AUTHORIZED),\n map(() => {\n const {config} = this.authConfig as any;\n return config.userPath;\n }),\n filter(Boolean),\n switchMap(path => this.http.get<UserInfo>(path)),\n shareReplay(1)\n );\n type$ = this.tokenService.type$;\n ignorePaths = this.authConfig.ignorePaths || [];\n\n get token() {\n return this.tokenService.token;\n }\n\n set token(token) {\n this.tokenService.token = token;\n }\n\n get config() {\n return this.authConfig.config;\n }\n\n set config(config: OAuthTypeConfig | undefined) {\n if (config) {\n this.authConfig.config = {\n ...this.authConfig.config,\n ...config\n };\n }\n }\n\n constructor(protected authConfig: OAuthConfig,\n protected tokenService: TokenService,\n protected http: HttpClient,\n @Inject(LOCATION) protected location: Location,\n protected locationService: Location2) {\n }\n\n async login(parameters?: OAuthParameters) {\n if (!!parameters && (parameters as ResourceParameters).password) {\n await this.resourceLogin(parameters as ResourceParameters);\n } else if (!!parameters\n && (parameters as AuthorizationParameters).redirectUri\n && ((parameters as AuthorizationParameters).responseType === OAuthType.IMPLICIT\n || (parameters as AuthorizationParameters).responseType === OAuthType.AUTHORIZATION_CODE)\n ) {\n await this.toAuthorizationUrl(parameters as AuthorizationParameters);\n } else {\n await this.clientCredentialLogin();\n }\n }\n\n logout(useLogoutUrl?: boolean) {\n this.revoke();\n this.token = {};\n const {logoutPath, logoutRedirectUri} = this.authConfig.config as any;\n if (useLogoutUrl && logoutPath) {\n const {origin, pathname} = this.location;\n const currentPath = `${origin}${pathname}`;\n this.location.replace(`${logoutPath}?post_logout_redirect_uri=${logoutRedirectUri || currentPath}`);\n }\n }\n\n protected revoke() {\n const {revokePath, clientId, clientSecret} = this.authConfig.config as any;\n if (revokePath) {\n const {access_token, refresh_token} = this.token || {};\n const toRevoke = [];\n if (access_token) {\n toRevoke.push({\n ...clientId && {client_id: clientId} || {},\n ...clientSecret && {client_secret: clientSecret} || {},\n token: access_token,\n token_type_hint: 'access_token'\n });\n }\n if (refresh_token) {\n toRevoke.push({\n ...clientId && {client_id: clientId} || {},\n ...clientSecret && {client_secret: clientSecret} || {},\n token: refresh_token,\n token_type_hint: 'refresh_token'\n });\n }\n from(toRevoke).pipe(\n concatMap(o => of(o).pipe(delay(300))), // space request to avoid cancellation\n switchMap(o => this.http.post(revokePath, new HttpParams({fromObject: o}))),\n ).subscribe(noop);\n }\n }\n\n protected clientCredentialLogin() {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n return firstValueFrom(this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n client_secret: clientSecret,\n grant_type: OAuthType.CLIENT_CREDENTIAL,\n ...scope ? {scope} : {},\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n catchError((err) => {\n this.token = err;\n return throwError(() => err);\n }),\n tap(params => {\n this.token = {\n ...params,\n type: OAuthType.CLIENT_CREDENTIAL,\n };\n }),\n ));\n }\n\n protected resourceLogin(parameters: ResourceParameters) {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n const {username, password} = parameters;\n return firstValueFrom(this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n grant_type: OAuthType.RESOURCE,\n ...scope && {scope} || {},\n username,\n password\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n catchError(err => {\n this.token = err;\n return throwError(() => err);\n }),\n tap(params => {\n this.token = {\n ...params,\n type: OAuthType.RESOURCE,\n };\n })\n ));\n }\n\n protected async toAuthorizationUrl(parameters: AuthorizationParameters) {\n const {config} = this.authConfig as any;\n let authorizationUrl = `${config.authorizePath}`;\n authorizationUrl += config.authorizePath.includes('?') && '&' || '?';\n authorizationUrl += `client_id=${config.clientId}`;\n authorizationUrl += `&redirect_uri=${encodeURIComponent(parameters.redirectUri)}`;\n authorizationUrl += `&response_type=${parameters.responseType}`;\n authorizationUrl += `&scope=${encodeURIComponent(config.scope || '')}`;\n authorizationUrl += `&state=${encodeURIComponent(parameters.state || '')}`;\n return this.location.replace(`${authorizationUrl}${this.generateNonce(config)}${await this.generateCodeChallenge(config)}`);\n }\n\n protected async generateCodeChallenge(config: any) {\n if (config.pkce) {\n const codeVerifier = randomString();\n this.token = {...this.token, codeVerifier};\n return `&code_challenge=${await pkce(codeVerifier)}&code_challenge_method=S256`;\n }\n return '';\n }\n\n protected generateNonce(config: any) {\n if (config && config.scope && config.scope.indexOf('openid') > -1) {\n const nonce = randomString(10);\n this.token = {...this.token, nonce};\n return `&nonce=${nonce}`;\n }\n return '';\n }\n\n private checkResponse(token?: OAuthToken,\n parameters?: Record<string, string>) {\n this.emitState(parameters);\n this.cleanLocationHash();\n if (!parameters || parameters['error']) {\n return false;\n }\n if (token && token.nonce && parameters['access_token']) {\n const jwtToken = jwt(parameters['access_token']);\n return token.nonce === jwtToken.nonce;\n }\n return parameters['access_token'] || parameters['code'];\n }\n\n private getCleanedUnSearchParameters() {\n const {search} = this.location;\n let searchString = search && search.substring(1) || '';\n const hashKeys = ['code', 'state', 'error', 'error_description', 'session_state', 'scope', 'authuser', 'prompt'];\n hashKeys.forEach(hashKey => {\n const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');\n searchString = searchString.replace(re, '');\n });\n return searchString.length && `?${searchString}` || '';\n }\n\n private cleanLocationHash() {\n const {hash} = this.location;\n let curHash = hash && hash.substring(1) || '';\n const hashKeys = ['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>) {\n const {state} = parameters || {};\n state && this.state$.next(state);\n }\n}\n","import {Injectable} from '@angular/core';\nimport {HttpErrorResponse, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {switchMap, take, throwError} from 'rxjs';\nimport {catchError, map} from 'rxjs/operators';\nimport {OAuthConfig} from '../models';\nimport {TokenService} from './token.service';\n\n@Injectable()\nexport class OAuthInterceptor implements HttpInterceptor {\n\n constructor(protected tokenService: TokenService,\n protected authConfig: OAuthConfig) {\n }\n\n intercept(req: HttpRequest<any>, next: HttpHandler) {\n return this.tokenService.token$.pipe(\n take(1),\n map(token => {\n if (token?.access_token && !this.isPathExcepted(req)) {\n req = req.clone({\n setHeaders: {\n Authorization: `${token.token_type} ${token.access_token}`\n }\n });\n }\n return req;\n }),\n switchMap(req => next.handle(req)),\n catchError((err: HttpErrorResponse) => {\n if (err.status === 401 && !this.isPathExcepted(req)) {\n this.tokenService.token = {\n error: `${err.status}`,\n error_description: err.message\n };\n }\n return throwError(() => err);\n })\n );\n }\n\n private isPathExcepted(req: HttpRequest<any>) {\n const {ignorePaths} = this.authConfig || {};\n if (ignorePaths) {\n for (const ignorePath of ignorePaths) {\n try {\n if (req.url.match(ignorePath)) {\n return true;\n }\n } catch (err) {\n }\n }\n }\n return false;\n }\n}\n","import {Component, ContentChild, HostListener, Inject, Input, OnDestroy, Output, TemplateRef, ViewEncapsulation} from '@angular/core';\r\nimport {Observable, Subscription, take} from 'rxjs';\r\nimport {LOCATION, OAuthParameters, OAuthStatus, OAuthType} from '../../models';\r\nimport {tap} from 'rxjs/operators';\r\nimport {OAuthService} from '../../services/oauth.service';\r\nimport {Location as Location2} from '@angular/common';\r\n\r\nexport interface OAuthLoginI18n {\r\n username?: string;\r\n password?: string;\r\n submit?: string;\r\n notAuthorized?: string;\r\n authorized?: string;\r\n denied?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'oauth-login',\r\n templateUrl: 'oauth-login.component.html',\r\n styleUrls: ['oauth-login.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class OAuthLoginComponent implements OnDestroy {\r\n\r\n #subscription = new Subscription();\r\n #redirectUri?: string;\r\n #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 get redirectUri() {\r\n return this.#redirectUri || `${this.location.origin}${this.locationService.path(true) || '/'}`;\r\n }\r\n\r\n @Input()\r\n set redirectUri(redirectUri: string) {\r\n if (redirectUri) {\r\n this.#redirectUri = redirectUri;\r\n }\r\n }\r\n\r\n @Input()\r\n useLogoutUrl = false;\r\n @Input()\r\n state = '';\r\n @Output()\r\n stateChange = this.oauthService.state$.asObservable();\r\n @Input()\r\n profileName$: Observable<string | undefined> | undefined;\r\n @ContentChild('login', {static: false})\r\n loginTemplate: TemplateRef<any> | undefined;\r\n username = '';\r\n password = '';\r\n profileName?: string;\r\n OAuthStatus = OAuthStatus;\r\n OAuthType = OAuthType;\r\n collapse = false;\r\n @Input()\r\n type = OAuthType.RESOURCE;\r\n status$ = this.oauthService.status$.pipe(\r\n tap(s => {\r\n if (s === OAuthStatus.AUTHORIZED && this.profileName$) {\r\n this.#subscription.add(this.profileName$.pipe(\r\n take(1)\r\n ).subscribe(n => this.profileName = n));\r\n } else {\r\n const {token} = this.oauthService;\r\n const userInfo = token && token.id_token && JSON.parse(atob(token.id_token.split('.')[1])) || {};\r\n this.profileName = userInfo.name || userInfo.username || userInfo.email || userInfo.sub || '';\r\n }\r\n })\r\n );\r\n loginFunction = (p: OAuthParameters) => this.login(p);\r\n logoutFunction = () => this.logout();\r\n\r\n constructor(private oauthService: OAuthService,\r\n private locationService: Location2,\r\n @Inject(LOCATION) private location: Location) {\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n logout() {\r\n this.oauthService.logout(this.useLogoutUrl);\r\n }\r\n\r\n login(parameters: OAuthParameters) {\r\n this.collapse = false;\r\n return this.oauthService.login(parameters);\r\n }\r\n\r\n toggleCollapse() {\r\n this.collapse = !this.collapse;\r\n }\r\n\r\n @HostListener('window:keydown.escape')\r\n keyboardEvent() {\r\n this.collapse = false;\r\n }\r\n\r\n get responseType() {\r\n return this.type as OAuthType.AUTHORIZATION_CODE; //avoid complains\r\n }\r\n}\r\n","<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\" #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({responseType: responseType, redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span class=\"not-authorized\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\"\r\n [innerHTML]=\"i18n.notAuthorized\"></span>\r\n <span class=\"authorized\"\r\n *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n <span class=\"welcome\" [innerHTML]=\"i18n.authorized + '&nbsp;'\"></span>\r\n <strong class=\"profile-name\"\r\n [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span class=\"denied\"\r\n *ngIf=\"status === OAuthStatus.DENIED\"\r\n [innerHTML]=\"i18n.denied\"></span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n","import {ModuleWithProviders, NgModule, Optional, PLATFORM_ID} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http';\nimport {RouterModule} from '@angular/router';\nimport {LOCATION, OAuthConfig, provideOAuthConfigFactory, SERVER_HOST, SERVER_PATH, STORAGE} from './models';\nimport {OAuthService} from './services/oauth.service';\nimport {OAuthLoginComponent} from './components/login/oauth-login.component';\nimport {CommonModule, isPlatformBrowser} from '@angular/common';\nimport {OAuthInterceptor} from './services/oauth.interceptor';\nimport {TokenService} from './services/token.service';\n\nconst mockLocation = (serverHost: string, serverPath: string): Location => {\n const url = new URL(serverHost && serverPath ? `${serverHost}${serverPath}` : 'http://localhost');\n const {href, origin, protocol, host, hostname, port, pathname, search, hash} = url;\n return {\n href, origin, protocol, host, hostname, port, pathname, search, hash,\n reload() {\n },\n assign(_: string) {\n },\n ancestorOrigins: {} as any,\n replace(_: string) {\n }\n };\n};\n\nconst LocationService = {\n provide: LOCATION,\n useFactory(platformId: Object, serverHost: string, serverPath: string) {\n return isPlatformBrowser(platformId) ? location : mockLocation(serverHost, serverPath);\n },\n deps: [\n PLATFORM_ID,\n [new Optional(), SERVER_HOST],\n [new Optional(), SERVER_PATH]\n ]\n};\n\nconst mockStorage: Storage = {\n clear() {\n },\n getItem(key: string) {\n return null;\n },\n key(index: number) {\n return null;\n },\n removeItem(key: string) {\n },\n setItem(key: string, value: string) {\n },\n length: 0\n};\n\nconst StorageService = {\n provide: STORAGE,\n useFactory(platformId: Object) {\n return isPlatformBrowser(platformId) ? localStorage : mockStorage;\n },\n deps: [PLATFORM_ID]\n};\n\nconst OAuthInterceptorService = {\n provide: HTTP_INTERCEPTORS,\n useClass: OAuthInterceptor,\n multi: true,\n};\n\nconst defaultConfig = (storage: Storage) => {\n return {\n storage,\n storageKey: 'token',\n ignorePaths: []\n };\n};\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n HttpClientModule,\n RouterModule,\n ],\n declarations: [OAuthLoginComponent],\n exports: [OAuthLoginComponent]\n})\nexport class OAuthModule {\n\n static forRoot(config: OAuthConfig = {}): ModuleWithProviders<OAuthModule> {\n return {\n ngModule: OAuthModule,\n providers: [\n LocationService,\n StorageService,\n provideOAuthConfigFactory((storage: Storage) => ({\n ...defaultConfig(storage),\n ...config\n }), [STORAGE]),\n TokenService,\n OAuthInterceptorService,\n OAuthService,\n ]\n };\n }\n}\n","/*\n * Public API Surface of ngx-oauth\n */\nexport * from './lib/models';\nexport * from './lib/services/oauth.service';\nexport * from './lib/services/oauth.interceptor';\nexport * from './lib/components/login/oauth-login.component';\nexport * from './lib/oauth.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.OAuthConfig","switchMap","i4","i1.TokenService","i2.OAuthConfig","i2"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-oauth.mjs","sources":["../../../projects/ngx-oauth/src/lib/models/index.ts","../../../projects/ngx-oauth/src/lib/services/token.service.ts","../../../projects/ngx-oauth/src/lib/services/oauth.service.ts","../../../projects/ngx-oauth/src/lib/services/oauth.interceptor.ts","../../../projects/ngx-oauth/src/lib/components/login/oauth-login.component.ts","../../../projects/ngx-oauth/src/lib/components/login/oauth-login.component.html","../../../projects/ngx-oauth/src/lib/oauth.module.ts","../../../projects/ngx-oauth/src/index.ts","../../../projects/ngx-oauth/src/ngx-oauth.ts"],"sourcesContent":["import {FactoryProvider, inject, Injectable, InjectionToken, ValueProvider} from '@angular/core';\nimport {HttpHeaders} from '@angular/common/http';\n\nexport const SERVER_HOST = new InjectionToken<string>('SERVER_HOST');\nexport const SERVER_PATH = new InjectionToken<string>('SERVER_PATH');\nexport const LOCATION = new InjectionToken<Location>('Location');\nexport const STORAGE = new InjectionToken<Storage>('Storage');\nexport const OAUTH_CONFIG = new InjectionToken<OAuthConfig[]>('OAuthConfig');\nexport const OAUTH_TOKEN = new InjectionToken<OAuthToken>('OAuthToken');\nexport const HEADER_APPLICATION = new HttpHeaders({'Content-Type': 'application/x-www-form-urlencoded'});\n\n@Injectable({\n providedIn: 'root',\n useFactory: () => inject(OAUTH_CONFIG).reduce((p, c) => ({...p, ...c}), {})\n})\nexport abstract class OAuthConfig {\n config?: OAuthTypeConfig;\n storageKey?: string;\n storage?: Storage;\n ignorePaths?: RegExp[];\n}\n\nexport const provideOAuthConfig = (config: OAuthConfig = {}): ValueProvider => ({\n provide: OAUTH_CONFIG,\n useValue: config,\n multi: true\n});\n\nexport const provideOAuthConfigFactory = (factory: Function, deps?: any[]): FactoryProvider => ({\n provide: OAUTH_CONFIG,\n useFactory: factory,\n deps: deps,\n multi: true\n});\n\nexport enum OAuthType {\n RESOURCE = 'password',\n AUTHORIZATION_CODE = 'code',\n IMPLICIT = 'token',\n CLIENT_CREDENTIAL = 'client_credentials'\n}\n\nexport interface ClientCredentialConfig {\n tokenPath: string;\n revokePath?: string;\n clientId: string;\n clientSecret?: string;\n scope?: string;\n}\n\n// tslint:disable-next-line:no-empty-interface\nexport interface ResourceConfig extends ClientCredentialConfig {\n}\n\nexport interface ImplicitConfig {\n authorizePath: string;\n revokePath?: string;\n clientId: string;\n scope?: string;\n logoutPath?: string;\n logoutRedirectUri?: string;\n}\n\nexport interface AuthorizationCodeConfig extends ResourceConfig {\n authorizePath: string;\n}\n\nexport interface AuthorizationCodePKCEConfig extends AuthorizationCodeConfig {\n pkce: boolean;\n}\n\nexport interface OpenIdConfig {\n issuerPath: string;\n clientId: string;\n clientSecret?: string;\n scope?: string;\n}\n\nexport interface ResourceParameters {\n username: string;\n password: string;\n}\n\nexport interface AuthorizationParameters {\n redirectUri: string;\n responseType: OAuthType.IMPLICIT | OAuthType.AUTHORIZATION_CODE | string;\n state?: string;\n}\n\nexport type OAuthParameters = ResourceParameters | AuthorizationParameters;\nexport type OAuthTypeConfig = OpenIdConfig\n | AuthorizationCodePKCEConfig\n | AuthorizationCodeConfig\n | ImplicitConfig\n | ResourceConfig\n | ClientCredentialConfig;\n\nexport interface OAuthToken {\n id_token?: string;\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n state?: string;\n error?: string;\n error_description?: string;\n expires_in?: number | string;\n refresh_expires_in?: number | string;\n scope?: string;\n codeVerifier?: string;\n nonce?: string;\n type?: OAuthType;\n expires?: number;\n}\n\nexport enum OAuthStatus {\n NOT_AUTHORIZED = 'NOT_AUTHORIZED',\n AUTHORIZED = 'AUTHORIZED',\n DENIED = 'DENIED'\n}\n\nexport interface OpenIdConfiguration {\n issuer?: string;\n authorization_endpoint?: string;\n introspection_endpoint?: string;\n token_endpoint?: string;\n userinfo_endpoint?: string;\n end_session_endpoint?: string;\n revocation_endpoint?: string;\n scopes_supported?: string[];\n code_challenge_methods_supported?: string[];\n}\n\nexport interface UserInfo {\n email?: string;\n email_verified?: boolean;\n family_name?: string;\n given_name?: string;\n name?: string;\n preferred_username?: string;\n sub?: string;\n address?: object;\n picture?: string;\n locale?: string;\n}\n\nexport interface IntrospectInfo extends UserInfo {\n active: boolean;\n scope: string;\n client_id?: string;\n username: string;\n exp: number;\n}\n","import {Injectable, NgZone} from '@angular/core';\nimport {BehaviorSubject, distinctUntilChanged, Observable, of, switchMap} from 'rxjs';\nimport {HEADER_APPLICATION, OAuthConfig, OAuthToken} from '../models';\nimport {catchError, map, shareReplay} from 'rxjs/operators';\nimport {HttpClient, HttpParams} from '@angular/common/http';\n\nconst isExpiredToken = (token?: OAuthToken) => token && token.expires && Date.now() > token.expires || false;\n\n@Injectable()\nexport class TokenService {\n\n #token$ = new BehaviorSubject<OAuthToken>(this.saved);\n token$ = this.#token$.pipe(\n distinctUntilChanged((p, c) => JSON.stringify(p || null) === JSON.stringify(c || null)),\n switchMap(token => !isExpiredToken(token) && of(token) || this.refreshToken(token)),\n shareReplay(1)\n );\n type$ = this.token$.pipe(\n map(token => token?.type),\n shareReplay(1)\n );\n accessToken$ = this.token$.pipe(\n map(token => token?.access_token),\n shareReplay(1),\n );\n\n constructor(protected authConfig: OAuthConfig,\n protected http: HttpClient,\n protected zone: NgZone) {\n }\n\n get token() {\n return this.#token$.value;\n }\n\n set token(token) {\n const expiresIn = Number(token.expires_in) || 0;\n const result = {\n ...token,\n ...expiresIn && {expires: Date.now() + expiresIn * 1000} || {}\n };\n this.saved = result;\n this.#token$.next(result);\n }\n\n get saved() {\n const {storageKey, storage} = this.authConfig;\n return storageKey && storage && storage[storageKey] && JSON.parse(storage[storageKey]) || {};\n }\n\n set saved(token: OAuthToken) {\n const {storageKey, storage} = this.authConfig;\n if (storage && storageKey) {\n if (token) {\n storage[storageKey] = JSON.stringify(token);\n } else {\n delete storage[storageKey];\n }\n }\n }\n\n protected refreshToken(token?: OAuthToken): Observable<OAuthToken> {\n const {tokenPath, clientId, clientSecret, scope} = this.authConfig.config as any;\n const {refresh_token} = token || {};\n return tokenPath && refresh_token && this.http.post<OAuthToken>(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n grant_type: 'refresh_token',\n refresh_token,\n ...scope && {scope} || {},\n }\n }), {\n headers: HEADER_APPLICATION\n }).pipe(\n catchError(() => {\n this.token = {};\n return of(this.token);\n }),\n map(token => {\n this.token = {\n ...this.token,\n ...token\n };\n return this.token;\n })\n ) || of(token);\n }\n}\n","import {Inject, Injectable} from '@angular/core';\nimport {HttpClient, HttpParams} from '@angular/common/http';\nimport {catchError, concatMap, delay, filter, map, shareReplay, switchMap, tap} from 'rxjs/operators';\nimport {firstValueFrom, from, noop, of, ReplaySubject, throwError} from 'rxjs';\nimport {\n AuthorizationCodeConfig,\n AuthorizationParameters,\n HEADER_APPLICATION,\n LOCATION,\n OAuthConfig,\n OAuthParameters,\n OAuthStatus,\n OAuthToken,\n OAuthType,\n OAuthTypeConfig,\n OpenIdConfig,\n OpenIdConfiguration,\n ResourceParameters,\n UserInfo\n} from '../models';\nimport {Location as Location2} from '@angular/common';\nimport {TokenService} from './token.service';\n\nconst arrToString = (buf: Uint8Array) => buf.reduce((s, b) => s + String.fromCharCode(b), '');\n\nconst base64url = (str: string) => btoa(str)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\nconst randomString = (length: number = 48) => {\n const buff = arrToString(crypto.getRandomValues(new Uint8Array(length * 2)));\n return base64url(buff).substring(0, length);\n};\n\nconst pkce = async (value: string) => {\n const buff = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));\n return base64url(arrToString(new Uint8Array(buff)));\n};\n\nconst parseOauthUri = (hash: string) => {\n const regex = /([^&=]+)=([^&]*)/g;\n const params: Record<string, string> = {};\n let m;\n // tslint:disable-next-line:no-conditional-assignment\n while ((m = regex.exec(hash)) !== null) {\n params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);\n }\n return Object.keys(params).length && params || {};\n};\n\nconst jwt = (token: string) => JSON.parse(atob(token.split('.')[1]));\n\n@Injectable()\nexport class OAuthService {\n\n state$ = new ReplaySubject<string>(1);\n config$ = of(this.config).pipe(\n filter(Boolean),\n filter(config => !!config?.clientId),\n map(config => config as OpenIdConfig),\n switchMap(config => !config.issuerPath && of(config) || this.http.get<OpenIdConfiguration>(`${config.issuerPath}/.well-known/openid-configuration`).pipe(\n tap(v => this.config = {\n ...v.authorization_endpoint && {authorizePath: v.authorization_endpoint} || {},\n ...v.token_endpoint && {tokenPath: v.token_endpoint} || {},\n ...v.revocation_endpoint && {revokePath: v.revocation_endpoint} || {},\n ...v.code_challenge_methods_supported && {pkce: v.code_challenge_methods_supported.indexOf('S256') > -1} || {},\n ...v.userinfo_endpoint && {userPath: v.userinfo_endpoint} || {},\n ...v.introspection_endpoint && {introspectionPath: v.introspection_endpoint} || {},\n ...v.end_session_endpoint && {logoutPath: v.end_session_endpoint} || {},\n ...{scope: config.scope || 'openid'}\n } as any),\n map(() => this.config)\n )),\n shareReplay(1)\n );\n token$ = this.config$.pipe(\n tap(config => {\n const {hash, search, origin, pathname} = this.location;\n const isImplicitRedirect = hash && /(access_token=)|(error=)/.test(hash);\n const isAuthCodeRedirect = search && /(code=)|(error=)/.test(search) || hash && /(code=)|(error=)/.test(hash);\n if (isImplicitRedirect) {\n const parameters = parseOauthUri(hash.substring(1));\n this.token = {\n ...parameters,\n type: OAuthType.IMPLICIT,\n };\n this.checkResponse(this.token, parameters);\n } else if (isAuthCodeRedirect) {\n const parameters = parseOauthUri(search && search.substring(1) || hash && hash.substring(1));\n console.log(parameters);\n if (!this.checkResponse(this.token, parameters)) {\n this.token = parameters;\n } else {\n const newParametersString = this.getCleanedUnSearchParameters();\n const {clientId, clientSecret, tokenPath, scope} = config as AuthorizationCodeConfig;\n const {codeVerifier} = this.token || {}; //should be set by authorizationUrl construction\n this.http.post(tokenPath, new HttpParams({\n fromObject: {\n code: parameters?.['code'],\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n redirect_uri: `${origin}${pathname}`,\n grant_type: 'authorization_code',\n ...scope && {scope} || {},\n ...codeVerifier && {code_verifier: codeVerifier} || {}\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n ).subscribe(token => {\n this.token = {\n ...token,\n type: OAuthType.AUTHORIZATION_CODE\n };\n this.locationService.replaceState(`${pathname}${newParametersString}`);\n });\n }\n }\n }),\n switchMap(() => this.tokenService.token$),\n shareReplay(1)\n );\n status$ = this.token$.pipe(\n map(token => token.access_token && OAuthStatus.AUTHORIZED || token.error && OAuthStatus.DENIED || OAuthStatus.NOT_AUTHORIZED),\n shareReplay(1)\n );\n userInfo$ = this.status$.pipe(\n filter(s => s === OAuthStatus.AUTHORIZED),\n map(() => {\n const {config} = this.authConfig as any;\n return config.userPath;\n }),\n filter(Boolean),\n switchMap(path => this.http.get<UserInfo>(path)),\n shareReplay(1)\n );\n type$ = this.tokenService.type$;\n ignorePaths = this.authConfig.ignorePaths || [];\n\n get token() {\n return this.tokenService.token;\n }\n\n set token(token) {\n this.tokenService.token = token;\n }\n\n get config() {\n return this.authConfig.config;\n }\n\n set config(config: OAuthTypeConfig | undefined) {\n if (config) {\n this.authConfig.config = {\n ...this.authConfig.config,\n ...config\n };\n }\n }\n\n constructor(protected authConfig: OAuthConfig,\n protected tokenService: TokenService,\n protected http: HttpClient,\n @Inject(LOCATION) protected location: Location,\n protected locationService: Location2) {\n }\n\n async login(parameters?: OAuthParameters) {\n if (!!parameters && (parameters as ResourceParameters).password) {\n await this.resourceLogin(parameters as ResourceParameters);\n } else if (!!parameters && (parameters as AuthorizationParameters).redirectUri && (parameters as AuthorizationParameters).responseType\n ) {\n await this.toAuthorizationUrl(parameters as AuthorizationParameters);\n } else {\n await this.clientCredentialLogin();\n }\n }\n\n logout(useLogoutUrl?: boolean) {\n this.revoke();\n this.token = {};\n const {logoutPath, logoutRedirectUri} = this.authConfig.config as any;\n if (useLogoutUrl && logoutPath) {\n const {origin, pathname} = this.location;\n const currentPath = `${origin}${pathname}`;\n this.location.replace(`${logoutPath}?post_logout_redirect_uri=${logoutRedirectUri || currentPath}`);\n }\n }\n\n protected revoke() {\n const {revokePath, clientId, clientSecret} = this.authConfig.config as any;\n if (revokePath) {\n const {access_token, refresh_token} = this.token || {};\n const toRevoke = [];\n if (access_token) {\n toRevoke.push({\n ...clientId && {client_id: clientId} || {},\n ...clientSecret && {client_secret: clientSecret} || {},\n token: access_token,\n token_type_hint: 'access_token'\n });\n }\n if (refresh_token) {\n toRevoke.push({\n ...clientId && {client_id: clientId} || {},\n ...clientSecret && {client_secret: clientSecret} || {},\n token: refresh_token,\n token_type_hint: 'refresh_token'\n });\n }\n from(toRevoke).pipe(\n concatMap(o => of(o).pipe(delay(300))), // space request to avoid cancellation\n switchMap(o => this.http.post(revokePath, new HttpParams({fromObject: o}))),\n ).subscribe(noop);\n }\n }\n\n protected clientCredentialLogin() {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n return firstValueFrom(this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n client_secret: clientSecret,\n grant_type: OAuthType.CLIENT_CREDENTIAL,\n ...scope ? {scope} : {},\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n catchError((err) => {\n this.token = err;\n return throwError(() => err);\n }),\n tap(params => {\n this.token = {\n ...params,\n type: OAuthType.CLIENT_CREDENTIAL,\n };\n }),\n ));\n }\n\n protected resourceLogin(parameters: ResourceParameters) {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n const {username, password} = parameters;\n return firstValueFrom(this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n grant_type: OAuthType.RESOURCE,\n ...scope && {scope} || {},\n username,\n password\n }\n }), {headers: HEADER_APPLICATION}).pipe(\n catchError(err => {\n this.token = err;\n return throwError(() => err);\n }),\n tap(params => {\n this.token = {\n ...params,\n type: OAuthType.RESOURCE,\n };\n })\n ));\n }\n\n protected async toAuthorizationUrl(parameters: AuthorizationParameters) {\n const {config} = this.authConfig as any;\n let authorizationUrl = `${config.authorizePath}`;\n authorizationUrl += config.authorizePath.includes('?') && '&' || '?';\n authorizationUrl += `client_id=${config.clientId}`;\n authorizationUrl += `&redirect_uri=${encodeURIComponent(parameters.redirectUri)}`;\n authorizationUrl += `&response_type=${parameters.responseType}`;\n authorizationUrl += `&scope=${encodeURIComponent(config.scope || '')}`;\n authorizationUrl += `&state=${encodeURIComponent(parameters.state || '')}`;\n return this.location.replace(`${authorizationUrl}${this.generateNonce(config)}${await this.generateCodeChallenge(config)}`);\n }\n\n protected async generateCodeChallenge(config: any) {\n if (config.pkce) {\n const codeVerifier = randomString();\n this.token = {...this.token, codeVerifier};\n return `&code_challenge=${await pkce(codeVerifier)}&code_challenge_method=S256`;\n }\n return '';\n }\n\n protected generateNonce(config: any) {\n if (config && config.scope && config.scope.indexOf('openid') > -1) {\n const nonce = randomString(10);\n this.token = {...this.token, nonce};\n return `&nonce=${nonce}`;\n }\n return '';\n }\n\n private checkResponse(token?: OAuthToken,\n parameters?: Record<string, string>) {\n this.emitState(parameters);\n this.cleanLocationHash();\n if (!parameters || parameters['error']) {\n return false;\n }\n if (token && token.nonce && parameters['access_token']) {\n const jwtToken = jwt(parameters['access_token']);\n return token.nonce === jwtToken.nonce;\n }\n return parameters['access_token'] || parameters['code'];\n }\n\n private getCleanedUnSearchParameters() {\n const {search} = this.location;\n let searchString = search && search.substring(1) || '';\n const hashKeys = ['code', 'state', 'error', 'error_description', 'session_state', 'scope', 'authuser', 'prompt'];\n hashKeys.forEach(hashKey => {\n const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');\n searchString = searchString.replace(re, '');\n });\n return searchString.length && `?${searchString}` || '';\n }\n\n private cleanLocationHash() {\n const {hash} = this.location;\n let curHash = hash && hash.substring(1) || '';\n const hashKeys = [\n 'access_token',\n 'token_type',\n 'expires_in',\n 'scope',\n 'state',\n 'error',\n 'error_description',\n 'session_state',\n 'nonce',\n 'id_token',\n 'code'\n ];\n hashKeys.forEach(hashKey => {\n const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');\n curHash = curHash.replace(re, '');\n });\n this.location.hash = curHash;\n }\n\n private emitState(parameters?: Record<string, string>) {\n const {state} = parameters || {};\n state && this.state$.next(state);\n }\n}\n","import {Injectable} from '@angular/core';\nimport {HttpErrorResponse, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {switchMap, take, throwError} from 'rxjs';\nimport {catchError, map} from 'rxjs/operators';\nimport {OAuthConfig} from '../models';\nimport {TokenService} from './token.service';\n\n@Injectable()\nexport class OAuthInterceptor implements HttpInterceptor {\n\n constructor(protected tokenService: TokenService,\n protected authConfig: OAuthConfig) {\n }\n\n intercept(req: HttpRequest<any>, next: HttpHandler) {\n return this.tokenService.token$.pipe(\n take(1),\n map(token => {\n if (token?.access_token && !this.isPathExcepted(req)) {\n req = req.clone({\n setHeaders: {\n Authorization: `${token.token_type} ${token.access_token}`\n }\n });\n }\n return req;\n }),\n switchMap(req => next.handle(req)),\n catchError((err: HttpErrorResponse) => {\n if (err.status === 401 && !this.isPathExcepted(req)) {\n this.tokenService.token = {\n error: `${err.status}`,\n error_description: err.message\n };\n }\n return throwError(() => err);\n })\n );\n }\n\n private isPathExcepted(req: HttpRequest<any>) {\n const {ignorePaths} = this.authConfig || {};\n if (ignorePaths) {\n for (const ignorePath of ignorePaths) {\n try {\n if (req.url.match(ignorePath)) {\n return true;\n }\n } catch (err) {\n }\n }\n }\n return false;\n }\n}\n","import {Component, ContentChild, HostListener, Inject, Input, OnDestroy, Output, TemplateRef, ViewEncapsulation} from '@angular/core';\r\nimport {Observable, Subscription, take} from 'rxjs';\r\nimport {LOCATION, OAuthParameters, OAuthStatus, OAuthType} from '../../models';\r\nimport {tap} from 'rxjs/operators';\r\nimport {OAuthService} from '../../services/oauth.service';\r\nimport {Location as Location2} from '@angular/common';\r\n\r\nexport interface OAuthLoginI18n {\r\n username?: string;\r\n password?: string;\r\n submit?: string;\r\n notAuthorized?: string;\r\n authorized?: string;\r\n denied?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'oauth-login',\r\n templateUrl: 'oauth-login.component.html',\r\n styleUrls: ['oauth-login.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class OAuthLoginComponent implements OnDestroy {\r\n\r\n #subscription = new Subscription();\r\n #redirectUri?: string;\r\n #responseType?: string;\r\n #i18n: OAuthLoginI18n = {\r\n username: 'Username',\r\n password: 'Password',\r\n submit: 'Sign in',\r\n notAuthorized: 'Sign in',\r\n authorized: 'Welcome',\r\n denied: 'Access Denied. Try again!'\r\n };\r\n\r\n get i18n() {\r\n return this.#i18n;\r\n }\r\n\r\n @Input()\r\n type: OAuthType = OAuthType.RESOURCE;\r\n\r\n @Input()\r\n set i18n(i18n) {\r\n this.#i18n = {\r\n ...this.#i18n,\r\n ...i18n\r\n };\r\n }\r\n\r\n get redirectUri() {\r\n return this.#redirectUri || `${this.location.origin}${this.locationService.path(true) || '/'}`;\r\n }\r\n\r\n @Input()\r\n set redirectUri(redirectUri: string) {\r\n if (redirectUri) {\r\n this.#redirectUri = redirectUri;\r\n }\r\n }\r\n\r\n @Input()\r\n set responseType(responseType: string) {\r\n if (this.responseType) {\r\n this.#responseType = responseType;\r\n }\r\n }\r\n\r\n get responseType() {\r\n return this.#responseType || this.type;\r\n }\r\n\r\n @Input()\r\n useLogoutUrl = false;\r\n @Input()\r\n state = '';\r\n @Output()\r\n stateChange = this.oauthService.state$.asObservable();\r\n @Input()\r\n profileName$: Observable<string | undefined> | undefined;\r\n @ContentChild('login', {static: false})\r\n loginTemplate: TemplateRef<any> | undefined;\r\n username = '';\r\n password = '';\r\n profileName?: string;\r\n OAuthStatus = OAuthStatus;\r\n OAuthType = OAuthType;\r\n collapse = false;\r\n status$ = this.oauthService.status$.pipe(\r\n tap(s => {\r\n if (s === OAuthStatus.AUTHORIZED && this.profileName$) {\r\n this.#subscription.add(this.profileName$.pipe(\r\n take(1)\r\n ).subscribe(n => this.profileName = n));\r\n } else {\r\n const {token} = this.oauthService;\r\n const userInfo = token && token.id_token && JSON.parse(atob(token.id_token.split('.')[1])) || {};\r\n this.profileName = userInfo.name || userInfo.username || userInfo.email || userInfo.sub || '';\r\n }\r\n })\r\n );\r\n loginFunction = (p: OAuthParameters) => this.login(p);\r\n logoutFunction = () => this.logout();\r\n\r\n constructor(private oauthService: OAuthService,\r\n private locationService: Location2,\r\n @Inject(LOCATION) private location: Location) {\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n logout() {\r\n this.oauthService.logout(this.useLogoutUrl);\r\n }\r\n\r\n login(parameters: OAuthParameters) {\r\n this.collapse = false;\r\n return this.oauthService.login(parameters);\r\n }\r\n\r\n toggleCollapse() {\r\n this.collapse = !this.collapse;\r\n }\r\n\r\n @HostListener('window:keydown.escape')\r\n keyboardEvent() {\r\n this.collapse = false;\r\n }\r\n}\r\n","<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\"\r\n #form=\"ngForm\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED || status === OAuthStatus.DENIED\"\r\n (submit)=\"login({username: username, password: password})\">\r\n <div class=\"mb-3\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n name=\"username\"\r\n required\r\n [(ngModel)]=\"username\"\r\n [placeholder]=\"i18n.username\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <input type=\"password\"\r\n class=\"form-control\"\r\n name=\"password\"\r\n required\r\n [(ngModel)]=\"password\"\r\n [placeholder]=\"i18n.password\">\r\n </div>\r\n <div class=\"text-end\">\r\n <button type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid\">{{i18n.submit}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noResource>\r\n <a role=\"button\"\r\n class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({responseType: responseType, redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span class=\"not-authorized\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\"\r\n [innerHTML]=\"i18n.notAuthorized\"></span>\r\n <span class=\"authorized\"\r\n *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n <span class=\"welcome\" [innerHTML]=\"i18n.authorized + '&nbsp;'\"></span>\r\n <strong class=\"profile-name\"\r\n [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span class=\"denied\"\r\n *ngIf=\"status === OAuthStatus.DENIED\"\r\n [innerHTML]=\"i18n.denied\"></span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n","import {ModuleWithProviders, NgModule, Optional, PLATFORM_ID} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http';\nimport {RouterModule} from '@angular/router';\nimport {LOCATION, OAuthConfig, provideOAuthConfigFactory, SERVER_HOST, SERVER_PATH, STORAGE} from './models';\nimport {OAuthService} from './services/oauth.service';\nimport {OAuthLoginComponent} from './components/login/oauth-login.component';\nimport {CommonModule, isPlatformBrowser} from '@angular/common';\nimport {OAuthInterceptor} from './services/oauth.interceptor';\nimport {TokenService} from './services/token.service';\n\nconst mockLocation = (serverHost: string, serverPath: string): Location => {\n const url = new URL(serverHost && serverPath ? `${serverHost}${serverPath}` : 'http://localhost');\n const {href, origin, protocol, host, hostname, port, pathname, search, hash} = url;\n return {\n href, origin, protocol, host, hostname, port, pathname, search, hash,\n reload() {\n },\n assign(_: string) {\n },\n ancestorOrigins: {} as any,\n replace(_: string) {\n }\n };\n};\n\nconst LocationService = {\n provide: LOCATION,\n useFactory(platformId: Object, serverHost: string, serverPath: string) {\n return isPlatformBrowser(platformId) ? location : mockLocation(serverHost, serverPath);\n },\n deps: [\n PLATFORM_ID,\n [new Optional(), SERVER_HOST],\n [new Optional(), SERVER_PATH]\n ]\n};\n\nconst mockStorage: Storage = {\n clear() {\n },\n getItem(key: string) {\n return null;\n },\n key(index: number) {\n return null;\n },\n removeItem(key: string) {\n },\n setItem(key: string, value: string) {\n },\n length: 0\n};\n\nconst StorageService = {\n provide: STORAGE,\n useFactory(platformId: Object) {\n return isPlatformBrowser(platformId) ? localStorage : mockStorage;\n },\n deps: [PLATFORM_ID]\n};\n\nconst OAuthInterceptorService = {\n provide: HTTP_INTERCEPTORS,\n useClass: OAuthInterceptor,\n multi: true,\n};\n\nconst defaultConfig = (storage: Storage) => {\n return {\n storage,\n storageKey: 'token',\n ignorePaths: []\n };\n};\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n HttpClientModule,\n RouterModule,\n ],\n declarations: [OAuthLoginComponent],\n exports: [OAuthLoginComponent]\n})\nexport class OAuthModule {\n\n static forRoot(config: OAuthConfig = {}): ModuleWithProviders<OAuthModule> {\n return {\n ngModule: OAuthModule,\n providers: [\n LocationService,\n StorageService,\n provideOAuthConfigFactory((storage: Storage) => ({\n ...defaultConfig(storage),\n ...config\n }), [STORAGE]),\n TokenService,\n OAuthInterceptorService,\n OAuthService,\n ]\n };\n }\n}\n","/*\n * Public API Surface of ngx-oauth\n */\nexport * from './lib/models';\nexport * from './lib/services/oauth.service';\nexport * from './lib/services/oauth.interceptor';\nexport * from './lib/components/login/oauth-login.component';\nexport * from './lib/oauth.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.OAuthConfig","switchMap","i4","i1.TokenService","i2.OAuthConfig","i2"],"mappings":"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"}