diff --git a/docs/core/services/storage.service.md b/docs/core/services/storage.service.md index 1b904d49c4..a612536567 100644 --- a/docs/core/services/storage.service.md +++ b/docs/core/services/storage.service.md @@ -61,6 +61,11 @@ In order to achieve this, you will only need to set your app identifier under th **Important note** This identifier must be unique to the app to guarantee that it has its own storage. +### SSO storagePrefix related scenario +The storagePrefix can allow you to login with multiple user in the same browser only if: + - Or You don't use the implicit flow + - Or You use implicit flow you use different AIMS instances for any app + ## See also - [Cookie service](cookie.service.md) diff --git a/e2e/core/login/login-component.e2e.ts b/e2e/core/login/login-component.e2e.ts index 89e4debb36..2164a14a08 100644 --- a/e2e/core/login/login-component.e2e.ts +++ b/e2e/core/login/login-component.e2e.ts @@ -208,7 +208,7 @@ describe('Login component', () => { await loginPage.clickSettingsIcon(); await settingsPage.setProviderEcmBpm(); await loginPage.login(adminUserModel.id, adminUserModel.password); - await browser.executeScript('window.localStorage.removeItem("ticket-ECM");'); + await browser.executeScript('window.localStorage.removeItem("ADF_ticket-ECM");'); await BrowserActions.getUrl(browser.params.testConfig.adf.url + '/files'); await loginPage.waitForElements(); }); @@ -228,7 +228,7 @@ describe('Login component', () => { await loginPage.clickSettingsIcon(); await settingsPage.setProviderEcmBpm(); await loginPage.login(adminUserModel.id, adminUserModel.password); - await browser.executeScript('window.localStorage.removeItem("ticket-BPM");'); + await browser.executeScript('window.localStorage.removeItem("ADF_ticket-BPM");'); await BrowserActions.getUrl(browser.params.testConfig.adf.url + '/activiti'); await loginPage.waitForElements(); }); diff --git a/lib/core/services/alfresco-api.service.ts b/lib/core/services/alfresco-api.service.ts index adc5d7fe69..c0ec11fdc7 100644 --- a/lib/core/services/alfresco-api.service.ts +++ b/lib/core/services/alfresco-api.service.ts @@ -134,6 +134,7 @@ export class AlfrescoApiService { contextRoot: this.appConfig.get(AppConfigValues.CONTEXTROOTECM), disableCsrf: this.appConfig.get(AppConfigValues.DISABLECSRF), withCredentials: this.appConfig.get(AppConfigValues.AUTH_WITH_CREDENTIALS, false), + domainPrefix : this.appConfig.get(AppConfigValues.STORAGE_PREFIX), oauth2: oauth }); diff --git a/lib/core/services/auth-guard.service.ts b/lib/core/services/auth-guard.service.ts index 5d9aa4d31e..762697b9ca 100644 --- a/lib/core/services/auth-guard.service.ts +++ b/lib/core/services/auth-guard.service.ts @@ -41,15 +41,15 @@ export class AuthGuard extends AuthGuardBase { } ticketChange(event: StorageEvent) { - if (event.key === 'ticket-ECM' && event.newValue !== event.oldValue) { + if (event.key.includes('ticket-ECM') && event.newValue !== event.oldValue) { this.ticketChangeRedirect(event, 'ECM'); } - if (event.key === 'ticket-BPM' && event.newValue !== event.oldValue) { + if (event.key.includes('ticket-BPM') && event.newValue !== event.oldValue) { this.ticketChangeRedirect(event, 'BPM'); } - if (event.key === JwtHelperService.USER_ACCESS_TOKEN && + if (event.key.includes(JwtHelperService.USER_ACCESS_TOKEN) && this.jwtHelperService.getValueFromToken(event.newValue, JwtHelperService.USER_PREFERRED_USERNAME) !== this.jwtHelperService.getValueFromToken(event.oldValue, JwtHelperService.USER_PREFERRED_USERNAME)) { this.ticketChangeRedirect(event, 'ALL'); diff --git a/lib/core/services/authentication.service.ts b/lib/core/services/authentication.service.ts index 31ac5304ee..7c5cdf4dae 100644 --- a/lib/core/services/authentication.service.ts +++ b/lib/core/services/authentication.service.ts @@ -26,6 +26,7 @@ import { UserRepresentation } from '@alfresco/js-api'; import { map, catchError, tap } from 'rxjs/operators'; import { HttpHeaders } from '@angular/common/http'; import { JwtHelperService } from './jwt-helper.service'; +import { StorageService } from './storage.service'; const REMEMBER_ME_COOKIE_KEY = 'ALFRESCO_REMEMBER_ME'; const REMEMBER_ME_UNTIL = 1000 * 60 * 60 * 24 * 30; @@ -43,6 +44,7 @@ export class AuthenticationService { constructor( private appConfig: AppConfigService, + private storageService: StorageService, private alfrescoApi: AlfrescoApiService, private cookie: CookieService, private logService: LogService) { @@ -292,7 +294,7 @@ export class AuthenticationService { * @returns Auth token string */ getToken(): string { - return localStorage.getItem(JwtHelperService.USER_ACCESS_TOKEN); + return this.storageService.getItem(JwtHelperService.USER_ACCESS_TOKEN); } /** diff --git a/lib/core/services/jwt-helper.service.ts b/lib/core/services/jwt-helper.service.ts index 667780323d..4f9cca7f42 100644 --- a/lib/core/services/jwt-helper.service.ts +++ b/lib/core/services/jwt-helper.service.ts @@ -16,6 +16,7 @@ */ import { Injectable } from '@angular/core'; +import { StorageService } from './storage.service'; @Injectable({ providedIn: 'root' @@ -31,7 +32,7 @@ export class JwtHelperService { static RESOURCE_ACCESS = 'resource_access'; static USER_PREFERRED_USERNAME = 'preferred_username'; - constructor() { + constructor(private storageService: StorageService) { } /** @@ -89,12 +90,12 @@ export class JwtHelperService { * @returns access token */ getAccessToken(): string { - return localStorage.getItem(JwtHelperService.USER_ACCESS_TOKEN); + return this.storageService.getItem(JwtHelperService.USER_ACCESS_TOKEN); } /** * Gets a named value from the user access token. - * @param key accessToken + * @param accessToken your SSO access token where the value is encode * @param key Key name of the field to retrieve * @returns Value from the token */ diff --git a/lib/process-services/src/lib/task-list/components/no-task-detail-template.directive.spec.ts b/lib/process-services/src/lib/task-list/components/no-task-detail-template.directive.spec.ts index 4322e1b691..6c10426927 100644 --- a/lib/process-services/src/lib/task-list/components/no-task-detail-template.directive.spec.ts +++ b/lib/process-services/src/lib/task-list/components/no-task-detail-template.directive.spec.ts @@ -27,8 +27,8 @@ describe('NoTaskDetailsTemplateDirective', () => { let authService: AuthenticationService; beforeEach(() => { - authService = new AuthenticationService(null, null, null, null); - spyOn(authService, 'getBpmLoggedUser').and.returnValue(of({ email: 'fake-email'})); + authService = new AuthenticationService(null, null, null, null, null); + spyOn(authService, 'getBpmLoggedUser').and.returnValue(of({ email: 'fake-email' })); detailsComponent = new TaskDetailsComponent(null, authService, null, null, null, null); component = new NoTaskDetailsTemplateDirective(detailsComponent); });