UNPKG

@spartacus/cdc

Version:

Customer Data Cloud Integration library for Spartacus

98 lines 14.7 kB
import { Injectable } from '@angular/core'; import { TokenTarget } from '@spartacus/asm/root'; import { AuthActions, GlobalMessageType, OCC_USER_ID_CURRENT, } from '@spartacus/core'; import { combineLatest, of } from 'rxjs'; import { map, take, tap } from 'rxjs/operators'; import { CdcAuthActions } from '../store/actions/index'; import * as i0 from "@angular/core"; import * as i1 from "@ngrx/store"; import * as i2 from "@spartacus/core"; /** * Service to support custom CDC OAuth flow. */ export class CdcAuthService { constructor(store, authStorageService, userIdService, globalMessageService, authRedirectService) { this.store = store; this.authStorageService = authStorageService; this.userIdService = userIdService; this.globalMessageService = globalMessageService; this.authRedirectService = authRedirectService; } /** * Loads a new user token using custom oauth flow * * @param UID * @param UIDSignature * @param signatureTimestamp * @param idToken * @param baseSite */ loginWithCustomCdcFlow(UID, UIDSignature, signatureTimestamp, idToken, baseSite) { this.store.dispatch(new CdcAuthActions.LoadCdcUserToken({ UID: UID, UIDSignature: UIDSignature, signatureTimestamp: signatureTimestamp, idToken: idToken, baseSite: baseSite, })); } /** * Utility to differentiate between AuthStorageService and AsmAuthStorageService */ isAsmAuthStorageService(service) { return 'getTokenTarget' in service; } /** * Transform and store the token received from custom flow to library format and login user. * * @param token */ loginWithToken(token) { let stream$ = of(true); if (this.isAsmAuthStorageService(this.authStorageService)) { stream$ = combineLatest([ this.authStorageService.getToken(), this.authStorageService.getTokenTarget(), ]).pipe(take(1), map(([currentToken, tokenTarget]) => { return (!!(currentToken === null || currentToken === void 0 ? void 0 : currentToken.access_token) && tokenTarget === TokenTarget.CSAgent); }), tap((isAsmAgentLoggedIn) => { if (isAsmAgentLoggedIn) { this.globalMessageService.add({ key: 'asm.auth.agentLoggedInError', }, GlobalMessageType.MSG_TYPE_ERROR); } }), map((isAsmAgentLoggedIn) => !isAsmAgentLoggedIn)); } stream$.pipe(take(1)).subscribe((canLogin) => { if (canLogin) { // Code mostly based on auth lib we use and the way it handles token properties this.authStorageService.setItem('access_token', token.access_token); if (token.granted_scopes && Array.isArray(token.granted_scopes)) { this.authStorageService.setItem('granted_scopes', JSON.stringify(token.granted_scopes)); } this.authStorageService.setItem('access_token_stored_at', '' + Date.now()); if (token.expires_in) { const expiresInMilliseconds = token.expires_in * 1000; const now = new Date(); const expiresAt = now.getTime() + expiresInMilliseconds; this.authStorageService.setItem('expires_at', '' + expiresAt); } if (token.refresh_token) { this.authStorageService.setItem('refresh_token', token.refresh_token); } // OCC specific code this.userIdService.setUserId(OCC_USER_ID_CURRENT); this.store.dispatch(new AuthActions.Login()); // Remove any global errors and redirect user on successful login this.globalMessageService.remove(GlobalMessageType.MSG_TYPE_ERROR); this.authRedirectService.redirect(); } }); } } CdcAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CdcAuthService, deps: [{ token: i1.Store }, { token: i2.AuthStorageService }, { token: i2.UserIdService }, { token: i2.GlobalMessageService }, { token: i2.AuthRedirectService }], target: i0.ɵɵFactoryTarget.Injectable }); CdcAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CdcAuthService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CdcAuthService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.Store }, { type: i2.AuthStorageService }, { type: i2.UserIdService }, { type: i2.GlobalMessageService }, { type: i2.AuthRedirectService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RjLWF1dGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2ludGVncmF0aW9uLWxpYnMvY2RjL2NvcmUvYXV0aC9mYWNhZGUvY2RjLWF1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBeUIsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekUsT0FBTyxFQUNMLFdBQVcsRUFLWCxpQkFBaUIsRUFDakIsbUJBQW1CLEdBRXBCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7O0FBR3hEOztHQUVHO0FBRUgsTUFBTSxPQUFPLGNBQWM7SUFDekIsWUFDWSxLQUFZLEVBQ1osa0JBQXNDLEVBQ3RDLGFBQTRCLEVBQzVCLG9CQUEwQyxFQUMxQyxtQkFBd0M7UUFKeEMsVUFBSyxHQUFMLEtBQUssQ0FBTztRQUNaLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO0lBQ2pELENBQUM7SUFFSjs7Ozs7Ozs7T0FRRztJQUNILHNCQUFzQixDQUNwQixHQUFXLEVBQ1gsWUFBb0IsRUFDcEIsa0JBQTBCLEVBQzFCLE9BQWUsRUFDZixRQUFnQjtRQUVoQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FDakIsSUFBSSxjQUFjLENBQUMsZ0JBQWdCLENBQUM7WUFDbEMsR0FB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LG9CQUFvQjtnQkFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFFbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFFN0MsaUVBQWlFO2dCQUNqRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDckM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OzJHQW5IVSxjQUFjOytHQUFkLGNBQWM7MkZBQWQsY0FBYztrQkFEMUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHsgQXNtQXV0aFN0b3JhZ2VTZXJ2aWNlLCBUb2tlblRhcmdldCB9IGZyb20gJ0BzcGFydGFjdXMvYXNtL3Jvb3QnO1xuaW1wb3J0IHtcbiAgQXV0aEFjdGlvbnMsXG4gIEF1dGhSZWRpcmVjdFNlcnZpY2UsXG4gIEF1dGhTdG9yYWdlU2VydmljZSxcbiAgQXV0aFRva2VuLFxuICBHbG9iYWxNZXNzYWdlU2VydmljZSxcbiAgR2xvYmFsTWVzc2FnZVR5cGUsXG4gIE9DQ19VU0VSX0lEX0NVUlJFTlQsXG4gIFVzZXJJZFNlcnZpY2UsXG59IGZyb20gJ0BzcGFydGFjdXMvY29yZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDZGNBdXRoQWN0aW9ucyB9IGZyb20gJy4uL3N0b3JlL2FjdGlvbnMvaW5kZXgnO1xuaW1wb3J0IHsgQ2RjQXV0aEZhY2FkZSB9IGZyb20gJ0BzcGFydGFjdXMvY2RjL3Jvb3QnO1xuXG4vKipcbiAqIFNlcnZpY2UgdG8gc3VwcG9ydCBjdXN0b20gQ0RDIE9BdXRoIGZsb3cuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDZGNBdXRoU2VydmljZSBpbXBsZW1lbnRzIENkY0F1dGhGYWNhZGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgc3RvcmU6IFN0b3JlLFxuICAgIHByb3RlY3RlZCBhdXRoU3RvcmFnZVNlcnZpY2U6IEF1dGhTdG9yYWdlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdXNlcklkU2VydmljZTogVXNlcklkU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgZ2xvYmFsTWVzc2FnZVNlcnZpY2U6IEdsb2JhbE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBhdXRoUmVkaXJlY3RTZXJ2aWNlOiBBdXRoUmVkaXJlY3RTZXJ2aWNlXG4gICkge31cblxuICAvKipcbiAgICogTG9hZHMgYSBuZXcgdXNlciB0b2tlbiB1c2luZyBjdXN0b20gb2F1dGggZmxvd1xuICAgKlxuICAgKiBAcGFyYW0gVUlEXG4gICAqIEBwYXJhbSBVSURTaWduYXR1cmVcbiAgICogQHBhcmFtIHNpZ25hdHVyZVRpbWVzdGFtcFxuICAgKiBAcGFyYW0gaWRUb2tlblxuICAgKiBAcGFyYW0gYmFzZVNpdGVcbiAgICovXG4gIGxvZ2luV2l0aEN1c3RvbUNkY0Zsb3coXG4gICAgVUlEOiBzdHJpbmcsXG4gICAgVUlEU2lnbmF0dXJlOiBzdHJpbmcsXG4gICAgc2lnbmF0dXJlVGltZXN0YW1wOiBzdHJpbmcsXG4gICAgaWRUb2tlbjogc3RyaW5nLFxuICAgIGJhc2VTaXRlOiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgIG5ldyBDZGNBdXRoQWN0aW9ucy5Mb2FkQ2RjVXNlclRva2VuKHtcbiAgICAgICAgVUlEOiBVSUQsXG4gICAgICAgIFVJRFNpZ25hdHVyZTogVUlEU2lnbmF0dXJlLFxuICAgICAgICBzaWduYXR1cmVUaW1lc3RhbXA6IHNpZ25hdHVyZVRpbWVzdGFtcCxcbiAgICAgICAgaWRUb2tlbjogaWRUb2tlbixcbiAgICAgICAgYmFzZVNpdGU6IGJhc2VTaXRlLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFV0aWxpdHkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIEF1dGhTdG9yYWdlU2VydmljZSBhbmQgQXNtQXV0aFN0b3JhZ2VTZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIGlzQXNtQXV0aFN0b3JhZ2VTZXJ2aWNlKFxuICAgIHNlcnZpY2U6IEF1dGhTdG9yYWdlU2VydmljZSB8IEFzbUF1dGhTdG9yYWdlU2VydmljZVxuICApOiBzZXJ2aWNlIGlzIEFzbUF1dGhTdG9yYWdlU2VydmljZSB7XG4gICAgcmV0dXJuICdnZXRUb2tlblRhcmdldCcgaW4gc2VydmljZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gYW5kIHN0b3JlIHRoZSB0b2tlbiByZWNlaXZlZCBmcm9tIGN1c3RvbSBmbG93IHRvIGxpYnJhcnkgZm9ybWF0IGFuZCBsb2dpbiB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW5cbiAgICovXG4gIGxvZ2luV2l0aFRva2VuKHRva2VuOiBQYXJ0aWFsPEF1dGhUb2tlbj4gJiB7IGV4cGlyZXNfaW4/OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGxldCBzdHJlYW0kID0gb2YodHJ1ZSk7XG4gICAgaWYgKHRoaXMuaXNBc21BdXRoU3RvcmFnZVNlcnZpY2UodGhpcy5hdXRoU3RvcmFnZVNlcnZpY2UpKSB7XG4gICAgICBzdHJlYW0kID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgIHRoaXMuYXV0aFN0b3JhZ2VTZXJ2aWNlLmdldFRva2VuKCksXG4gICAgICAgIHRoaXMuYXV0aFN0b3JhZ2VTZXJ2aWNlLmdldFRva2VuVGFyZ2V0KCksXG4gICAgICBdKS5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBtYXAoKFtjdXJyZW50VG9rZW4sIHRva2VuVGFyZ2V0XSkgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAhIWN1cnJlbnRUb2tlbj8uYWNjZXNzX3Rva2VuICYmIHRva2VuVGFyZ2V0ID09PSBUb2tlblRhcmdldC5DU0FnZW50XG4gICAgICAgICAgKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRhcCgoaXNBc21BZ2VudExvZ2dlZEluKSA9PiB7XG4gICAgICAgICAgaWYgKGlzQXNtQWdlbnRMb2dnZWRJbikge1xuICAgICAgICAgICAgdGhpcy5nbG9iYWxNZXNzYWdlU2VydmljZS5hZGQoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6ICdhc20uYXV0aC5hZ2VudExvZ2dlZEluRXJyb3InLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBHbG9iYWxNZXNzYWdlVHlwZS5NU0dfVFlQRV9FUlJPUlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBtYXAoKGlzQXNtQWdlbnRMb2dnZWRJbikgPT4gIWlzQXNtQWdlbnRMb2dnZWRJbilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc3RyZWFtJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoY2FuTG9naW4pID0+IHtcbiAgICAgIGlmIChjYW5Mb2dpbikge1xuICAgICAgICAvLyBDb2RlIG1vc3RseSBiYXNlZCBvbiBhdXRoIGxpYiB3ZSB1c2UgYW5kIHRoZSB3YXkgaXQgaGFuZGxlcyB0b2tlbiBwcm9wZXJ0aWVzXG4gICAgICAgIHRoaXMuYXV0aFN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oJ2FjY2Vzc190b2tlbicsIHRva2VuLmFjY2Vzc190b2tlbik7XG5cbiAgICAgICAgaWYgKHRva2VuLmdyYW50ZWRfc2NvcGVzICYmIEFycmF5LmlzQXJyYXkodG9rZW4uZ3JhbnRlZF9zY29wZXMpKSB7XG4gICAgICAgICAgdGhpcy5hdXRoU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbShcbiAgICAgICAgICAgICdncmFudGVkX3Njb3BlcycsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0b2tlbi5ncmFudGVkX3Njb3BlcylcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hdXRoU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbShcbiAgICAgICAgICAnYWNjZXNzX3Rva2VuX3N0b3JlZF9hdCcsXG4gICAgICAgICAgJycgKyBEYXRlLm5vdygpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRva2VuLmV4cGlyZXNfaW4pIHtcbiAgICAgICAgICBjb25zdCBleHBpcmVzSW5NaWxsaXNlY29uZHMgPSB0b2tlbi5leHBpcmVzX2luICogMTAwMDtcbiAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IG5vdy5nZXRUaW1lKCkgKyBleHBpcmVzSW5NaWxsaXNlY29uZHM7XG4gICAgICAgICAgdGhpcy5hdXRoU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSgnZXhwaXJlc19hdCcsICcnICsgZXhwaXJlc0F0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b2tlbi5yZWZyZXNoX3Rva2VuKSB7XG4gICAgICAgICAgdGhpcy5hdXRoU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSgncmVmcmVzaF90b2tlbicsIHRva2VuLnJlZnJlc2hfdG9rZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT0NDIHNwZWNpZmljIGNvZGVcbiAgICAgICAgdGhpcy51c2VySWRTZXJ2aWNlLnNldFVzZXJJZChPQ0NfVVNFUl9JRF9DVVJSRU5UKTtcblxuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBBdXRoQWN0aW9ucy5Mb2dpbigpKTtcblxuICAgICAgICAvLyBSZW1vdmUgYW55IGdsb2JhbCBlcnJvcnMgYW5kIHJlZGlyZWN0IHVzZXIgb24gc3VjY2Vzc2Z1bCBsb2dpblxuICAgICAgICB0aGlzLmdsb2JhbE1lc3NhZ2VTZXJ2aWNlLnJlbW92ZShHbG9iYWxNZXNzYWdlVHlwZS5NU0dfVFlQRV9FUlJPUik7XG4gICAgICAgIHRoaXMuYXV0aFJlZGlyZWN0U2VydmljZS5yZWRpcmVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0=