UNPKG

angular-simple-oidc

Version:

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

57 lines 12.1 kB
import { Injectable, Inject } from '@angular/core'; import { switchMap, take, map, withLatestFrom, tap } from 'rxjs/operators'; import { TokenEndpointClientService } from './token-endpoint-client.service'; import { RefreshTokenValidationService, TokenValidationService, TokenUrlService, TokenHelperService, } from 'angular-simple-oidc/core'; import { TokensValidatedEvent, TokensReadyEvent } from './auth.events'; import { TokenStorageService } from './token-storage.service'; import { AUTH_CONFIG_SERVICE } from './providers'; import { ConfigService } from 'angular-simple-oidc/config'; import { EventsService, SimpleOidcInfoEvent } from 'angular-simple-oidc/events'; export class RefreshTokenClient { constructor(config, tokenStorage, tokenUrl, tokenHelper, tokenEndpointClient, refreshTokenValidation, tokenValidation, events) { this.config = config; this.tokenStorage = tokenStorage; this.tokenUrl = tokenUrl; this.tokenHelper = tokenHelper; this.tokenEndpointClient = tokenEndpointClient; this.refreshTokenValidation = refreshTokenValidation; this.tokenValidation = tokenValidation; this.events = events; } requestTokenWithRefreshCode() { return this.tokenStorage.currentState$.pipe(withLatestFrom(this.config.current$), take(1), switchMap(([localState, config]) => { const payload = this.tokenUrl.createRefreshTokenRequestPayload({ clientId: config.clientId, clientSecret: config.clientSecret, refreshToken: localState.refreshToken }); this.events.dispatch(new SimpleOidcInfoEvent(`Refreshing token using refresh code`, { payload, refreshToken: localState.refreshToken })); return this.tokenEndpointClient.call(payload); }), withLatestFrom(this.tokenStorage.currentState$), tap(([result, localState]) => { const originalToken = this.tokenHelper.getPayloadFromToken(localState.originalIdentityToken); this.events.dispatch(new SimpleOidcInfoEvent(`Validating new Identity Token against original`, { result, originalToken })); this.refreshTokenValidation.validateIdToken(originalToken, result.decodedIdToken); }), tap(([result]) => { this.events.dispatch(new SimpleOidcInfoEvent(`Validating access token against at_hash`, { accessToken: result.accessToken, hash: result.decodedIdToken.at_hash })); this.tokenValidation.validateAccessToken(result.accessToken, result.decodedIdToken.at_hash); }), tap(([result]) => this.events.dispatch(new TokensValidatedEvent(result))), switchMap(([result]) => { this.events.dispatch(new SimpleOidcInfoEvent(`Storing new tokens..`, result)); return this.tokenStorage.storeTokens(result) .pipe(map(() => result)); }), tap((result) => this.events.dispatch(new TokensReadyEvent(result)))); } } RefreshTokenClient.decorators = [ { type: Injectable } ]; RefreshTokenClient.ctorParameters = () => [ { type: ConfigService, decorators: [{ type: Inject, args: [AUTH_CONFIG_SERVICE,] }] }, { type: TokenStorageService }, { type: TokenUrlService }, { type: TokenHelperService }, { type: TokenEndpointClientService }, { type: RefreshTokenValidationService }, { type: TokenValidationService }, { type: EventsService } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmcmVzaC10b2tlbi1jbGllbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItc2ltcGxlLW9pZGMvc3JjL2xpYi9yZWZyZXNoLXRva2VuLWNsaWVudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0UsT0FBTyxFQUNILDZCQUE2QixFQUM3QixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLGtCQUFrQixHQUVyQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTNELE9BQU8sRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUdoRixNQUFNLE9BQU8sa0JBQWtCO0lBRTNCLFlBRXVCLE1BQWlDLEVBQ2pDLFlBQWlDLEVBQ2pDLFFBQXlCLEVBQ3pCLFdBQStCLEVBQy9CLG1CQUErQyxFQUMvQyxzQkFBcUQsRUFDckQsZUFBdUMsRUFDdkMsTUFBcUI7UUFQckIsV0FBTSxHQUFOLE1BQU0sQ0FBMkI7UUFDakMsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLGFBQVEsR0FBUixRQUFRLENBQWlCO1FB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LENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQ3RFLENBQUM7SUFDTixDQUFDOzs7WUFyREosVUFBVTs7O1lBSkYsYUFBYSx1QkFRYixNQUFNLFNBQUMsbUJBQW1CO1lBWDFCLG1CQUFtQjtZQUx4QixlQUFlO1lBQ2Ysa0JBQWtCO1lBTGIsMEJBQTBCO1lBRS9CLDZCQUE2QjtZQUM3QixzQkFBc0I7WUFXakIsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YWtlLCBtYXAsIHdpdGhMYXRlc3RGcm9tLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUb2tlbkVuZHBvaW50Q2xpZW50U2VydmljZSB9IGZyb20gJy4vdG9rZW4tZW5kcG9pbnQtY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgICBSZWZyZXNoVG9rZW5WYWxpZGF0aW9uU2VydmljZSxcbiAgICBUb2tlblZhbGlkYXRpb25TZXJ2aWNlLFxuICAgIFRva2VuVXJsU2VydmljZSxcbiAgICBUb2tlbkhlbHBlclNlcnZpY2UsXG4gICAgVG9rZW5SZXF1ZXN0UmVzdWx0LFxufSBmcm9tICdhbmd1bGFyLXNpbXBsZS1vaWRjL2NvcmUnO1xuaW1wb3J0IHsgVG9rZW5zVmFsaWRhdGVkRXZlbnQsIFRva2Vuc1JlYWR5RXZlbnQgfSBmcm9tICcuL2F1dGguZXZlbnRzJztcbmltcG9ydCB7IFRva2VuU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL3Rva2VuLXN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBVVRIX0NPTkZJR19TRVJWSUNFIH0gZnJvbSAnLi9wcm92aWRlcnMnO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJ2FuZ3VsYXItc2ltcGxlLW9pZGMvY29uZmlnJztcbmltcG9ydCB7IEF1dGhDb25maWcgfSBmcm9tICcuL2NvbmZpZy9tb2RlbHMnO1xuaW1wb3J0IHsgRXZlbnRzU2VydmljZSwgU2ltcGxlT2lkY0luZm9FdmVudCB9IGZyb20gJ2FuZ3VsYXItc2ltcGxlLW9pZGMvZXZlbnRzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlZnJlc2hUb2tlbkNsaWVudCB7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChBVVRIX0NPTkZJR19TRVJWSUNFKVxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29uZmlnOiBDb25maWdTZXJ2aWNlPEF1dGhDb25maWc+LFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG9rZW5TdG9yYWdlOiBUb2tlblN0b3JhZ2VTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG9rZW5Vcmw6IFRva2VuVXJsU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IHRva2VuSGVscGVyOiBUb2tlbkhlbHBlclNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSB0b2tlbkVuZHBvaW50Q2xpZW50OiBUb2tlbkVuZHBvaW50Q2xpZW50U2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlZnJlc2hUb2tlblZhbGlkYXRpb246IFJlZnJlc2hUb2tlblZhbGlkYXRpb25TZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG9rZW5WYWxpZGF0aW9uOiBUb2tlblZhbGlkYXRpb25TZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXZlbnRzOiBFdmVudHNTZXJ2aWNlLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgcmVxdWVzdFRva2VuV2l0aFJlZnJlc2hDb2RlKCk6IE9ic2VydmFibGU8VG9rZW5SZXF1ZXN0UmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2VuU3RvcmFnZS5jdXJyZW50U3RhdGUkLnBpcGUoXG4gICAgICAgICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLmNvbmZpZy5jdXJyZW50JCksXG4gICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKChbbG9jYWxTdGF0ZSwgY29uZmlnXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLnRva2VuVXJsLmNyZWF0ZVJlZnJlc2hUb2tlblJlcXVlc3RQYXlsb2FkKHtcbiAgICAgICAgICAgICAgICAgICAgY2xpZW50SWQ6IGNvbmZpZy5jbGllbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgY2xpZW50U2VjcmV0OiBjb25maWcuY2xpZW50U2VjcmV0LFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoVG9rZW46IGxvY2FsU3RhdGUucmVmcmVzaFRva2VuXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5kaXNwYXRjaChuZXcgU2ltcGxlT2lkY0luZm9FdmVudChgUmVmcmVzaGluZyB0b2tlbiB1c2luZyByZWZyZXNoIGNvZGVgLFxuICAgICAgICAgICAgICAgICAgICB7IHBheWxvYWQsIHJlZnJlc2hUb2tlbjogbG9jYWxTdGF0ZS5yZWZyZXNoVG9rZW4gfSkpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5FbmRwb2ludENsaWVudC5jYWxsKHBheWxvYWQpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLnRva2VuU3RvcmFnZS5jdXJyZW50U3RhdGUkKSxcbiAgICAgICAgICAgIHRhcCgoW3Jlc3VsdCwgbG9jYWxTdGF0ZV0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFRva2VuID0gdGhpcy50b2tlbkhlbHBlci5nZXRQYXlsb2FkRnJvbVRva2VuKGxvY2FsU3RhdGUub3JpZ2luYWxJZGVudGl0eVRva2VuKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzLmRpc3BhdGNoKG5ldyBTaW1wbGVPaWRjSW5mb0V2ZW50KGBWYWxpZGF0aW5nIG5ldyBJZGVudGl0eSBUb2tlbiBhZ2FpbnN0IG9yaWdpbmFsYCxcbiAgICAgICAgICAgICAgICAgICAgeyByZXN1bHQsIG9yaWdpbmFsVG9rZW4gfSkpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5WYWxpZGF0aW9uLnZhbGlkYXRlSWRUb2tlbihvcmlnaW5hbFRva2VuLCByZXN1bHQuZGVjb2RlZElkVG9rZW4pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0YXAoKFtyZXN1bHRdKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudHMuZGlzcGF0Y2gobmV3IFNpbXBsZU9pZGNJbmZvRXZlbnQoYFZhbGlkYXRpbmcgYWNjZXNzIHRva2VuIGFnYWluc3QgYXRfaGFzaGAsXG4gICAgICAgICAgICAgICAgICAgIHsgYWNjZXNzVG9rZW46IHJlc3VsdC5hY2Nlc3NUb2tlbiwgaGFzaDogcmVzdWx0LmRlY29kZWRJZFRva2VuLmF0X2hhc2ggfSkpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9rZW5WYWxpZGF0aW9uLnZhbGlkYXRlQWNjZXNzVG9rZW4ocmVzdWx0LmFjY2Vzc1Rva2VuLCByZXN1bHQuZGVjb2RlZElkVG9rZW4uYXRfaGFzaCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRhcCgoW3Jlc3VsdF0pID0+IHRoaXMuZXZlbnRzLmRpc3BhdGNoKG5ldyBUb2tlbnNWYWxpZGF0ZWRFdmVudChyZXN1bHQpKSksXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKFtyZXN1bHRdKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudHMuZGlzcGF0Y2gobmV3IFNpbXBsZU9pZGNJbmZvRXZlbnQoYFN0b3JpbmcgbmV3IHRva2Vucy4uYCwgcmVzdWx0KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5TdG9yYWdlLnN0b3JlVG9rZW5zKHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUobWFwKCgpID0+IHJlc3VsdCkpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0YXAoKHJlc3VsdCkgPT4gdGhpcy5ldmVudHMuZGlzcGF0Y2gobmV3IFRva2Vuc1JlYWR5RXZlbnQocmVzdWx0KSkpLFxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==