angular-simple-oidc
Version:
Angular Library implementing Open Id Connect specification. Code Flow, Refresh Tokens, Session Management, Discovery Document.
57 lines • 12.1 kB
JavaScript
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==