UNPKG

angular-simple-oidc

Version:

Angular Library implementing Open Id Connect specification. Code Flow, Refresh Tokens, Session Management, Discovery Document.

64 lines 9.05 kB
import { Injectable } from '@angular/core'; import { merge, of, Subject } from 'rxjs'; import { takeUntil, switchMap, delay } from 'rxjs/operators'; import { AuthService } from '../auth.service'; import { AccessTokenExpiredEvent, AccessTokenExpiringEvent, TokensReadyEvent, } from '../auth.events'; import { filterInstanceOf } from 'angular-simple-oidc/operators'; import { EventsService, SimpleOidcInfoEvent } from 'angular-simple-oidc/events'; export class TokenExpirationDaemonService { constructor(auth, events) { this.auth = auth; this.events = events; this.destroyedSubject = new Subject(); } startDaemon() { this.watchTokenExpiration(); } /** * Sets timeouts based on the token expiration. * Dispatches AccessTokenExpiringEvent before the access token expires (grace period) * Dispatches AccessTokenExpiredEvent when the access token expires. */ watchTokenExpiration() { this.auth.events$ .pipe(filterInstanceOf(TokensReadyEvent), switchMap(({ payload }) => { if (payload.accessToken && payload.accessTokenExpiresAt) { const expiration = new Date(payload.accessTokenExpiresAt); // TODO: Expose as config? const gracePeriod = 60; const beforeExpiration = new Date(payload.accessTokenExpiresAt); beforeExpiration.setSeconds(beforeExpiration.getSeconds() - gracePeriod); const expiring$ = of(new AccessTokenExpiringEvent({ token: payload.accessToken, expiresAt: expiration, })).pipe(delay(beforeExpiration)); const expired$ = of(new AccessTokenExpiredEvent({ token: payload.accessToken, expiredAt: expiration, })).pipe(delay(expiration)); return merge(expiring$, expired$); } else { return of(new SimpleOidcInfoEvent('TokenExpired event not configured due to access token or expiration empty.')); } }), takeUntil(this.destroyedSubject)) .subscribe((e) => { if (e.payload) { e.payload.now = new Date(); } this.events.dispatch(e); }); } ngOnDestroy() { this.destroyedSubject.next(); this.destroyedSubject.complete(); } } TokenExpirationDaemonService.decorators = [ { type: Injectable } ]; TokenExpirationDaemonService.ctorParameters = () => [ { type: AuthService }, { type: EventsService } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tZXhwaXJhdGlvbi1kYWVtb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItc2ltcGxlLW9pZGMvc3JjL2xpYi9kYWVtb25zL3Rva2VuLWV4cGlyYXRpb24tZGFlbW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsd0JBQXdCLEVBQ3hCLGdCQUFnQixHQUNqQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUdoRixNQUFNLE9BQU8sNEJBQTRCO0lBR3ZDLFlBQ3FCLElBQWlCLEVBQ2pCLE1BQXFCO1FBRHJCLFNBQUksR0FBSixJQUFJLENBQWE7UUFDakIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUp2QixxQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBS2pELENBQUM7SUFFRyxXQUFXO1FBQ2hCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksb0JBQW9CO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTzthQUNkLElBQUksQ0FDSCxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUNsQyxTQUFTLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7WUFDeEIsSUFBSSxPQUFPLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRTtnQkFDdkQsTUFBTSxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBRTFELDBCQUEwQjtnQkFDMUIsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO2dCQUN2QixNQUFNLGdCQUFnQixHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUNoRSxnQkFBZ0IsQ0FBQyxVQUFVLENBQ3pCLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxHQUFHLFdBQVcsQ0FDNUMsQ0FBQztnQkFFRixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQ2xCLElBQUksd0JBQXdCLENBQUM7b0JBQzNCLEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVztvQkFDMUIsU0FBUyxFQUFFLFVBQVU7aUJBQ3RCLENBQUMsQ0FDSCxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2dCQUVoQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQ2pCLElBQUksdUJBQXVCLENBQUM7b0JBQzFCLEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVztvQkFDMUIsU0FBUyxFQUFFLFVBQVU7aUJBQ3RCLENBQUMsQ0FDSCxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFFMUIsT0FBTyxLQUFLLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ25DO2lCQUFNO2dCQUNMLE9BQU8sRUFBRSxDQUNQLElBQUksbUJBQW1CLENBQ3JCLDRFQUE0RSxDQUM3RSxDQUNGLENBQUM7YUFDSDtRQUNILENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FDakM7YUFDQSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNmLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRTtnQkFDYixDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO2FBQzVCO1lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ25DLENBQUM7OztZQXRFRixVQUFVOzs7WUFURixXQUFXO1lBT1gsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgbWVyZ2UsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwsIHN3aXRjaE1hcCwgZGVsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uL2F1dGguc2VydmljZSc7XG5pbXBvcnQge1xuICBBY2Nlc3NUb2tlbkV4cGlyZWRFdmVudCxcbiAgQWNjZXNzVG9rZW5FeHBpcmluZ0V2ZW50LFxuICBUb2tlbnNSZWFkeUV2ZW50LFxufSBmcm9tICcuLi9hdXRoLmV2ZW50cyc7XG5pbXBvcnQgeyBmaWx0ZXJJbnN0YW5jZU9mIH0gZnJvbSAnYW5ndWxhci1zaW1wbGUtb2lkYy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRXZlbnRzU2VydmljZSwgU2ltcGxlT2lkY0luZm9FdmVudCB9IGZyb20gJ2FuZ3VsYXItc2ltcGxlLW9pZGMvZXZlbnRzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRva2VuRXhwaXJhdGlvbkRhZW1vblNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVzdHJveWVkU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGF1dGg6IEF1dGhTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBldmVudHM6IEV2ZW50c1NlcnZpY2VcbiAgKSB7fVxuXG4gIHB1YmxpYyBzdGFydERhZW1vbigpOiB2b2lkIHtcbiAgICB0aGlzLndhdGNoVG9rZW5FeHBpcmF0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aW1lb3V0cyBiYXNlZCBvbiB0aGUgdG9rZW4gZXhwaXJhdGlvbi5cbiAgICogRGlzcGF0Y2hlcyBBY2Nlc3NUb2tlbkV4cGlyaW5nRXZlbnQgYmVmb3JlIHRoZSBhY2Nlc3MgdG9rZW4gZXhwaXJlcyAoZ3JhY2UgcGVyaW9kKVxuICAgKiBEaXNwYXRjaGVzIEFjY2Vzc1Rva2VuRXhwaXJlZEV2ZW50IHdoZW4gdGhlIGFjY2VzcyB0b2tlbiBleHBpcmVzLlxuICAgKi9cbiAgcHVibGljIHdhdGNoVG9rZW5FeHBpcmF0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuYXV0aC5ldmVudHMkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVySW5zdGFuY2VPZihUb2tlbnNSZWFkeUV2ZW50KSxcbiAgICAgICAgc3dpdGNoTWFwKCh7IHBheWxvYWQgfSkgPT4ge1xuICAgICAgICAgIGlmIChwYXlsb2FkLmFjY2Vzc1Rva2VuICYmIHBheWxvYWQuYWNjZXNzVG9rZW5FeHBpcmVzQXQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGlyYXRpb24gPSBuZXcgRGF0ZShwYXlsb2FkLmFjY2Vzc1Rva2VuRXhwaXJlc0F0KTtcblxuICAgICAgICAgICAgLy8gVE9ETzogRXhwb3NlIGFzIGNvbmZpZz9cbiAgICAgICAgICAgIGNvbnN0IGdyYWNlUGVyaW9kID0gNjA7XG4gICAgICAgICAgICBjb25zdCBiZWZvcmVFeHBpcmF0aW9uID0gbmV3IERhdGUocGF5bG9hZC5hY2Nlc3NUb2tlbkV4cGlyZXNBdCk7XG4gICAgICAgICAgICBiZWZvcmVFeHBpcmF0aW9uLnNldFNlY29uZHMoXG4gICAgICAgICAgICAgIGJlZm9yZUV4cGlyYXRpb24uZ2V0U2Vjb25kcygpIC0gZ3JhY2VQZXJpb2RcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IGV4cGlyaW5nJCA9IG9mKFxuICAgICAgICAgICAgICBuZXcgQWNjZXNzVG9rZW5FeHBpcmluZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICB0b2tlbjogcGF5bG9hZC5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgICAgICBleHBpcmVzQXQ6IGV4cGlyYXRpb24sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLnBpcGUoZGVsYXkoYmVmb3JlRXhwaXJhdGlvbikpO1xuXG4gICAgICAgICAgICBjb25zdCBleHBpcmVkJCA9IG9mKFxuICAgICAgICAgICAgICBuZXcgQWNjZXNzVG9rZW5FeHBpcmVkRXZlbnQoe1xuICAgICAgICAgICAgICAgIHRva2VuOiBwYXlsb2FkLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgICAgIGV4cGlyZWRBdDogZXhwaXJhdGlvbixcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkucGlwZShkZWxheShleHBpcmF0aW9uKSk7XG5cbiAgICAgICAgICAgIHJldHVybiBtZXJnZShleHBpcmluZyQsIGV4cGlyZWQkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9mKFxuICAgICAgICAgICAgICBuZXcgU2ltcGxlT2lkY0luZm9FdmVudChcbiAgICAgICAgICAgICAgICAnVG9rZW5FeHBpcmVkIGV2ZW50IG5vdCBjb25maWd1cmVkIGR1ZSB0byBhY2Nlc3MgdG9rZW4gb3IgZXhwaXJhdGlvbiBlbXB0eS4nXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkU3ViamVjdClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgICAgaWYgKGUucGF5bG9hZCkge1xuICAgICAgICAgIGUucGF5bG9hZC5ub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudHMuZGlzcGF0Y2goZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZFN1YmplY3QubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveWVkU3ViamVjdC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=