@dangl/angular-dangl-identity-client 4.0.0-pullrequest0003-0010 → 4.0.1-beta0003

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.
Files changed (34) hide show
  1. package/README.md +1 -1
  2. package/api-client.d.ts +3 -0
  3. package/dangl-angular-dangl-identity-client.d.ts +1 -0
  4. package/dangl-identity.module.d.ts +5 -0
  5. package/esm2020/api-client.mjs +482 -0
  6. package/{esm2015/dangl-angular-dangl-identity-client.js → esm2020/dangl-angular-dangl-identity-client.mjs} +0 -0
  7. package/esm2020/dangl-identity.module.mjs +21 -0
  8. package/{esm2015/interceptors/dangl-identity-request-validator.js → esm2020/interceptors/dangl-identity-request-validator.mjs} +0 -0
  9. package/esm2020/interceptors/jwt-interceptor.service.mjs +47 -0
  10. package/esm2020/messengers/authentication.messenger.mjs +83 -0
  11. package/{esm2015/models/jwt-storage.js → esm2020/models/jwt-storage.mjs} +0 -0
  12. package/{esm2015/models/user-info.js → esm2020/models/user-info.mjs} +0 -0
  13. package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
  14. package/esm2020/services/authentication.service.mjs +41 -0
  15. package/esm2020/services/jwt-token.service.mjs +95 -0
  16. package/fesm2015/dangl-angular-dangl-identity-client.mjs +754 -0
  17. package/fesm2015/dangl-angular-dangl-identity-client.mjs.map +1 -0
  18. package/{fesm2015/dangl-angular-dangl-identity-client.js → fesm2020/dangl-angular-dangl-identity-client.mjs} +66 -55
  19. package/fesm2020/dangl-angular-dangl-identity-client.mjs.map +1 -0
  20. package/interceptors/jwt-interceptor.service.d.ts +3 -0
  21. package/messengers/authentication.messenger.d.ts +3 -0
  22. package/package.json +21 -9
  23. package/services/authentication.service.d.ts +3 -0
  24. package/services/jwt-token.service.d.ts +3 -0
  25. package/bundles/dangl-angular-dangl-identity-client.umd.js +0 -1179
  26. package/bundles/dangl-angular-dangl-identity-client.umd.js.map +0 -1
  27. package/dangl-angular-dangl-identity-client.metadata.json +0 -1
  28. package/esm2015/api-client.js +0 -476
  29. package/esm2015/dangl-identity.module.js +0 -14
  30. package/esm2015/interceptors/jwt-interceptor.service.js +0 -43
  31. package/esm2015/messengers/authentication.messenger.js +0 -85
  32. package/esm2015/services/authentication.service.js +0 -45
  33. package/esm2015/services/jwt-token.service.js +0 -97
  34. package/fesm2015/dangl-angular-dangl-identity-client.js.map +0 -1
