diff --git a/packages/okta-angular/src/okta/okta.guard.ts b/packages/okta-angular/src/okta/okta.guard.ts index 4de11c520..dff69a55b 100644 --- a/packages/okta-angular/src/okta/okta.guard.ts +++ b/packages/okta-angular/src/okta/okta.guard.ts @@ -52,7 +52,8 @@ export class OktaAuthGuard implements CanActivate { /** * Store the current path */ - this.oktaAuth.setFromUri(state.url); + const path = state.url.split(/[?#]/)[0]; + this.oktaAuth.setFromUri(path, route.queryParams); /** * Redirect to the given path or diff --git a/packages/okta-angular/src/okta/okta.service.ts b/packages/okta-angular/src/okta/okta.service.ts index cf02727b0..bb6e2d283 100644 --- a/packages/okta-angular/src/okta/okta.service.ts +++ b/packages/okta-angular/src/okta/okta.service.ts @@ -11,7 +11,7 @@ */ import { Inject, Injectable, Optional } from '@angular/core'; -import { Router } from '@angular/router'; +import { Router, NavigationExtras } from '@angular/router'; import { OKTA_CONFIG } from './okta.config'; @@ -134,9 +134,14 @@ export class OktaAuthService { /** * Stores the intended path to redirect after successful login. * @param uri + * @param queryParams */ - setFromUri(uri) { - localStorage.setItem('referrerPath', uri); + setFromUri(uri, queryParams) { + const json = JSON.stringify({ + uri: uri, + params: queryParams + }); + localStorage.setItem('referrerPath', json); } /** @@ -165,7 +170,11 @@ export class OktaAuthService { /** * Navigate back to the initial view or root of application. */ - this.router.navigate([this.getFromUri()]); + const path = JSON.parse(this.getFromUri()); + const navigationExtras: NavigationExtras = { + queryParams: path.params + }; + this.router.navigate([path.uri], navigationExtras); } /** diff --git a/packages/okta-angular/test/e2e/harness/e2e/app.e2e-spec.ts b/packages/okta-angular/test/e2e/harness/e2e/app.e2e-spec.ts index fcfe673eb..15a7f01ac 100644 --- a/packages/okta-angular/test/e2e/harness/e2e/app.e2e-spec.ts +++ b/packages/okta-angular/test/e2e/harness/e2e/app.e2e-spec.ts @@ -59,6 +59,25 @@ describe('Angular + Okta App', () => { expect(protectedPage.getLoginButton().isPresent()).toBeTruthy(); }); + it('should preserve query paramaters after redirecting to Okta', () => { + protectedPage.navigateToWithQuery(); + + oktaLoginPage.waitUntilVisible(); + oktaLoginPage.signIn({ + username: environment.USERNAME, + password: environment.PASSWORD + }); + + protectedPage.waitUntilQueryVisible(); + expect(protectedPage.getLogoutButton().isPresent()).toBeTruthy(); + + /** + * Logout + */ + protectedPage.getLogoutButton().click(); + expect(protectedPage.getLoginButton().isPresent()).toBeTruthy(); + }); + /** * Hack to slowdown the tests due to the Okta session * not being removed in time for the second login call. diff --git a/packages/okta-angular/test/e2e/harness/e2e/page-objects/protected.po.ts b/packages/okta-angular/test/e2e/harness/e2e/page-objects/protected.po.ts index 16fc4d4ab..c5bdf2d5f 100644 --- a/packages/okta-angular/test/e2e/harness/e2e/page-objects/protected.po.ts +++ b/packages/okta-angular/test/e2e/harness/e2e/page-objects/protected.po.ts @@ -18,10 +18,18 @@ export class ProtectedPage { return browser.get('/protected'); } + navigateToWithQuery() { + return browser.get('/protected/foo?state=bar'); + } + waitUntilVisible() { browser.wait(ExpectedConditions.urlContains('/protected'), 5000); } + waitUntilQueryVisible() { + browser.wait(ExpectedConditions.urlContains('/protected/foo?state=bar'), 5000); + } + getLogoutButton() { return element(by.id('logout-button')); } diff --git a/packages/okta-angular/test/e2e/harness/src/app/app.module.ts b/packages/okta-angular/test/e2e/harness/src/app/app.module.ts index a619cacf8..206ece10b 100644 --- a/packages/okta-angular/test/e2e/harness/src/app/app.module.ts +++ b/packages/okta-angular/test/e2e/harness/src/app/app.module.ts @@ -57,7 +57,14 @@ const appRoutes: Routes = [ { path: 'protected', component: ProtectedComponent, - canActivate: [ OktaAuthGuard ] + canActivate: [ OktaAuthGuard ], + children: [ + { + path: 'foo', + component: ProtectedComponent, + canActivate: [ OktaAuthGuard ] + } + ] }, { path: 'protected-with-data',