@spartacus/core
Version:
Spartacus - the core framework
101 lines • 12.7 kB
JavaScript
import { Injectable } from '@angular/core';
import { combineLatest, Subscription } from 'rxjs';
import { filter, map } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "../../../state/services/state-persistence.service";
import * as i2 from "../facade/user-id.service";
import * as i3 from "./auth-storage.service";
import * as i4 from "./auth-redirect-storage.service";
/**
* Responsible for saving the authorization data (userId, token, redirectUrl) in browser storage.
*/
export class AuthStatePersistenceService {
constructor(statePersistenceService, userIdService, authStorageService, authRedirectStorageService) {
this.statePersistenceService = statePersistenceService;
this.userIdService = userIdService;
this.authStorageService = authStorageService;
this.authRedirectStorageService = authRedirectStorageService;
this.subscription = new Subscription();
/**
* Identifier used for storage key.
*/
this.key = 'auth';
}
/**
* Initializes the synchronization between state and browser storage.
*/
initSync() {
this.subscription.add(this.statePersistenceService.syncWithStorage({
key: this.key,
state$: this.getAuthState(),
onRead: (state) => this.onRead(state),
}));
}
/**
* Gets and transforms state from different sources into the form that should
* be saved in storage.
*/
getAuthState() {
return combineLatest([
this.authStorageService.getToken().pipe(filter((state) => !!state), map((state) => {
return Object.assign({}, state);
})),
this.userIdService.getUserId(),
this.authRedirectStorageService.getRedirectUrl(),
]).pipe(map(([authToken, userId, redirectUrl]) => {
let token = authToken;
if (token) {
token = Object.assign({}, token);
// To minimize risk of user account hijacking we don't persist user refresh_token
delete token.refresh_token;
}
return { token, userId, redirectUrl };
}));
}
/**
* Function called on each browser storage read.
* Used to update state from browser -> state.
*/
onRead(state) {
if (state === null || state === void 0 ? void 0 : state.token) {
this.authStorageService.setToken(state.token);
}
if (state === null || state === void 0 ? void 0 : state.redirectUrl) {
this.authRedirectStorageService.setRedirectUrl(state.redirectUrl);
}
if (state === null || state === void 0 ? void 0 : state.userId) {
this.userIdService.setUserId(state.userId);
}
else {
this.userIdService.clearUserId();
}
}
/**
* Reads synchronously state from storage and returns it.
*/
readStateFromStorage() {
return this.statePersistenceService.readStateFromStorage({
key: this.key,
});
}
/**
* Check synchronously in browser storage if user is logged in (required by transfer state reducer).
* For most cases `isUserLoggedIn` from the `AuthService` should be used instead of this.
*/
isUserLoggedIn() {
var _a, _b;
return Boolean((_b = (_a = this.readStateFromStorage()) === null || _a === void 0 ? void 0 : _a.token) === null || _b === void 0 ? void 0 : _b.access_token);
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}
AuthStatePersistenceService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: AuthStatePersistenceService, deps: [{ token: i1.StatePersistenceService }, { token: i2.UserIdService }, { token: i3.AuthStorageService }, { token: i4.AuthRedirectStorageService }], target: i0.ɵɵFactoryTarget.Injectable });
AuthStatePersistenceService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: AuthStatePersistenceService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: AuthStatePersistenceService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.StatePersistenceService }, { type: i2.UserIdService }, { type: i3.AuthStorageService }, { type: i4.AuthRedirectStorageService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1zdGF0ZS1wZXJzaXN0ZW5jZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvYXV0aC91c2VyLWF1dGgvc2VydmljZXMvYXV0aC1zdGF0ZS1wZXJzaXN0ZW5jZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBYyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBZ0I3Qzs7R0FFRztBQUlILE1BQU0sT0FBTywyQkFBMkI7SUFHdEMsWUFDWSx1QkFBZ0QsRUFDaEQsYUFBNEIsRUFDNUIsa0JBQXNDLEVBQ3RDLDBCQUFzRDtRQUh0RCw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXlCO1FBQ2hELGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsK0JBQTBCLEdBQTFCLDBCQUEwQixDQUE0QjtRQU54RCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFTNUM7O1dBRUc7UUFDTyxRQUFHLEdBQUcsTUFBTSxDQUFDO0lBTHBCLENBQUM7SUFPSjs7T0FFRztJQUNJLFFBQVE7UUFDYixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FDbkIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQztZQUMzQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUMzQixNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ3RDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNPLFlBQVk7UUFDcEIsT0FBTyxhQUFhLENBQUM7WUFDbkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FDckMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQzFCLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNaLHlCQUNLLEtBQUssRUFDUjtZQUNKLENBQUMsQ0FBQyxDQUNIO1lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUU7WUFDOUIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGNBQWMsRUFBRTtTQUNqRCxDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFO1lBQ3ZDLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQztZQUN0QixJQUFJLEtBQUssRUFBRTtnQkFDVCxLQUFLLHFCQUFRLEtBQUssQ0FBRSxDQUFDO2dCQUNyQixpRkFBaUY7Z0JBQ2pGLE9BQU8sS0FBSyxDQUFDLGFBQWEsQ0FBQzthQUM1QjtZQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sTUFBTSxDQUFDLEtBQWtDO1FBQ2pELElBQUksS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLEtBQUssRUFBRTtZQUNoQixJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMvQztRQUNELElBQUksS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLFdBQVcsRUFBRTtZQUN0QixJQUFJLENBQUMsMEJBQTBCLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNuRTtRQUNELElBQUksS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLE1BQU0sRUFBRTtZQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDNUM7YUFBTTtZQUNMLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDbEM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxvQkFBb0I7UUFDNUIsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQWtCO1lBQ3hFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztTQUNkLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxjQUFjOztRQUNuQixPQUFPLE9BQU8sQ0FBQyxNQUFBLE1BQUEsSUFBSSxDQUFDLG9CQUFvQixFQUFFLDBDQUFFLEtBQUssMENBQUUsWUFBWSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLENBQUM7O3dIQTlGVSwyQkFBMkI7NEhBQTNCLDJCQUEyQixjQUYxQixNQUFNOzJGQUVQLDJCQUEyQjtrQkFIdkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdGF0ZVBlcnNpc3RlbmNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3N0YXRlL3NlcnZpY2VzL3N0YXRlLXBlcnNpc3RlbmNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlcklkU2VydmljZSB9IGZyb20gJy4uL2ZhY2FkZS91c2VyLWlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFRva2VuIH0gZnJvbSAnLi4vbW9kZWxzL2F1dGgtdG9rZW4ubW9kZWwnO1xuaW1wb3J0IHsgQXV0aFJlZGlyZWN0U3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL2F1dGgtcmVkaXJlY3Qtc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhTdG9yYWdlU2VydmljZSB9IGZyb20gJy4vYXV0aC1zdG9yYWdlLnNlcnZpY2UnO1xuXG4vKipcbiAqIEF1dGggc3RhdGUgc3luY2VkIHRvIGJyb3dzZXIgc3RvcmFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeW5jZWRBdXRoU3RhdGUge1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIHRva2VuPzogQXV0aFRva2VuO1xuICByZWRpcmVjdFVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXNwb25zaWJsZSBmb3Igc2F2aW5nIHRoZSBhdXRob3JpemF0aW9uIGRhdGEgKHVzZXJJZCwgdG9rZW4sIHJlZGlyZWN0VXJsKSBpbiBicm93c2VyIHN0b3JhZ2UuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBBdXRoU3RhdGVQZXJzaXN0ZW5jZVNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcm90ZWN0ZWQgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBzdGF0ZVBlcnNpc3RlbmNlU2VydmljZTogU3RhdGVQZXJzaXN0ZW5jZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHVzZXJJZFNlcnZpY2U6IFVzZXJJZFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGF1dGhTdG9yYWdlU2VydmljZTogQXV0aFN0b3JhZ2VTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBhdXRoUmVkaXJlY3RTdG9yYWdlU2VydmljZTogQXV0aFJlZGlyZWN0U3RvcmFnZVNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBJZGVudGlmaWVyIHVzZWQgZm9yIHN0b3JhZ2Uga2V5LlxuICAgKi9cbiAgcHJvdGVjdGVkIGtleSA9ICdhdXRoJztcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIHN0YXRlIGFuZCBicm93c2VyIHN0b3JhZ2UuXG4gICAqL1xuICBwdWJsaWMgaW5pdFN5bmMoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5zdGF0ZVBlcnNpc3RlbmNlU2VydmljZS5zeW5jV2l0aFN0b3JhZ2Uoe1xuICAgICAgICBrZXk6IHRoaXMua2V5LFxuICAgICAgICBzdGF0ZSQ6IHRoaXMuZ2V0QXV0aFN0YXRlKCksXG4gICAgICAgIG9uUmVhZDogKHN0YXRlKSA9PiB0aGlzLm9uUmVhZChzdGF0ZSksXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbmQgdHJhbnNmb3JtcyBzdGF0ZSBmcm9tIGRpZmZlcmVudCBzb3VyY2VzIGludG8gdGhlIGZvcm0gdGhhdCBzaG91bGRcbiAgICogYmUgc2F2ZWQgaW4gc3RvcmFnZS5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRBdXRoU3RhdGUoKTogT2JzZXJ2YWJsZTxTeW5jZWRBdXRoU3RhdGU+IHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmF1dGhTdG9yYWdlU2VydmljZS5nZXRUb2tlbigpLnBpcGUoXG4gICAgICAgIGZpbHRlcigoc3RhdGUpID0+ICEhc3RhdGUpLFxuICAgICAgICBtYXAoKHN0YXRlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgdGhpcy51c2VySWRTZXJ2aWNlLmdldFVzZXJJZCgpLFxuICAgICAgdGhpcy5hdXRoUmVkaXJlY3RTdG9yYWdlU2VydmljZS5nZXRSZWRpcmVjdFVybCgpLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFthdXRoVG9rZW4sIHVzZXJJZCwgcmVkaXJlY3RVcmxdKSA9PiB7XG4gICAgICAgIGxldCB0b2tlbiA9IGF1dGhUb2tlbjtcbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgdG9rZW4gPSB7IC4uLnRva2VuIH07XG4gICAgICAgICAgLy8gVG8gbWluaW1pemUgcmlzayBvZiB1c2VyIGFjY291bnQgaGlqYWNraW5nIHdlIGRvbid0IHBlcnNpc3QgdXNlciByZWZyZXNoX3Rva2VuXG4gICAgICAgICAgZGVsZXRlIHRva2VuLnJlZnJlc2hfdG9rZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdG9rZW4sIHVzZXJJZCwgcmVkaXJlY3RVcmwgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiBjYWxsZWQgb24gZWFjaCBicm93c2VyIHN0b3JhZ2UgcmVhZC5cbiAgICogVXNlZCB0byB1cGRhdGUgc3RhdGUgZnJvbSBicm93c2VyIC0+IHN0YXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uUmVhZChzdGF0ZTogU3luY2VkQXV0aFN0YXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHN0YXRlPy50b2tlbikge1xuICAgICAgdGhpcy5hdXRoU3RvcmFnZVNlcnZpY2Uuc2V0VG9rZW4oc3RhdGUudG9rZW4pO1xuICAgIH1cbiAgICBpZiAoc3RhdGU/LnJlZGlyZWN0VXJsKSB7XG4gICAgICB0aGlzLmF1dGhSZWRpcmVjdFN0b3JhZ2VTZXJ2aWNlLnNldFJlZGlyZWN0VXJsKHN0YXRlLnJlZGlyZWN0VXJsKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlPy51c2VySWQpIHtcbiAgICAgIHRoaXMudXNlcklkU2VydmljZS5zZXRVc2VySWQoc3RhdGUudXNlcklkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51c2VySWRTZXJ2aWNlLmNsZWFyVXNlcklkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHN5bmNocm9ub3VzbHkgc3RhdGUgZnJvbSBzdG9yYWdlIGFuZCByZXR1cm5zIGl0LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRTdGF0ZUZyb21TdG9yYWdlKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlUGVyc2lzdGVuY2VTZXJ2aWNlLnJlYWRTdGF0ZUZyb21TdG9yYWdlPFN5bmNlZEF1dGhTdGF0ZT4oe1xuICAgICAga2V5OiB0aGlzLmtleSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBzeW5jaHJvbm91c2x5IGluIGJyb3dzZXIgc3RvcmFnZSBpZiB1c2VyIGlzIGxvZ2dlZCBpbiAocmVxdWlyZWQgYnkgdHJhbnNmZXIgc3RhdGUgcmVkdWNlcikuXG4gICAqIEZvciBtb3N0IGNhc2VzIGBpc1VzZXJMb2dnZWRJbmAgZnJvbSB0aGUgYEF1dGhTZXJ2aWNlYCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoaXMuXG4gICAqL1xuICBwdWJsaWMgaXNVc2VyTG9nZ2VkSW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5yZWFkU3RhdGVGcm9tU3RvcmFnZSgpPy50b2tlbj8uYWNjZXNzX3Rva2VuKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==