@@ -0,0 +1,21 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
3
+ import { JwtInterceptorService } from './interceptors/jwt-interceptor.service';
4
+ import * as i0 from "@angular/core";
5
+ export class DanglIdentityModule {
6
+ }
7
+ DanglIdentityModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: DanglIdentityModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
8
+ DanglIdentityModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: DanglIdentityModule, imports: [HttpClientModule] });
9
+ DanglIdentityModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: DanglIdentityModule, providers: [{ provide: HTTP_INTERCEPTORS, useClass: JwtInterceptorService, multi: true }], imports: [[
10
+ HttpClientModule
11
+ ]] });
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: DanglIdentityModule, decorators: [{
13
+ type: NgModule,
14
+ args: [{
15
+ imports: [
16
+ HttpClientModule
17
+ ],
18
+ providers: [{ provide: HTTP_INTERCEPTORS, useClass: JwtInterceptorService, multi: true }]
19
+ }]
20
+ }] });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFuZ2wtaWRlbnRpdHkubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1kYW5nbC1pZGVudGl0eS1jbGllbnQvc3JjL2RhbmdsLWlkZW50aXR5Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOztBQVEvRSxNQUFNLE9BQU8sbUJBQW1COztnSEFBbkIsbUJBQW1CO2lIQUFuQixtQkFBbUIsWUFKNUIsZ0JBQWdCO2lIQUlQLG1CQUFtQixhQUZuQixDQUFDLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsWUFIaEY7WUFDUCxnQkFBZ0I7U0FDakI7MkZBR1UsbUJBQW1CO2tCQU4vQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxnQkFBZ0I7cUJBQ2pCO29CQUNELFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQzFGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudE1vZHVsZSwgSFRUUF9JTlRFUkNFUFRPUlMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEp3dEludGVyY2VwdG9yU2VydmljZSB9IGZyb20gJy4vaW50ZXJjZXB0b3JzL2p3dC1pbnRlcmNlcHRvci5zZXJ2aWNlJztcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW1xyXG4gICAgSHR0cENsaWVudE1vZHVsZVxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBIVFRQX0lOVEVSQ0VQVE9SUywgdXNlQ2xhc3M6IEp3dEludGVyY2VwdG9yU2VydmljZSwgbXVsdGk6IHRydWUgfV1cclxufSlcclxuZXhwb3J0IGNsYXNzIERhbmdsSWRlbnRpdHlNb2R1bGUgeyB9XHJcbiJdfQ==
@@ -0,0 +1,47 @@
1
+ import { Inject, Injectable, InjectionToken, Optional } from "@angular/core";
2
+ import { mergeMap } from "rxjs/operators";
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../services/jwt-token.service";
5
+ export const DANGL_IDENTITY_REQUEST_VALIDATOR = new InjectionToken("Validator to decide whether to include JWT tokens in requests");
6
+ export class JwtInterceptorService {
7
+ constructor(jwtTokenService, requestValidator) {
8
+ this.jwtTokenService = jwtTokenService;
9
+ this.requestValidator = requestValidator;
10
+ }
11
+ intercept(request, next) {
12
+ if (request.url.startsWith("/identity")) {
13
+ // Requests to the authentication endpoint should not be intercepted
14
+ return next.handle(request.clone());
15
+ }
16
+ if (this.requestValidator &&
17
+ !this.requestValidator.validateRequest(request)) {
18
+ // In case a request validator is provided but doesn't return true for the
19
+ // current request, we're not appending a token
20
+ return next.handle(request);
21
+ }
22
+ return this.jwtTokenService
23
+ .getToken()
24
+ .pipe(mergeMap((f) => next.handle(this.getHttpRequestWithToken(request, f && f.accessToken))));
25
+ }
26
+ getHttpRequestWithToken(request, token) {
27
+ if (token) {
28
+ return request.clone({
29
+ setHeaders: {
30
+ Authorization: `Bearer ${token}`,
31
+ },
32
+ });
33
+ }
34
+ return request.clone();
35
+ }
36
+ }
37
+ JwtInterceptorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: JwtInterceptorService, deps: [{ token: i1.JwtTokenService }, { token: DANGL_IDENTITY_REQUEST_VALIDATOR, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
38
+ JwtInterceptorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: JwtInterceptorService });
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: JwtInterceptorService, decorators: [{
40
+ type: Injectable
41
+ }], ctorParameters: function () { return [{ type: i1.JwtTokenService }, { type: undefined, decorators: [{
42
+ type: Optional
43
+ }, {
44
+ type: Inject,
45
+ args: [DANGL_IDENTITY_REQUEST_VALIDATOR]
46
+ }] }]; } });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LWludGVyY2VwdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWRhbmdsLWlkZW50aXR5LWNsaWVudC9zcmMvaW50ZXJjZXB0b3JzL2p3dC1pbnRlcmNlcHRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHN0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFHMUMsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQzNDLElBQUksY0FBYyxDQUNoQiwrREFBK0QsQ0FDaEUsQ0FBQztBQUVKLE1BQU0sT0FBTyxxQkFBcUI7SUFDaEMsWUFDUyxlQUFnQyxFQUcvQixnQkFBZ0Q7UUFIakQsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBRy9CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBZ0M7SUFDdkQsQ0FBQztJQUNKLFNBQVMsQ0FDUCxPQUF5QixFQUN6QixJQUFpQjtRQUVqQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3ZDLG9FQUFvRTtZQUNwRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDckM7UUFFRCxJQUNFLElBQUksQ0FBQyxnQkFBZ0I7WUFDckIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUMvQztZQUNBLDBFQUEwRTtZQUMxRSwrQ0FBK0M7WUFDL0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdCO1FBRUQsT0FBTyxJQUFJLENBQUMsZUFBZTthQUN4QixRQUFRLEVBQUU7YUFDVixJQUFJLENBQ0gsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDYixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUN2RSxDQUNGLENBQUM7SUFDTixDQUFDO0lBRU8sdUJBQXVCLENBQzdCLE9BQXlCLEVBQ3pCLEtBQWM7UUFFZCxJQUFJLEtBQUssRUFBRTtZQUNULE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDbkIsVUFBVSxFQUFFO29CQUNWLGFBQWEsRUFBRSxVQUFVLEtBQUssRUFBRTtpQkFDakM7YUFDRixDQUFDLENBQUM7U0FDSjtRQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLENBQUM7O2tIQTlDVSxxQkFBcUIsaURBSXRCLGdDQUFnQztzSEFKL0IscUJBQXFCOzJGQUFyQixxQkFBcUI7a0JBRGpDLFVBQVU7OzBCQUlOLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsZ0NBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBIdHRwRXZlbnQsXHJcbiAgSHR0cEhhbmRsZXIsXHJcbiAgSHR0cEludGVyY2VwdG9yLFxyXG4gIEh0dHBSZXF1ZXN0LFxyXG59IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5cclxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBKd3RUb2tlblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvand0LXRva2VuLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IG1lcmdlTWFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7IElEYW5nbElkZW50aXR5UmVxdWVzdFZhbGlkYXRvciB9IGZyb20gXCIuL2RhbmdsLWlkZW50aXR5LXJlcXVlc3QtdmFsaWRhdG9yXCI7XHJcblxyXG5leHBvcnQgY29uc3QgREFOR0xfSURFTlRJVFlfUkVRVUVTVF9WQUxJREFUT1IgPVxyXG4gIG5ldyBJbmplY3Rpb25Ub2tlbjxJRGFuZ2xJZGVudGl0eVJlcXVlc3RWYWxpZGF0b3I+KFxyXG4gICAgXCJWYWxpZGF0b3IgdG8gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSBKV1QgdG9rZW5zIGluIHJlcXVlc3RzXCJcclxuICApO1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBKd3RJbnRlcmNlcHRvclNlcnZpY2UgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGp3dFRva2VuU2VydmljZTogSnd0VG9rZW5TZXJ2aWNlLFxyXG4gICAgQE9wdGlvbmFsKClcclxuICAgIEBJbmplY3QoREFOR0xfSURFTlRJVFlfUkVRVUVTVF9WQUxJREFUT1IpXHJcbiAgICBwcml2YXRlIHJlcXVlc3RWYWxpZGF0b3I6IElEYW5nbElkZW50aXR5UmVxdWVzdFZhbGlkYXRvclxyXG4gICkge31cclxuICBpbnRlcmNlcHQoXHJcbiAgICByZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LFxyXG4gICAgbmV4dDogSHR0cEhhbmRsZXJcclxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XHJcbiAgICBpZiAocmVxdWVzdC51cmwuc3RhcnRzV2l0aChcIi9pZGVudGl0eVwiKSkge1xyXG4gICAgICAvLyBSZXF1ZXN0cyB0byB0aGUgYXV0aGVudGljYXRpb24gZW5kcG9pbnQgc2hvdWxkIG5vdCBiZSBpbnRlcmNlcHRlZFxyXG4gICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxdWVzdC5jbG9uZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMucmVxdWVzdFZhbGlkYXRvciAmJlxyXG4gICAgICAhdGhpcy5yZXF1ZXN0VmFsaWRhdG9yLnZhbGlkYXRlUmVxdWVzdChyZXF1ZXN0KVxyXG4gICAgKSB7XHJcbiAgICAgIC8vIEluIGNhc2UgYSByZXF1ZXN0IHZhbGlkYXRvciBpcyBwcm92aWRlZCBidXQgZG9lc24ndCByZXR1cm4gdHJ1ZSBmb3IgdGhlXHJcbiAgICAgIC8vIGN1cnJlbnQgcmVxdWVzdCwgd2UncmUgbm90IGFwcGVuZGluZyBhIHRva2VuXHJcbiAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5qd3RUb2tlblNlcnZpY2VcclxuICAgICAgLmdldFRva2VuKClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWVyZ2VNYXAoKGYpID0+XHJcbiAgICAgICAgICBuZXh0LmhhbmRsZSh0aGlzLmdldEh0dHBSZXF1ZXN0V2l0aFRva2VuKHJlcXVlc3QsIGYgJiYgZi5hY2Nlc3NUb2tlbikpXHJcbiAgICAgICAgKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRIdHRwUmVxdWVzdFdpdGhUb2tlbihcclxuICAgIHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sXHJcbiAgICB0b2tlbj86IHN0cmluZ1xyXG4gICk6IEh0dHBSZXF1ZXN0PGFueT4ge1xyXG4gICAgaWYgKHRva2VuKSB7XHJcbiAgICAgIHJldHVybiByZXF1ZXN0LmNsb25lKHtcclxuICAgICAgICBzZXRIZWFkZXJzOiB7XHJcbiAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXF1ZXN0LmNsb25lKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,83 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { ReplaySubject, Subject } from 'rxjs';
3
+ import { JwtHelperService } from '@auth0/angular-jwt';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../services/jwt-token.service";
6
+ export class AuthenticationMessenger {
7
+ constructor(jwtTokenService) {
8
+ this.jwtTokenService = jwtTokenService;
9
+ this.jwtHelperService = new JwtHelperService();
10
+ this.isAuthenticated = new ReplaySubject(1);
11
+ this.username = new ReplaySubject(1);
12
+ this.email = new ReplaySubject(1);
13
+ this.identiconId = new ReplaySubject(1);
14
+ this.userInfo = new ReplaySubject(1);
15
+ this.tokenRefreshStarted = new Subject();
16
+ this.tokenRefreshFinished = new Subject();
17
+ jwtTokenService.tokenRefreshStarted.subscribe(() => this.tokenRefreshStarted.next());
18
+ jwtTokenService.tokenRefreshFinished.subscribe(successfulRefresh => this.tokenRefreshFinished.next(successfulRefresh));
19
+ jwtTokenService.tokenStored.subscribe(jwtToken => this.refreshAuthenticationStatus(jwtToken));
20
+ jwtTokenService.getToken()
21
+ .subscribe(token => this.refreshAuthenticationStatus(token));
22
+ }
23
+ refreshAuthenticationStatus(jwtToken) {
24
+ if (jwtToken) {
25
+ const isValidToken = jwtToken.expiresAt > (new Date().getTime() / 1000);
26
+ if (this.lastBroadcastAccessToken === jwtToken.accessToken) {
27
+ return;
28
+ }
29
+ this.lastBroadcastAccessToken = jwtToken.accessToken;
30
+ if (isValidToken) {
31
+ this.isAuthenticated.next(true);
32
+ const decodedToken = this.jwtHelperService.decodeToken(jwtToken.accessToken);
33
+ this.username.next(decodedToken['name']);
34
+ this.email.next(decodedToken['email']);
35
+ this.identiconId.next(decodedToken['identicon_id']);
36
+ const tokenClaims = {};
37
+ for (const tokenProp in decodedToken) {
38
+ if (decodedToken.hasOwnProperty(tokenProp)) {
39
+ const property = decodedToken[tokenProp];
40
+ if (typeof property === 'string') {
41
+ tokenClaims[tokenProp] = property;
42
+ }
43
+ }
44
+ }
45
+ this.userInfo.next({
46
+ id: decodedToken['sub'],
47
+ claims: tokenClaims,
48
+ deserializedToken: decodedToken,
49
+ email: decodedToken['email'],
50
+ identiconId: decodedToken['identicon_id'],
51
+ username: decodedToken['name'],
52
+ roles: decodedToken['role']
53
+ });
54
+ }
55
+ else {
56
+ this.isAuthenticated.next(false);
57
+ this.jwtTokenService
58
+ .refreshToken()
59
+ .subscribe(() => { });
60
+ }
61
+ }
62
+ else {
63
+ if (this.lastBroadcastAccessToken === null) {
64
+ return;
65
+ }
66
+ this.lastBroadcastAccessToken = null;
67
+ this.isAuthenticated.next(false);
68
+ this.username.next(null);
69
+ this.email.next(null);
70
+ this.identiconId.next(null);
71
+ this.userInfo.next(null);
72
+ }
73
+ }
74
+ }
75
+ AuthenticationMessenger.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: AuthenticationMessenger, deps: [{ token: i1.JwtTokenService }], target: i0.ɵɵFactoryTarget.Injectable });
76
+ AuthenticationMessenger.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: AuthenticationMessenger, providedIn: 'root' });
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: AuthenticationMessenger, decorators: [{
78
+ type: Injectable,
79
+ args: [{
80
+ providedIn: 'root'
81
+ }]
82
+ }], ctorParameters: function () { return [{ type: i1.JwtTokenService }]; } });
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24ubWVzc2VuZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1kYW5nbC1pZGVudGl0eS1jbGllbnQvc3JjL21lc3NlbmdlcnMvYXV0aGVudGljYXRpb24ubWVzc2VuZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQU10RCxNQUFNLE9BQU8sdUJBQXVCO0lBYWxDLFlBQW9CLGVBQWdDO1FBQWhDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQVg1QyxxQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFHekMsb0JBQWUsR0FBRyxJQUFJLGFBQWEsQ0FBVSxDQUFDLENBQUMsQ0FBQztRQUNoRCxhQUFRLEdBQUcsSUFBSSxhQUFhLENBQVMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsVUFBSyxHQUFHLElBQUksYUFBYSxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLGdCQUFXLEdBQUcsSUFBSSxhQUFhLENBQVMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsYUFBUSxHQUFHLElBQUksYUFBYSxDQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzFDLHdCQUFtQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDcEMseUJBQW9CLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUdyRCxlQUFlLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsRUFB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LENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMxQjtJQUNILENBQUM7O29IQXZFVSx1QkFBdUI7d0hBQXZCLHVCQUF1QixjQUZ0QixNQUFNOzJGQUVQLHVCQUF1QjtrQkFIbkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVXNlckluZm8gfSBmcm9tICcuLi9tb2RlbHMvdXNlci1pbmZvJztcclxuaW1wb3J0IHsgSnd0VG9rZW5TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvand0LXRva2VuLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBKd3RIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnQGF1dGgwL2FuZ3VsYXItand0JztcclxuaW1wb3J0IHsgSnd0U3RvcmFnZSB9IGZyb20gJy4uL21vZGVscy9qd3Qtc3RvcmFnZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRoZW50aWNhdGlvbk1lc3NlbmdlciB7XHJcblxyXG4gIHByaXZhdGUgand0SGVscGVyU2VydmljZSA9IG5ldyBKd3RIZWxwZXJTZXJ2aWNlKCk7XHJcbiAgcHJpdmF0ZSBsYXN0QnJvYWRjYXN0QWNjZXNzVG9rZW46IHN0cmluZztcclxuXHJcbiAgcmVhZG9ubHkgaXNBdXRoZW50aWNhdGVkID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XHJcbiAgcmVhZG9ubHkgdXNlcm5hbWUgPSBuZXcgUmVwbGF5U3ViamVjdDxzdHJpbmc+KDEpO1xyXG4gIHJlYWRvbmx5IGVtYWlsID0gbmV3IFJlcGxheVN1YmplY3Q8c3RyaW5nPigxKTtcclxuICByZWFkb25seSBpZGVudGljb25JZCA9IG5ldyBSZXBsYXlTdWJqZWN0PHN0cmluZz4oMSk7XHJcbiAgcmVhZG9ubHkgdXNlckluZm8gPSBuZXcgUmVwbGF5U3ViamVjdDxVc2VySW5mbz4oMSk7XHJcbiAgcmVhZG9ubHkgdG9rZW5SZWZyZXNoU3RhcnRlZCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcmVhZG9ubHkgdG9rZW5SZWZyZXNoRmluaXNoZWQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGp3dFRva2VuU2VydmljZTogSnd0VG9rZW5TZXJ2aWNlKSB7XHJcbiAgICBqd3RUb2tlblNlcnZpY2UudG9rZW5SZWZyZXNoU3RhcnRlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy50b2tlblJlZnJlc2hTdGFydGVkLm5leHQoKSk7XHJcbiAgICBqd3RUb2tlblNlcnZpY2UudG9rZW5SZWZyZXNoRmluaXNoZWQuc3Vic2NyaWJlKHN1Y2Nlc3NmdWxSZWZyZXNoID0+IHRoaXMudG9rZW5SZWZyZXNoRmluaXNoZWQubmV4dChzdWNjZXNzZnVsUmVmcmVzaCkpO1xyXG4gICAgand0VG9rZW5TZXJ2aWNlLnRva2VuU3RvcmVkLnN1YnNjcmliZShqd3RUb2tlbiA9PiB0aGlzLnJlZnJlc2hBdXRoZW50aWNhdGlvblN0YXR1cyhqd3RUb2tlbikpO1xyXG4gICAgand0VG9rZW5TZXJ2aWNlLmdldFRva2VuKClcclxuICAgICAgLnN1YnNjcmliZSh0b2tlbiA9PiB0aGlzLnJlZnJlc2hBdXRoZW50aWNhdGlvblN0YXR1cyh0b2tlbikpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoQXV0aGVudGljYXRpb25TdGF0dXMoand0VG9rZW4/OiBKd3RTdG9yYWdlKSB7XHJcbiAgICBpZiAoand0VG9rZW4pIHtcclxuICAgICAgY29uc3QgaXNWYWxpZFRva2VuID0gand0VG9rZW4uZXhwaXJlc0F0ID4gKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCk7XHJcbiAgICAgIGlmICh0aGlzLmxhc3RCcm9hZGNhc3RBY2Nlc3NUb2tlbiA9PT0gand0VG9rZW4uYWNjZXNzVG9rZW4pIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5sYXN0QnJvYWRjYXN0QWNjZXNzVG9rZW4gPSBqd3RUb2tlbi5hY2Nlc3NUb2tlbjtcclxuICAgICAgaWYgKGlzVmFsaWRUb2tlbikge1xyXG4gICAgICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgY29uc3QgZGVjb2RlZFRva2VuID0gdGhpcy5qd3RIZWxwZXJTZXJ2aWNlLmRlY29kZVRva2VuKGp3dFRva2VuLmFjY2Vzc1Rva2VuKTtcclxuICAgICAgICB0aGlzLnVzZXJuYW1lLm5leHQoZGVjb2RlZFRva2VuWyduYW1lJ10pO1xyXG4gICAgICAgIHRoaXMuZW1haWwubmV4dChkZWNvZGVkVG9rZW5bJ2VtYWlsJ10pO1xyXG4gICAgICAgIHRoaXMuaWRlbnRpY29uSWQubmV4dChkZWNvZGVkVG9rZW5bJ2lkZW50aWNvbl9pZCddKTtcclxuXHJcbiAgICAgICAgY29uc3QgdG9rZW5DbGFpbXM6IHsgW2NsYWltOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xyXG4gICAgICAgIGZvciAoY29uc3QgdG9rZW5Qcm9wIGluIGRlY29kZWRUb2tlbikge1xyXG4gICAgICAgICAgaWYgKGRlY29kZWRUb2tlbi5oYXNPd25Qcm9wZXJ0eSh0b2tlblByb3ApKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gZGVjb2RlZFRva2VuW3Rva2VuUHJvcF07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgdG9rZW5DbGFpbXNbdG9rZW5Qcm9wXSA9IHByb3BlcnR5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVzZXJJbmZvLm5leHQoe1xyXG4gICAgICAgICAgaWQ6IGRlY29kZWRUb2tlblsnc3ViJ10sXHJcbiAgICAgICAgICBjbGFpbXM6IHRva2VuQ2xhaW1zLFxyXG4gICAgICAgICAgZGVzZXJpYWxpemVkVG9rZW46IGRlY29kZWRUb2tlbixcclxuICAgICAgICAgIGVtYWlsOiBkZWNvZGVkVG9rZW5bJ2VtYWlsJ10sXHJcbiAgICAgICAgICBpZGVudGljb25JZDogZGVjb2RlZFRva2VuWydpZGVudGljb25faWQnXSxcclxuICAgICAgICAgIHVzZXJuYW1lOiBkZWNvZGVkVG9rZW5bJ25hbWUnXSxcclxuICAgICAgICAgIHJvbGVzOiBkZWNvZGVkVG9rZW5bJ3JvbGUnXVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkLm5leHQoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuand0VG9rZW5TZXJ2aWNlXHJcbiAgICAgICAgICAucmVmcmVzaFRva2VuKClcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4geyB9KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMubGFzdEJyb2FkY2FzdEFjY2Vzc1Rva2VuID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubGFzdEJyb2FkY2FzdEFjY2Vzc1Rva2VuID0gbnVsbDtcclxuICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWQubmV4dChmYWxzZSk7XHJcbiAgICAgIHRoaXMudXNlcm5hbWUubmV4dChudWxsKTtcclxuICAgICAgdGhpcy5lbWFpbC5uZXh0KG51bGwpO1xyXG4gICAgICB0aGlzLmlkZW50aWNvbklkLm5leHQobnVsbCk7XHJcbiAgICAgIHRoaXMudXNlckluZm8ubmV4dChudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcbiJdfQ==
@@ -0,0 +1,41 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { of } from 'rxjs';
3
+ import { map, catchError } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../api-client";
6
+ import * as i2 from "./jwt-token.service";
7
+ export class AuthenticationService {
8
+ constructor(danglIdentityClient, jwtTokenService) {
9
+ this.danglIdentityClient = danglIdentityClient;
10
+ this.jwtTokenService = jwtTokenService;
11
+ }
12
+ loginWithToken(identifier, password) {
13
+ return this.danglIdentityClient
14
+ .loginAndReturnToken({
15
+ identifier: identifier,
16
+ password: password
17
+ })
18
+ .pipe(map(r => this.storeJwtTokenIfValid(r)), catchError(e => of(false)));
19
+ }
20
+ storeJwtTokenIfValid(token) {
21
+ if (!token.accessToken
22
+ || !token.refreshToken
23
+ || !token.expiresIn) {
24
+ return false;
25
+ }
26
+ this.jwtTokenService.storeToken(token);
27
+ return true;
28
+ }
29
+ logout() {
30
+ this.jwtTokenService.deleteToken();
31
+ }
32
+ }
33
+ AuthenticationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: AuthenticationService, deps: [{ token: i1.DanglIdentityClient }, { token: i2.JwtTokenService }], target: i0.ɵɵFactoryTarget.Injectable });
34
+ AuthenticationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: AuthenticationService, providedIn: 'root' });
35
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: AuthenticationService, decorators: [{
36
+ type: Injectable,
37
+ args: [{
38
+ providedIn: 'root'
39
+ }]
40
+ }], ctorParameters: function () { return [{ type: i1.DanglIdentityClient }, { type: i2.JwtTokenService }]; } });
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZGFuZ2wtaWRlbnRpdHktY2xpZW50L3NyYy9zZXJ2aWNlcy9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBTWpELE1BQU0sT0FBTyxxQkFBcUI7SUFFaEMsWUFBb0IsbUJBQXdDLEVBQ2xELGVBQWdDO1FBRHRCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDbEQsb0JBQWUsR0FBZixlQUFlLENBQWlCO0lBQUksQ0FBQztJQUUvQyxjQUFjLENBQUMsVUFBa0IsRUFBRSxRQUFnQjtRQUNqRCxPQUFPLElBQUksQ0FBQyxtQkFBbUI7YUFDNUIsbUJBQW1CLENBQUM7WUFDbkIsVUFBVSxFQUFFLFVBQVU7WUFDdEIsUUFBUSxFQUFFLFFBQVE7U0FDbkIsQ0FBQzthQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDMUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU8sb0JBQW9CLENBQUMsS0FBdUI7UUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXO2VBQ2pCLENBQUMsS0FBSyxDQUFDLFlBQVk7ZUFDbkIsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFO1lBQ3JCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQyxDQUFDOztrSEEzQlUscUJBQXFCO3NIQUFyQixxQkFBcUIsY0FGcEIsTUFBTTsyRkFFUCxxQkFBcUI7a0JBSGpDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEYW5nbElkZW50aXR5Q2xpZW50LCBUb2tlblJlc3BvbnNlR2V0IH0gZnJvbSAnLi4vYXBpLWNsaWVudCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgSnd0VG9rZW5TZXJ2aWNlIH0gZnJvbSAnLi9qd3QtdG9rZW4uc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRoZW50aWNhdGlvblNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhbmdsSWRlbnRpdHlDbGllbnQ6IERhbmdsSWRlbnRpdHlDbGllbnQsXHJcbiAgICBwcml2YXRlIGp3dFRva2VuU2VydmljZTogSnd0VG9rZW5TZXJ2aWNlKSB7IH1cclxuXHJcbiAgbG9naW5XaXRoVG9rZW4oaWRlbnRpZmllcjogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5kYW5nbElkZW50aXR5Q2xpZW50XHJcbiAgICAgIC5sb2dpbkFuZFJldHVyblRva2VuKHtcclxuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxyXG4gICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZFxyXG4gICAgICB9KVxyXG4gICAgICAucGlwZShtYXAociA9PiB0aGlzLnN0b3JlSnd0VG9rZW5JZlZhbGlkKHIpKSxcclxuICAgICAgICBjYXRjaEVycm9yKGUgPT4gb2YoZmFsc2UpKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0b3JlSnd0VG9rZW5JZlZhbGlkKHRva2VuOiBUb2tlblJlc3BvbnNlR2V0KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRva2VuLmFjY2Vzc1Rva2VuXHJcbiAgICAgIHx8ICF0b2tlbi5yZWZyZXNoVG9rZW5cclxuICAgICAgfHwgIXRva2VuLmV4cGlyZXNJbikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLmp3dFRva2VuU2VydmljZS5zdG9yZVRva2VuKHRva2VuKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgbG9nb3V0KCkge1xyXG4gICAgdGhpcy5qd3RUb2tlblNlcnZpY2UuZGVsZXRlVG9rZW4oKTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,95 @@
1
+ import { Injectable } from "@angular/core";
2
+ import { Subject, of, ReplaySubject } from "rxjs";
3
+ import { map, tap, first } from "rxjs/operators";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../api-client";
6
+ export class JwtTokenService {
7
+ constructor(danglIdentityClient) {
8
+ this.danglIdentityClient = danglIdentityClient;
9
+ this.storage_identifier = "dangl_identity_integration_jwt_token";
10
+ this.isRefreshing = false;
11
+ this.refreshTokenSource = new Subject();
12
+ this.tokenStoredSource = new ReplaySubject(1);
13
+ this.tokenStored = this.tokenStoredSource.asObservable();
14
+ this.tokenRefreshStartedSource = new Subject();
15
+ this.tokenRefreshStarted = this.tokenRefreshStartedSource.asObservable();
16
+ this.tokenRefreshFinishedSource = new Subject();
17
+ this.tokenRefreshFinished = this.tokenRefreshFinishedSource.asObservable();
18
+ }
19
+ deleteToken() {
20
+ localStorage.removeItem(this.storage_identifier);
21
+ this.tokenStoredSource.next(null);
22
+ }
23
+ storeCustomToken(tokenToStore) {
24
+ localStorage.setItem(this.storage_identifier, JSON.stringify(tokenToStore));
25
+ this.tokenStoredSource.next(tokenToStore);
26
+ }
27
+ storeToken(token) {
28
+ const tokenToStore = this.transformTokenResponse(token);
29
+ localStorage.setItem(this.storage_identifier, JSON.stringify(tokenToStore));
30
+ this.tokenStoredSource.next(tokenToStore);
31
+ }
32
+ getTokenFromStorage() {
33
+ const storedString = localStorage.getItem(this.storage_identifier);
34
+ if (storedString) {
35
+ const storedToken = JSON.parse(storedString);
36
+ return storedToken;
37
+ }
38
+ return null;
39
+ }
40
+ refreshToken() {
41
+ if (this.isRefreshing) {
42
+ return this.refreshTokenSource.pipe(first());
43
+ }
44
+ this.isRefreshing = true;
45
+ this.tokenRefreshStartedSource.next();
46
+ const refreshToken = this.getTokenFromStorage().refreshToken;
47
+ if (!refreshToken) {
48
+ this.isRefreshing = false;
49
+ return of(null);
50
+ }
51
+ this.danglIdentityClient
52
+ .refreshToken({
53
+ refreshToken: refreshToken,
54
+ })
55
+ .pipe(tap((r) => this.storeToken(r)), map((r) => this.transformTokenResponse(r)))
56
+ .subscribe((refreshTokenResponse) => {
57
+ this.isRefreshing = false;
58
+ this.tokenRefreshFinishedSource.next(true);
59
+ this.refreshTokenSource.next(refreshTokenResponse);
60
+ }, (error) => {
61
+ this.isRefreshing = false;
62
+ this.tokenRefreshFinishedSource.next(false);
63
+ this.refreshTokenSource.next(null);
64
+ console.error("Internal error while refreshing Dangl.Identity token", error);
65
+ });
66
+ return this.refreshTokenSource.pipe(first());
67
+ }
68
+ getToken() {
69
+ const token = this.getTokenFromStorage();
70
+ if (!token) {
71
+ return of(null);
72
+ }
73
+ const isValidToken = token.expiresAt > new Date().getTime() / 1000;
74
+ if (isValidToken) {
75
+ return of(token);
76
+ }
77
+ return this.refreshToken();
78
+ }
79
+ transformTokenResponse(token) {
80
+ return {
81
+ accessToken: token.accessToken,
82
+ refreshToken: token.refreshToken,
83
+ expiresAt: new Date().getTime() / 1000 + token.expiresIn,
84
+ };
85
+ }
86
+ }
87
+ JwtTokenService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: JwtTokenService, deps: [{ token: i1.DanglIdentityClient }], target: i0.ɵɵFactoryTarget.Injectable });
88
+ JwtTokenService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: JwtTokenService, providedIn: "root" });
89
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: JwtTokenService, decorators: [{
90
+ type: Injectable,
91
+ args: [{
92
+ providedIn: "root",
93
+ }]
94
+ }], ctorParameters: function () { return [{ type: i1.DanglIdentityClient }]; } });
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LXRva2VuLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWRhbmdsLWlkZW50aXR5LWNsaWVudC9zcmMvc2VydmljZXMvand0LXRva2VuLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQUUsT0FBTyxFQUFjLEVBQUUsRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLEdBQUcsRUFBYyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQU03RCxNQUFNLE9BQU8sZUFBZTtJQVcxQixZQUFvQixtQkFBd0M7UUFBeEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQVYzQyx1QkFBa0IsR0FBRyxzQ0FBc0MsQ0FBQztRQUNyRSxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQix1QkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBYyxDQUFDO1FBQy9DLHNCQUFpQixHQUFHLElBQUksYUFBYSxDQUFhLENBQUMsQ0FBQyxDQUFDO1FBQzdELGdCQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzVDLDhCQUF5QixHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDbEQsd0JBQW1CLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzVELCtCQUEwQixHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFDNUQseUJBQW9CLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBRVAsQ0FBQztJQUVoRSxXQUFXO1FBQ1QsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsaUJBQWlCLENB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QUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsT0FBTyxFQUFFLENBQWEsSUFBSSxDQUFDLENBQUM7U0FDN0I7UUFDRCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ25FLElBQUksWUFBWSxFQUFFO1lBQ2hCLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLHNCQUFzQixDQUFDLEtBQXVCO1FBQ3BELE9BQU87WUFDTCxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsU0FBUztTQUN6RCxDQUFDO0lBQ0osQ0FBQzs7NEdBakdVLGVBQWU7Z0hBQWYsZUFBZSxjQUZkLE1BQU07MkZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRGFuZ2xJZGVudGl0eUNsaWVudCwgVG9rZW5SZXNwb25zZUdldCB9IGZyb20gXCIuLi9hcGktY2xpZW50XCI7XHJcbmltcG9ydCB7IEp3dFN0b3JhZ2UgfSBmcm9tIFwiLi4vbW9kZWxzL2p3dC1zdG9yYWdlXCI7XHJcbmltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUsIG9mLCBSZXBsYXlTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgbWFwLCBjYXRjaEVycm9yLCB0YXAsIGZpcnN0IH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uTWVzc2VuZ2VyIH0gZnJvbSBcIi4uL21lc3NlbmdlcnMvYXV0aGVudGljYXRpb24ubWVzc2VuZ2VyXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogXCJyb290XCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBKd3RUb2tlblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZV9pZGVudGlmaWVyID0gXCJkYW5nbF9pZGVudGl0eV9pbnRlZ3JhdGlvbl9qd3RfdG9rZW5cIjtcclxuICBwcml2YXRlIGlzUmVmcmVzaGluZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmVmcmVzaFRva2VuU291cmNlID0gbmV3IFN1YmplY3Q8Snd0U3RvcmFnZT4oKTtcclxuICBwcml2YXRlIHRva2VuU3RvcmVkU291cmNlID0gbmV3IFJlcGxheVN1YmplY3Q8Snd0U3RvcmFnZT4oMSk7XHJcbiAgdG9rZW5TdG9yZWQgPSB0aGlzLnRva2VuU3RvcmVkU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHByaXZhdGUgdG9rZW5SZWZyZXNoU3RhcnRlZFNvdXJjZSA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgdG9rZW5SZWZyZXNoU3RhcnRlZCA9IHRoaXMudG9rZW5SZWZyZXNoU3RhcnRlZFNvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICBwcml2YXRlIHRva2VuUmVmcmVzaEZpbmlzaGVkU291cmNlID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICB0b2tlblJlZnJlc2hGaW5pc2hlZCA9IHRoaXMudG9rZW5SZWZyZXNoRmluaXNoZWRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGFuZ2xJZGVudGl0eUNsaWVudDogRGFuZ2xJZGVudGl0eUNsaWVudCkge31cclxuXHJcbiAgZGVsZXRlVG9rZW4oKSB7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLnN0b3JhZ2VfaWRlbnRpZmllcik7XHJcbiAgICB0aGlzLnRva2VuU3RvcmVkU291cmNlLm5leHQobnVsbCk7XHJcbiAgfVxyXG5cclxuICBzdG9yZUN1c3RvbVRva2VuKHRva2VuVG9TdG9yZTogSnd0U3RvcmFnZSkge1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5zdG9yYWdlX2lkZW50aWZpZXIsIEpTT04uc3RyaW5naWZ5KHRva2VuVG9TdG9yZSkpO1xyXG4gICAgdGhpcy50b2tlblN0b3JlZFNvdXJjZS5uZXh0KHRva2VuVG9TdG9yZSk7XHJcbiAgfVxyXG5cclxuICBzdG9yZVRva2VuKHRva2VuOiBUb2tlblJlc3BvbnNlR2V0KSB7XHJcbiAgICBjb25zdCB0b2tlblRvU3RvcmUgPSB0aGlzLnRyYW5zZm9ybVRva2VuUmVzcG9uc2UodG9rZW4pO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5zdG9yYWdlX2lkZW50aWZpZXIsIEpTT04uc3RyaW5naWZ5KHRva2VuVG9TdG9yZSkpO1xyXG4gICAgdGhpcy50b2tlblN0b3JlZFNvdXJjZS5uZXh0KHRva2VuVG9TdG9yZSk7XHJcbiAgfVxyXG5cclxuICBnZXRUb2tlbkZyb21TdG9yYWdlKCk6IEp3dFN0b3JhZ2Uge1xyXG4gICAgY29uc3Qgc3RvcmVkU3RyaW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5zdG9yYWdlX2lkZW50aWZpZXIpO1xyXG4gICAgaWYgKHN0b3JlZFN0cmluZykge1xyXG4gICAgICBjb25zdCBzdG9yZWRUb2tlbiA9IDxKd3RTdG9yYWdlPkpTT04ucGFyc2Uoc3RvcmVkU3RyaW5nKTtcclxuICAgICAgcmV0dXJuIHN0b3JlZFRva2VuO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoVG9rZW4oKTogT2JzZXJ2YWJsZTxKd3RTdG9yYWdlPiB7XHJcbiAgICBpZiAodGhpcy5pc1JlZnJlc2hpbmcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuU291cmNlLnBpcGUoZmlyc3QoKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnRva2VuUmVmcmVzaFN0YXJ0ZWRTb3VyY2UubmV4dCgpO1xyXG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gdGhpcy5nZXRUb2tlbkZyb21TdG9yYWdlKCkucmVmcmVzaFRva2VuO1xyXG5cclxuICAgIGlmICghcmVmcmVzaFRva2VuKSB7XHJcbiAgICAgIHRoaXMuaXNSZWZyZXNoaW5nID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiBvZjxKd3RTdG9yYWdlPihudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhbmdsSWRlbnRpdHlDbGllbnRcclxuICAgICAgLnJlZnJlc2hUb2tlbih7XHJcbiAgICAgICAgcmVmcmVzaFRva2VuOiByZWZyZXNoVG9rZW4sXHJcbiAgICAgIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRhcCgocikgPT4gdGhpcy5zdG9yZVRva2VuKHIpKSxcclxuICAgICAgICBtYXAoKHIpID0+IHRoaXMudHJhbnNmb3JtVG9rZW5SZXNwb25zZShyKSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgIChyZWZyZXNoVG9rZW5SZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pc1JlZnJlc2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMudG9rZW5SZWZyZXNoRmluaXNoZWRTb3VyY2UubmV4dCh0cnVlKTtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuU291cmNlLm5leHQocmVmcmVzaFRva2VuUmVzcG9uc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzUmVmcmVzaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy50b2tlblJlZnJlc2hGaW5pc2hlZFNvdXJjZS5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuU291cmNlLm5leHQobnVsbCk7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgICBcIkludGVybmFsIGVycm9yIHdoaWxlIHJlZnJlc2hpbmcgRGFuZ2wuSWRlbnRpdHkgdG9rZW5cIixcclxuICAgICAgICAgICAgZXJyb3JcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnJlZnJlc2hUb2tlblNvdXJjZS5waXBlKGZpcnN0KCkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VG9rZW4oKTogT2JzZXJ2YWJsZTxKd3RTdG9yYWdlPiB7XHJcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0VG9rZW5Gcm9tU3RvcmFnZSgpO1xyXG4gICAgaWYgKCF0b2tlbikge1xyXG4gICAgICByZXR1cm4gb2Y8Snd0U3RvcmFnZT4obnVsbCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBpc1ZhbGlkVG9rZW4gPSB0b2tlbi5leHBpcmVzQXQgPiBuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDA7XHJcbiAgICBpZiAoaXNWYWxpZFRva2VuKSB7XHJcbiAgICAgIHJldHVybiBvZih0b2tlbik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5yZWZyZXNoVG9rZW4oKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdHJhbnNmb3JtVG9rZW5SZXNwb25zZSh0b2tlbjogVG9rZW5SZXNwb25zZUdldCk6IEp3dFN0b3JhZ2Uge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYWNjZXNzVG9rZW46IHRva2VuLmFjY2Vzc1Rva2VuLFxyXG4gICAgICByZWZyZXNoVG9rZW46IHRva2VuLnJlZnJlc2hUb2tlbixcclxuICAgICAgZXhwaXJlc0F0OiBuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDAgKyB0b2tlbi5leHBpcmVzSW4sXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXX0=