angular-simple-oidc
Version:
Angular Library implementing Open Id Connect specification. Code Flow, Refresh Tokens, Session Management, Discovery Document.
53 lines • 9.39 kB
JavaScript
import { Injectable } from '@angular/core';
import { Subject, of } from 'rxjs';
import { switchMap, takeUntil, tap, catchError, take, map } from 'rxjs/operators';
import { SessionChangedEvent, SessionTerminatedEvent } from './events';
import { TokenStorageService } from '../token-storage.service';
import { filterInstanceOf } from 'angular-simple-oidc/operators';
import { AuthorizeEndpointSilentClientService } from './authorize-endpoint-silent-client.service';
import { EventsService, SimpleOidcInfoEvent } from 'angular-simple-oidc/events';
export class SilentFlowDaemonService {
constructor(events, authorizeSilentClient, tokenStorage) {
this.events = events;
this.authorizeSilentClient = authorizeSilentClient;
this.tokenStorage = tokenStorage;
this.destroyedSubject = new Subject();
}
startDaemon() {
// When the RP detects a session state change,
// it SHOULD first try a prompt=none request within an iframe to obtain
// a new ID Token and session state, sending the old ID Token as the id_token_hint.
// If the RP receives an ID token for the same End-User, it SHOULD simply update
// the value of the session state. If it doesn't receive an ID token or receives
// an ID token for another End-User, then it needs to handle this case as a
// logout for the original End-User.
const silentCodeFlow$ = this.tokenStorage.currentState$
.pipe(take(1), switchMap((previousState) => this.authorizeSilentClient.startCodeFlowInIframe()
.pipe(map(result => ({ result, previousState })))), tap(({ result, previousState }) => {
const newToken = result.decodedIdToken;
const previousToken = previousState.decodedIdentityToken;
if (previousToken && newToken.sub !== previousToken.sub) {
this.events.dispatch(new SessionTerminatedEvent({ previousToken, newToken }));
}
}), catchError((error) => {
this.events.dispatch(new SessionTerminatedEvent({ error: error.context }));
return of(null);
}));
this.events.events$
.pipe(filterInstanceOf(SessionChangedEvent), tap(() => this.events.dispatch(new SimpleOidcInfoEvent('Session has changed. Starting silent code flow.'))), switchMap(() => silentCodeFlow$), takeUntil(this.destroyedSubject))
.subscribe();
}
ngOnDestroy() {
this.destroyedSubject.next();
this.destroyedSubject.complete();
}
}
SilentFlowDaemonService.decorators = [
{ type: Injectable }
];
SilentFlowDaemonService.ctorParameters = () => [
{ type: EventsService },
{ type: AuthorizeEndpointSilentClientService },
{ type: TokenStorageService }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lsZW50LWZsb3ctZGFlbW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXNpbXBsZS1vaWRjL3NyYy9saWIvc2Vzc2lvbi1tYW5hZ2VtZW50L3NpbGVudC1mbG93LWRhZW1vbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUdoRixNQUFNLE9BQU8sdUJBQXVCO0lBR2xDLFlBQ3FCLE1BQXFCLEVBQ3JCLHFCQUEyRCxFQUMzRCxZQUFpQztRQUZqQyxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBc0M7UUFDM0QsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBTG5DLHFCQUFnQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFPcEQsQ0FBQztJQUVNLFdBQVc7UUFDaEIsOENBQThDO1FBQzlDLHVFQUF1RTtRQUN2RSxtRkFBbUY7UUFDbkYsZ0ZBQWdGO1FBQ2hGLGdGQUFnRjtRQUNoRiwyRUFBMkU7UUFDM0Usb0NBQW9DO1FBQ3BDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYTthQUNwRCxJQUFJLENBQ0gsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUNQLFNBQVMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLHFCQUFxQixFQUFFO2FBQzVFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUNsRCxFQUNELEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUU7WUFDaEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztZQUN2QyxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsb0JBQW9CLENBQUM7WUFDekQsSUFBSSxhQUFhLElBQUksUUFBUSxDQUFDLEdBQUcsS0FBSyxhQUFhLENBQUMsR0FBRyxFQUFFO2dCQUN2RCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLHNCQUFzQixDQUFDLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUMvRTtRQUNILENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxDQUFDLEtBQXNCLEVBQUUsRUFBRTtZQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLHNCQUFzQixDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0UsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVKLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTzthQUNoQixJQUFJLENBQ0gsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsRUFDckMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksbUJBQW1CLENBQUMsaURBQWlELENBQUMsQ0FBQyxDQUFDLEVBQzNHLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFDaEMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUNqQzthQUNBLFNBQVMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbkMsQ0FBQzs7O1lBbkRGLFVBQVU7OztZQUZGLGFBQWE7WUFEYixvQ0FBb0M7WUFIcEMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgIE9uRGVzdHJveSwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXAsIGNhdGNoRXJyb3IsIHRha2UsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFNlc3Npb25DaGFuZ2VkRXZlbnQsIFNlc3Npb25UZXJtaW5hdGVkRXZlbnQgfSBmcm9tICcuL2V2ZW50cyc7XG5pbXBvcnQgeyBUb2tlblN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vdG9rZW4tc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFNpbXBsZU9pZGNFcnJvciB9IGZyb20gJ2FuZ3VsYXItc2ltcGxlLW9pZGMvY29yZSc7XG5pbXBvcnQgeyBmaWx0ZXJJbnN0YW5jZU9mIH0gZnJvbSAnYW5ndWxhci1zaW1wbGUtb2lkYy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQXV0aG9yaXplRW5kcG9pbnRTaWxlbnRDbGllbnRTZXJ2aWNlIH0gZnJvbSAnLi9hdXRob3JpemUtZW5kcG9pbnQtc2lsZW50LWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50c1NlcnZpY2UsIFNpbXBsZU9pZGNJbmZvRXZlbnQgfSBmcm9tICdhbmd1bGFyLXNpbXBsZS1vaWRjL2V2ZW50cyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTaWxlbnRGbG93RGFlbW9uU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZXN0cm95ZWRTdWJqZWN0ID0gbmV3IFN1YmplY3QoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXZlbnRzOiBFdmVudHNTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBhdXRob3JpemVTaWxlbnRDbGllbnQ6IEF1dGhvcml6ZUVuZHBvaW50U2lsZW50Q2xpZW50U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG9rZW5TdG9yYWdlOiBUb2tlblN0b3JhZ2VTZXJ2aWNlLFxuICApIHtcbiAgfVxuXG4gIHB1YmxpYyBzdGFydERhZW1vbigpOiB2b2lkIHtcbiAgICAvLyBXaGVuIHRoZSBSUCBkZXRlY3RzIGEgc2Vzc2lvbiBzdGF0ZSBjaGFuZ2UsXG4gICAgLy8gaXQgU0hPVUxEIGZpcnN0IHRyeSBhIHByb21wdD1ub25lIHJlcXVlc3Qgd2l0aGluIGFuIGlmcmFtZSB0byBvYnRhaW5cbiAgICAvLyBhIG5ldyBJRCBUb2tlbiBhbmQgc2Vzc2lvbiBzdGF0ZSwgc2VuZGluZyB0aGUgb2xkIElEIFRva2VuIGFzIHRoZSBpZF90b2tlbl9oaW50LlxuICAgIC8vIElmIHRoZSBSUCByZWNlaXZlcyBhbiBJRCB0b2tlbiBmb3IgdGhlIHNhbWUgRW5kLVVzZXIsIGl0IFNIT1VMRCBzaW1wbHkgdXBkYXRlXG4gICAgLy8gdGhlIHZhbHVlIG9mIHRoZSBzZXNzaW9uIHN0YXRlLiBJZiBpdCBkb2Vzbid0IHJlY2VpdmUgYW4gSUQgdG9rZW4gb3IgcmVjZWl2ZXNcbiAgICAvLyBhbiBJRCB0b2tlbiBmb3IgYW5vdGhlciBFbmQtVXNlciwgdGhlbiBpdCBuZWVkcyB0byBoYW5kbGUgdGhpcyBjYXNlIGFzIGFcbiAgICAvLyBsb2dvdXQgZm9yIHRoZSBvcmlnaW5hbCBFbmQtVXNlci5cbiAgICBjb25zdCBzaWxlbnRDb2RlRmxvdyQgPSB0aGlzLnRva2VuU3RvcmFnZS5jdXJyZW50U3RhdGUkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKChwcmV2aW91c1N0YXRlKSA9PiB0aGlzLmF1dGhvcml6ZVNpbGVudENsaWVudC5zdGFydENvZGVGbG93SW5JZnJhbWUoKVxuICAgICAgICAgIC5waXBlKG1hcChyZXN1bHQgPT4gKHsgcmVzdWx0LCBwcmV2aW91c1N0YXRlIH0pKSlcbiAgICAgICAgKSxcbiAgICAgICAgdGFwKCh7IHJlc3VsdCwgcHJldmlvdXNTdGF0ZSB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3VG9rZW4gPSByZXN1bHQuZGVjb2RlZElkVG9rZW47XG4gICAgICAgICAgY29uc3QgcHJldmlvdXNUb2tlbiA9IHByZXZpb3VzU3RhdGUuZGVjb2RlZElkZW50aXR5VG9rZW47XG4gICAgICAgICAgaWYgKHByZXZpb3VzVG9rZW4gJiYgbmV3VG9rZW4uc3ViICE9PSBwcmV2aW91c1Rva2VuLnN1Yikge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuZGlzcGF0Y2gobmV3IFNlc3Npb25UZXJtaW5hdGVkRXZlbnQoeyBwcmV2aW91c1Rva2VuLCBuZXdUb2tlbiB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IFNpbXBsZU9pZGNFcnJvcikgPT4ge1xuICAgICAgICAgIHRoaXMuZXZlbnRzLmRpc3BhdGNoKG5ldyBTZXNzaW9uVGVybWluYXRlZEV2ZW50KHsgZXJyb3I6IGVycm9yLmNvbnRleHQgfSkpO1xuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICB0aGlzLmV2ZW50cy5ldmVudHMkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVySW5zdGFuY2VPZihTZXNzaW9uQ2hhbmdlZEV2ZW50KSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuZXZlbnRzLmRpc3BhdGNoKG5ldyBTaW1wbGVPaWRjSW5mb0V2ZW50KCdTZXNzaW9uIGhhcyBjaGFuZ2VkLiBTdGFydGluZyBzaWxlbnQgY29kZSBmbG93LicpKSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiBzaWxlbnRDb2RlRmxvdyQpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWRTdWJqZWN0KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveWVkU3ViamVjdC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95ZWRTdWJqZWN0LmNvbXBsZXRlKCk7XG4gIH1cbn1cbiJdfQ==