diff --git a/frontend/src/app/guards/sso.guard.ts b/frontend/src/app/guards/sso.guard.ts index 2d680e84..00ccb33d 100644 --- a/frontend/src/app/guards/sso.guard.ts +++ b/frontend/src/app/guards/sso.guard.ts @@ -17,6 +17,9 @@ export class SsoGuard implements CanActivate { _state: RouterStateSnapshot ) { if (this.userService.loggedIn) { + if (window.opener != null) { + window.opener.postMessage('loadAttemptedUrl', '*'); + } return true; } else { if (await this.userService.isSsoEnabled()) { diff --git a/frontend/src/app/services/user.service.ts b/frontend/src/app/services/user.service.ts index f6cb50fc..cd1cf1d2 100644 --- a/frontend/src/app/services/user.service.ts +++ b/frontend/src/app/services/user.service.ts @@ -7,6 +7,7 @@ import User, { AuthUser, TokenResponse } from '../models/user'; }) export class UserService { redirectUrl: string | null = null; + signInWindow: any; constructor(private http: HttpClient) {} @@ -59,15 +60,33 @@ export class UserService { } async trySsoLogin(attemptedUrl: string): Promise { + this.addLoadAttemptedUrlListener(attemptedUrl); return this.http .get('auth/sso/handshake') .toPromise() .then((response: any) => { - window.location.href = `${response.scoreSsoEndpoint}?sig=${response.sig}&sso=${response.sso}&redirectUrl=${attemptedUrl}`; + this.openSignInWindow(response, attemptedUrl); return false; }); } + addLoadAttemptedUrlListener(attemptedUrl: string): void { + window.addEventListener('message', (event) => { + if (event.data === 'loadAttemptedUrl') { + window.location.href = attemptedUrl; + this.signInWindow.close(); + } + }); + } + + openSignInWindow(response: any, attemptedUrl: string): void { + const ssoEndpoint = + response.scoreSsoEndpoint + + `?sig=${response.sig}&sso=${response.sso}&redirectUrl=${attemptedUrl}`; + const params = 'width=800,height=600'; + this.signInWindow = window.open(ssoEndpoint, 'SCORE Login Window', params); + } + async ssoLogin(sso: string | null, sig: string | null): Promise { return this.http .get(`auth/sso/login/${sso}/${sig}`)