UNPKG

@kephas/ngx-oidc

Version:

Provides the integration of the OIDC API with Kephas and Angular 12+.

1 lines 52.1 kB
{"version":3,"file":"kephas-ngx-oidc.mjs","sources":["../../../../projects/kephas/ngx-oidc/src/lib/appIdProvider.service.ts","../../../../projects/kephas/ngx-oidc/src/lib/authentication.settings.ts","../../../../projects/kephas/ngx-oidc/src/lib/authentication.service.ts","../../../../projects/kephas/ngx-oidc/src/lib/authorize.interceptor.ts","../../../../projects/kephas/ngx-oidc/src/lib/authorize.guard.ts","../../../../projects/kephas/ngx-oidc/src/lib/login/login.component.ts","../../../../projects/kephas/ngx-oidc/src/lib/login/login.component.html","../../../../projects/kephas/ngx-oidc/src/lib/logout/logout.component.ts","../../../../projects/kephas/ngx-oidc/src/lib/logout/logout.component.html","../../../../projects/kephas/ngx-oidc/src/lib/login-menu/login-menu.component.ts","../../../../projects/kephas/ngx-oidc/src/lib/login-menu/login-menu.component.html","../../../../projects/kephas/ngx-oidc/src/lib/oidc.module.ts","../../../../projects/kephas/ngx-oidc/src/public-api.ts","../../../../projects/kephas/ngx-oidc/src/kephas-ngx-oidc.ts"],"sourcesContent":["import { AppService, Priority, SingletonAppServiceContract } from \"@kephas/core\";\r\nimport { NgTarget } from \"@kephas/ngx-core\";\r\n\r\n/**\r\n * This service should be overwritten in the end application\r\n * to provide the real identity application ID in the getIdentityAppId() method.\r\n *\r\n * @export\r\n * @class AppIdProvider\r\n */\r\n@AppService({ overridePriority: Priority.Lowest })\r\n@SingletonAppServiceContract({ target: NgTarget })\r\nexport class AppIdProvider {\r\n /**\r\n * Gets the identity application ID.\r\n *\r\n * @returns\r\n * @memberof AppIdProvider\r\n */\r\n getIdentityAppId() {\r\n return '[TODO-APP-ID]';\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { AppIdProvider } from './appIdProvider.service';\r\n\r\nexport const ReturnUrlType = 'returnUrl';\r\n\r\nexport const QueryParameterNames = {\r\n ReturnUrl: ReturnUrlType,\r\n Message: 'message'\r\n};\r\n\r\nexport const LogoutActions = {\r\n LogoutCallback: 'logout-callback',\r\n Logout: 'logout',\r\n LoggedOut: 'logged-out'\r\n};\r\n\r\nexport const LoginActions = {\r\n Login: 'login',\r\n LoginCallback: 'login-callback',\r\n LoginFailed: 'login-failed',\r\n Profile: 'profile',\r\n Register: 'register'\r\n};\r\n\r\nexport interface ApplicationPathsType {\r\n readonly DefaultLoginRedirectPath: string;\r\n readonly ApiAuthorizationClientConfigurationUrl: string;\r\n readonly Login: string;\r\n readonly LoginFailed: string;\r\n readonly LoginCallback: string;\r\n readonly Register: string;\r\n readonly Profile: string;\r\n readonly LogOut: string;\r\n readonly LoggedOut: string;\r\n readonly LogOutCallback: string;\r\n readonly LoginPathComponents: string [];\r\n readonly LoginFailedPathComponents: string [];\r\n readonly LoginCallbackPathComponents: string [];\r\n readonly RegisterPathComponents: string [];\r\n readonly ProfilePathComponents: string [];\r\n readonly LogOutPathComponents: string [];\r\n readonly LoggedOutPathComponents: string [];\r\n readonly LogOutCallbackPathComponents: string [];\r\n readonly IdentityRegisterPath: string;\r\n readonly IdentityManagePath: string;\r\n}\r\n\r\nexport interface ActivitySettingsType {\r\n /**\r\n * The maximum idle time (seconds) until an automatic disconnect happens.\r\n * Do not set if the automatic disconnect should not be triggered.\r\n *\r\n * @type {number}\r\n * @memberof ActivitySettingsType\r\n */\r\n readonly MaxIdleSeconds?: number;\r\n}\r\n\r\nexport interface AuthenticationSettings {\r\n readonly identityAppId: string;\r\n readonly returnUrl: string;\r\n readonly applicationPaths: ApplicationPathsType;\r\n readonly activity: ActivitySettingsType;\r\n popUpDisabled: boolean;\r\n}\r\n\r\n@Injectable()\r\nexport class AuthenticationSettingsProvider {\r\n public static readonly instance = new AuthenticationSettingsProvider(new AppIdProvider());\r\n\r\n readonly settings: AuthenticationSettings;\r\n\r\n /**\r\n * Creates an instance of AuthenticationSettingsProvider.\r\n * @param {AppIdProvider} appIdProvider The application ID provider.\r\n * @memberof AuthenticationSettingsProvider\r\n */\r\n constructor(appIdProvider: AppIdProvider) {\r\n this.settings = this.getSettings(appIdProvider.getIdentityAppId())\r\n }\r\n\r\n protected getSettings(identityAppId: string): AuthenticationSettings {\r\n let applicationPaths: ApplicationPathsType = {\r\n DefaultLoginRedirectPath: '/',\r\n ApiAuthorizationClientConfigurationUrl: `/_configuration/${identityAppId}`,\r\n Login: `authentication/${LoginActions.Login}`,\r\n LoginFailed: `authentication/${LoginActions.LoginFailed}`,\r\n LoginCallback: `authentication/${LoginActions.LoginCallback}`,\r\n Register: `authentication/${LoginActions.Register}`,\r\n Profile: `authentication/${LoginActions.Profile}`,\r\n LogOut: `authentication/${LogoutActions.Logout}`,\r\n LoggedOut: `authentication/${LogoutActions.LoggedOut}`,\r\n LogOutCallback: `authentication/${LogoutActions.LogoutCallback}`,\r\n LoginPathComponents: [],\r\n LoginFailedPathComponents: [],\r\n LoginCallbackPathComponents: [],\r\n RegisterPathComponents: [],\r\n ProfilePathComponents: [],\r\n LogOutPathComponents: [],\r\n LoggedOutPathComponents: [],\r\n LogOutCallbackPathComponents: [],\r\n IdentityRegisterPath: '/Identity/Account/Register',\r\n IdentityManagePath: '/Identity/Account/Manage'\r\n };\r\n\r\n applicationPaths = {\r\n ...applicationPaths,\r\n LoginPathComponents: applicationPaths.Login.split('/'),\r\n LoginFailedPathComponents: applicationPaths.LoginFailed.split('/'),\r\n RegisterPathComponents: applicationPaths.Register.split('/'),\r\n ProfilePathComponents: applicationPaths.Profile.split('/'),\r\n LogOutPathComponents: applicationPaths.LogOut.split('/'),\r\n LoggedOutPathComponents: applicationPaths.LoggedOut.split('/'),\r\n LogOutCallbackPathComponents: applicationPaths.LogOutCallback.split('/')\r\n };\r\n\r\n let activity: ActivitySettingsType = {\r\n };\r\n\r\n return {\r\n identityAppId: identityAppId,\r\n returnUrl: ReturnUrlType,\r\n applicationPaths: applicationPaths,\r\n activity: activity,\r\n // By default pop ups are disabled because they don't work properly on Edge.\r\n // If you want to enable pop up authentication simply set this flag to false.\r\n popUpDisabled: true,\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { AppService, SingletonAppServiceContract } from '@kephas/core';\r\nimport { Profile, User, UserManager, } from 'oidc-client';\r\nimport { BehaviorSubject, concat, from, Observable } from 'rxjs';\r\nimport { filter, map, mergeMap, take, tap } from 'rxjs/operators';\r\nimport { AuthenticationSettingsProvider } from './authentication.settings';\r\n\r\nexport type IAuthenticationResult =\r\n SuccessAuthenticationResult |\r\n FailureAuthenticationResult |\r\n RedirectAuthenticationResult;\r\n\r\nexport interface SuccessAuthenticationResult {\r\n status: AuthenticationResultStatus.Success;\r\n state: any;\r\n}\r\n\r\nexport interface FailureAuthenticationResult {\r\n status: AuthenticationResultStatus.Fail;\r\n message: string | Error;\r\n}\r\n\r\nexport interface RedirectAuthenticationResult {\r\n status: AuthenticationResultStatus.Redirect;\r\n}\r\n\r\nexport enum AuthenticationResultStatus {\r\n Success,\r\n Redirect,\r\n Fail\r\n}\r\n\r\nexport interface IUser extends Profile {\r\n name?: string;\r\n}\r\n\r\n@Injectable()\r\nexport class AuthenticationService {\r\n private _lastActivityTime?: Date;\r\n\r\n /**\r\n * Creates an instance of AuthorizeService.\r\n * @param {AuthenticationSettingsProvider} settingsProvider The settings provider.\r\n * @memberof AuthorizeService\r\n */\r\n constructor(protected readonly settingsProvider: AuthenticationSettingsProvider) {\r\n }\r\n\r\n protected userManager?: UserManager;\r\n protected readonly userSubject: BehaviorSubject<IUser | null> = new BehaviorSubject(null as IUser | null);\r\n protected readonly rawUserSubject: BehaviorSubject<User | null> = new BehaviorSubject(null as User | null);\r\n\r\n /**\r\n * Gets the time of user's last activity.\r\n *\r\n * @readonly\r\n * @type {(Date | undefined)}\r\n * @memberof AuthorizeService\r\n */\r\n public get lastActivityTime(): Date | undefined {\r\n return this._lastActivityTime;\r\n }\r\n\r\n /**\r\n * Gets an observable indicating whether the user is authenticated.\r\n *\r\n * @return {*} {Observable<boolean>}\r\n * @memberof AuthorizeService\r\n */\r\n public isAuthenticated(): Observable<boolean> {\r\n return this.getUser().pipe(map(u => !!u));\r\n }\r\n\r\n /**\r\n * Gets an observable retrieving the user.\r\n *\r\n * @return {*} {(Observable<IUser | null | undefined>)}\r\n * @memberof AuthorizeService\r\n */\r\n public getUser(): Observable<IUser | null | undefined> {\r\n return concat(\r\n this.userSubject.pipe(take(1), filter(u => !!u)),\r\n this.getUserFromStorage().pipe(filter(u => !!u), tap(u => this.setUser(u!)), map(u => u?.profile)),\r\n this.userSubject.asObservable());\r\n }\r\n\r\n /**\r\n * Gets an observable containing the access token of the signed-in user.\r\n *\r\n * @return {*} {(Observable<string | undefined>)}\r\n * @memberof AuthorizeService\r\n */\r\n public getAccessToken(): Observable<string | undefined> {\r\n return from(this.ensureUserManagerInitialized())\r\n .pipe(mergeMap(() => from(this.userManager!.getUser())),\r\n map(user => user?.access_token));\r\n }\r\n\r\n /**\r\n * Notifies the authorization service that the user is active.\r\n *\r\n * @memberof AuthorizeService\r\n */\r\n public touch() {\r\n this._lastActivityTime = new Date();\r\n }\r\n\r\n /**\r\n * Sign in the user.\r\n * We try to authenticate the user in three different ways:\r\n * 1) We try to see if we can authenticate the user silently. This happens\r\n * when the user is already logged in on the IdP and is done using a hidden iframe\r\n * on the client.\r\n * 2) We try to authenticate the user using a PopUp Window. This might fail if there is a\r\n * Pop-Up blocker or the user has disabled PopUps.\r\n * 3) If the two methods above fail, we redirect the browser to the IdP to perform a traditional\r\n * redirect flow.\r\n *\r\n * @param {*} state\r\n * @return {*} {Promise<IAuthenticationResult>}\r\n * @memberof AuthorizeService\r\n */\r\n public async signIn(state: any): Promise<IAuthenticationResult> {\r\n await this.ensureUserManagerInitialized();\r\n let user: User | null = null;\r\n try {\r\n user = await this.userManager!.signinSilent(this.createArguments());\r\n this.setUser(user);\r\n return this.success(state);\r\n } catch (silentError) {\r\n // User might not be authenticated, fallback to popup authentication\r\n console.log('Silent authentication error: ', silentError);\r\n\r\n const popUpDisabled = this.settingsProvider.settings.popUpDisabled;\r\n try {\r\n this.ensurePopupEnabled();\r\n\r\n user = await this.userManager!.signinPopup(this.createArguments());\r\n this.setUser(user);\r\n return this.success(state);\r\n } catch (popupError) {\r\n if ((popupError as Error).message === 'Popup window closed') {\r\n // The user explicitly cancelled the login action by closing an opened popup.\r\n return this.error('The user closed the window.');\r\n } else if (!popUpDisabled) {\r\n console.log('Popup authentication error: ', popupError);\r\n }\r\n\r\n // PopUps might be blocked by the user, fallback to redirect\r\n try {\r\n await this.userManager!.signinRedirect(this.createArguments(state));\r\n return this.redirect();\r\n } catch (redirectError) {\r\n console.log('Redirect authentication error: ', redirectError);\r\n return this.error(redirectError as Error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n public async completeSignIn(url: string): Promise<IAuthenticationResult> {\r\n try {\r\n await this.ensureUserManagerInitialized();\r\n const user = await this.userManager!.signinCallback(url);\r\n this.setUser(user);\r\n return this.success(user?.state);\r\n } catch (error) {\r\n console.log('There was an error signing in: ', error);\r\n return this.error('There was an error signing in.');\r\n }\r\n }\r\n\r\n public async signOut(state: any): Promise<IAuthenticationResult> {\r\n try {\r\n this.ensurePopupEnabled();\r\n\r\n await this.ensureUserManagerInitialized();\r\n await this.userManager!.signoutPopup(this.createArguments());\r\n this.setUser(null);\r\n return this.success(state);\r\n } catch (popupSignOutError) {\r\n console.log('Popup signout error: ', popupSignOutError);\r\n try {\r\n await this.userManager!.signoutRedirect(this.createArguments(state));\r\n return this.redirect();\r\n } catch (redirectSignOutError) {\r\n console.log('Redirect signout error: ', popupSignOutError);\r\n return this.error(redirectSignOutError as Error);\r\n }\r\n }\r\n }\r\n\r\n public async completeSignOut(url: string): Promise<IAuthenticationResult> {\r\n await this.ensureUserManagerInitialized();\r\n try {\r\n const response = await this.userManager!.signoutCallback(url);\r\n this.setUser(null);\r\n return this.success(response && response.state);\r\n } catch (error) {\r\n console.log(`There was an error trying to log out '${error}'.`);\r\n return this.error(error as Error);\r\n }\r\n }\r\n\r\n protected async ensureUserManagerInitialized(): Promise<void> {\r\n if (this.userManager !== undefined) {\r\n return;\r\n }\r\n\r\n const authSettings = this.settingsProvider.settings;\r\n const response = await fetch(authSettings.applicationPaths.ApiAuthorizationClientConfigurationUrl);\r\n if (!response.ok) {\r\n throw new Error(`Could not load settings for '${authSettings.identityAppId}'`);\r\n }\r\n\r\n const settings: any = await response.json();\r\n settings.automaticSilentRenew = true;\r\n settings.includeIdTokenInSilentRenew = true;\r\n this.userManager = new UserManager(settings);\r\n\r\n this.userManager.events.addUserSignedOut(async () => {\r\n await this.userManager!.removeUser();\r\n this.setUser(null);\r\n });\r\n }\r\n\r\n private ensurePopupEnabled() {\r\n if (this.settingsProvider.settings.popUpDisabled) {\r\n throw new Error('Popup disabled. Instruct the AuthorizationSettingsProvider service to return false in \\'settings.popupDisabled\\' to enable it.');\r\n }\r\n }\r\n\r\n private createArguments(state?: any): any {\r\n return { useReplaceToNavigate: true, data: state };\r\n }\r\n\r\n private error(message: string | Error): IAuthenticationResult {\r\n return { status: AuthenticationResultStatus.Fail, message };\r\n }\r\n\r\n private success(state: any): IAuthenticationResult {\r\n return { status: AuthenticationResultStatus.Success, state };\r\n }\r\n\r\n private redirect(): IAuthenticationResult {\r\n return { status: AuthenticationResultStatus.Redirect };\r\n }\r\n\r\n private getUserFromStorage(): Observable<User | null> {\r\n return from(this.ensureUserManagerInitialized())\r\n .pipe(\r\n mergeMap(() => this.userManager!.getUser()));\r\n }\r\n\r\n private setUser(user: User | null) {\r\n const currentUser = this.rawUserSubject.value;\r\n\r\n // make sure not to issue a change if the user is not really changed.\r\n if (currentUser == user || currentUser?.id_token == user?.id_token) {\r\n return;\r\n }\r\n\r\n this.rawUserSubject.next(user);\r\n this.userSubject.next(user?.profile || null);\r\n }\r\n}\r\n","import { HttpHandler, HttpEvent, HttpRequest, HttpInterceptor } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { AuthenticationService } from './authentication.service';\r\nimport { mergeMap } from 'rxjs/operators';\r\nimport { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Interceptor handling the authorization.\r\n *\r\n * @export\r\n * @class AuthorizeInterceptor\r\n * @implements {HttpInterceptor}\r\n */\r\n@Injectable()\r\nexport class AuthorizeInterceptor implements HttpInterceptor {\r\n /**\r\n * Creates an instance of AuthorizeInterceptor.\r\n * @param {AuthenticationService} authorize The authorization service.\r\n * @memberof AuthorizeInterceptor\r\n */\r\n constructor(private authorize: AuthenticationService) {\r\n }\r\n\r\n /**\r\n * Intercepts the request.\r\n *\r\n * @param {HttpRequest<any>} request\r\n * @param {HttpHandler} next\r\n * @return {*} {Observable<HttpEvent<any>>}\r\n * @memberof AuthorizeInterceptor\r\n */\r\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n return this.authorize.getAccessToken()\r\n .pipe(mergeMap(token => this.processRequestWithToken(token, request, next)));\r\n }\r\n\r\n // Checks if there is an access_token available in the authorize service\r\n // and adds it to the request in case it's targeted at the same origin as the\r\n // single page application.\r\n private processRequestWithToken(token: string | undefined, req: HttpRequest<any>, next: HttpHandler) {\r\n if (!!token && this.isSameOriginUrl(req)) {\r\n req = req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${token}`\r\n }\r\n });\r\n }\r\n\r\n return next.handle(req);\r\n }\r\n\r\n private isSameOriginUrl(req: any) {\r\n // It's an absolute url with the same origin.\r\n if (req.url.startsWith(`${window.location.origin}/`)) {\r\n return true;\r\n }\r\n\r\n // It's a protocol relative url with the same origin.\r\n // For example: //www.example.com/api/Products\r\n if (req.url.startsWith(`//${window.location.host}/`)) {\r\n return true;\r\n }\r\n\r\n // It's a relative url like /api/Products\r\n if (/^\\/[^\\/].*/.test(req.url)) {\r\n return true;\r\n }\r\n\r\n // It's an absolute or protocol relative url that\r\n // doesn't have the same origin.\r\n return false;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';\r\nimport { Observable } from 'rxjs';\r\nimport { tap } from 'rxjs/operators';\r\nimport { AuthenticationService } from './authentication.service';\r\nimport { AuthenticationSettingsProvider, QueryParameterNames } from './authentication.settings';\r\n\r\n@Injectable()\r\nexport class AuthorizeGuard implements CanActivate {\r\n constructor(\r\n private authService: AuthenticationService,\r\n private router: Router,\r\n private settingsProvider: AuthenticationSettingsProvider) {\r\n }\r\n canActivate(\r\n _next: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {\r\n return this.authService.isAuthenticated()\r\n .pipe(tap(isAuthenticated => this.handleAuthorization(isAuthenticated, state)));\r\n }\r\n\r\n private handleAuthorization(isAuthenticated: boolean, state: RouterStateSnapshot) {\r\n if (!isAuthenticated) {\r\n const settings = this.settingsProvider.settings;\r\n this.router.navigate(settings.applicationPaths.LoginPathComponents, {\r\n queryParams: {\r\n [QueryParameterNames.ReturnUrl]: state.url\r\n }\r\n });\r\n }\r\n }\r\n}\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { AuthenticationResultStatus, AuthenticationService } from '../authentication.service';\r\nimport { AuthenticationSettingsProvider, LoginActions, QueryParameterNames } from '../authentication.settings';\r\nimport { NavigationState } from '../navigationState';\r\n\r\n// The main responsibility of this component is to handle the user's login process.\r\n// This is the starting point for the login process. Any component that needs to authenticate\r\n// a user can simply perform a redirect to this component with a returnUrl query parameter and\r\n// let the component perform the login and return back to the return url.\r\n@Component({\r\n selector: 'app-login',\r\n templateUrl: './login.component.html',\r\n styleUrls: ['./login.component.css']\r\n})\r\nexport class LoginComponent implements OnInit {\r\n public message = new BehaviorSubject<string | Error | null>(null);\r\n\r\n constructor(\r\n private authenticationService: AuthenticationService,\r\n private activatedRoute: ActivatedRoute,\r\n private router: Router,\r\n private authSettingsProvider: AuthenticationSettingsProvider) { }\r\n\r\n async ngOnInit() {\r\n const action = this.activatedRoute.snapshot.url[1];\r\n switch (action.path) {\r\n case LoginActions.Login:\r\n await this.login(this.getReturnUrl());\r\n break;\r\n case LoginActions.LoginCallback:\r\n await this.processLoginCallback();\r\n break;\r\n case LoginActions.LoginFailed:\r\n const message = this.activatedRoute.snapshot.queryParamMap.get(QueryParameterNames.Message);\r\n this.message.next(message);\r\n break;\r\n case LoginActions.Profile:\r\n this.redirectToProfile();\r\n break;\r\n case LoginActions.Register:\r\n this.redirectToRegister();\r\n break;\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n\r\n private async login(returnUrl: string): Promise<void> {\r\n const state: NavigationState = { returnUrl };\r\n const result = await this.authenticationService.signIn(state);\r\n this.message.next(null);\r\n\r\n const applicationPaths = this.authSettingsProvider.settings.applicationPaths;\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n break;\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(returnUrl);\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n await this.router.navigate(applicationPaths.LoginFailedPathComponents, {\r\n queryParams: { [QueryParameterNames.Message]: result.message }\r\n });\r\n break;\r\n default:\r\n throw new Error(`Invalid status result ${(result as any).status}.`);\r\n }\r\n }\r\n\r\n private async processLoginCallback(): Promise<void> {\r\n const url = window.location.href;\r\n const result = await this.authenticationService.completeSignIn(url);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n // There should not be any redirects as completeSignIn never redirects.\r\n throw new Error('Should not redirect.');\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(this.getReturnUrl(result.state));\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.message.next(result.message);\r\n break;\r\n }\r\n }\r\n\r\n private redirectToRegister(): any {\r\n const applicationPaths = this.authSettingsProvider.settings.applicationPaths;\r\n this.redirectToApiAuthorizationPath(\r\n `${applicationPaths.IdentityRegisterPath}?returnUrl=${encodeURI('/' + applicationPaths.Login)}`);\r\n }\r\n\r\n private redirectToProfile(): void {\r\n const applicationPaths = this.authSettingsProvider.settings.applicationPaths;\r\n this.redirectToApiAuthorizationPath(applicationPaths.IdentityManagePath);\r\n }\r\n\r\n private async navigateToReturnUrl(returnUrl: string) {\r\n // It's important that we do a replace here so that we remove the callback uri with the\r\n // fragment containing the tokens from the browser history.\r\n await this.router.navigateByUrl(returnUrl, {\r\n replaceUrl: true\r\n });\r\n }\r\n\r\n private getReturnUrl(state?: NavigationState): string {\r\n const applicationPaths = this.authSettingsProvider.settings.applicationPaths;\r\n const fromQuery = (this.activatedRoute.snapshot.queryParams as NavigationState).returnUrl;\r\n // If the url is comming from the query string, check that is either\r\n // a relative url or an absolute url\r\n if (fromQuery &&\r\n !(fromQuery.startsWith(`${window.location.origin}/`) ||\r\n /\\/[^\\/].*/.test(fromQuery))) {\r\n // This is an extra check to prevent open redirects.\r\n throw new Error('Invalid return url. The return url needs to have the same origin as the current page.');\r\n }\r\n return (state && state.returnUrl) ||\r\n fromQuery ||\r\n applicationPaths.DefaultLoginRedirectPath;\r\n }\r\n\r\n private redirectToApiAuthorizationPath(apiAuthorizationPath: string) {\r\n // It's important that we do a replace here so that when the user hits the back arrow on the\r\n // browser they get sent back to where it was on the app instead of to an endpoint on this\r\n // component.\r\n const redirectUrl = `${window.location.origin}${apiAuthorizationPath}`;\r\n window.location.replace(redirectUrl);\r\n }\r\n}\r\n","<p>{{ message | async }}</p>","import { Component, OnInit } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { take } from 'rxjs/operators';\r\nimport { AuthenticationResultStatus, AuthenticationService } from '../authentication.service';\r\nimport { AuthenticationSettingsProvider, LogoutActions } from '../authentication.settings';\r\nimport { NavigationState } from '../navigationState';\r\n\r\n// The main responsibility of this component is to handle the user's logout process.\r\n// This is the starting point for the logout process, which is usually initiated when a\r\n// user clicks on the logout button on the LoginMenu component.\r\n@Component({\r\n selector: 'app-logout',\r\n templateUrl: './logout.component.html',\r\n styleUrls: ['./logout.component.css']\r\n})\r\nexport class LogoutComponent implements OnInit {\r\n public message = new BehaviorSubject<string | Error | null>(null);\r\n\r\n constructor(\r\n private authenticationService: AuthenticationService,\r\n private activatedRoute: ActivatedRoute,\r\n private router: Router,\r\n private authSettingsProvider: AuthenticationSettingsProvider) { }\r\n\r\n async ngOnInit() {\r\n const action = this.activatedRoute.snapshot.url[1];\r\n switch (action.path) {\r\n case LogoutActions.Logout:\r\n if (!!window.history.state.local) {\r\n await this.logout(this.getReturnUrl());\r\n } else {\r\n // This prevents regular links to <app>/authentication/logout from triggering a logout\r\n this.message.next('The logout was not initiated from within the page.');\r\n }\r\n\r\n break;\r\n case LogoutActions.LogoutCallback:\r\n await this.processLogoutCallback();\r\n break;\r\n case LogoutActions.LoggedOut:\r\n this.message.next('You successfully logged out!');\r\n break;\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n\r\n private async logout(returnUrl: string): Promise<void> {\r\n const state: NavigationState = { returnUrl };\r\n const isauthenticated = await this.authenticationService.isAuthenticated().pipe(\r\n take(1)\r\n ).toPromise();\r\n if (isauthenticated) {\r\n const result = await this.authenticationService.signOut(state);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n break;\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(returnUrl);\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.message.next(result.message);\r\n break;\r\n default:\r\n throw new Error('Invalid authentication result status.');\r\n }\r\n } else {\r\n this.message.next('You successfully logged out!');\r\n }\r\n }\r\n\r\n private async processLogoutCallback(): Promise<void> {\r\n const url = window.location.href;\r\n const result = await this.authenticationService.completeSignOut(url);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n // There should not be any redirects as the only time completeAuthentication finishes\r\n // is when we are doing a redirect sign in flow.\r\n throw new Error('Should not redirect.');\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(this.getReturnUrl(result.state));\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.message.next(result.message);\r\n break;\r\n default:\r\n throw new Error('Invalid authentication result status.');\r\n }\r\n }\r\n\r\n private async navigateToReturnUrl(returnUrl: string) {\r\n await this.router.navigateByUrl(returnUrl, {\r\n replaceUrl: true\r\n });\r\n }\r\n\r\n private getReturnUrl(state?: NavigationState): string {\r\n const fromQuery = (this.activatedRoute.snapshot.queryParams as NavigationState).returnUrl;\r\n // If the url is comming from the query string, check that is either\r\n // a relative url or an absolute url\r\n if (fromQuery &&\r\n !(fromQuery.startsWith(`${window.location.origin}/`) ||\r\n /\\/[^\\/].*/.test(fromQuery))) {\r\n // This is an extra check to prevent open redirects.\r\n throw new Error('Invalid return url. The return url needs to have the same origin as the current page.');\r\n }\r\n return (state && state.returnUrl) ||\r\n fromQuery ||\r\n this.authSettingsProvider.settings.applicationPaths.LoggedOut;\r\n }\r\n}\r\n","<p>{{ message | async }}</p>","import { Component, OnInit } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { map, tap } from 'rxjs/operators';\r\nimport { AuthenticationService } from '../authentication.service';\r\n\r\n@Component({\r\n selector: 'app-login-menu',\r\n templateUrl: './login-menu.component.html',\r\n styleUrls: ['./login-menu.component.css']\r\n})\r\nexport class LoginMenuComponent implements OnInit {\r\n public isAuthenticated?: Observable<boolean>;\r\n public userName?: Observable<string | undefined>;\r\n\r\n constructor(private authenticationService: AuthenticationService) { }\r\n\r\n ngOnInit() {\r\n this.isAuthenticated = this.authenticationService.isAuthenticated();\r\n this.userName = this.authenticationService.getUser().pipe(map(u => u?.name));\r\n }\r\n}\r\n","<ul class=\"navbar-nav\" *ngIf=\"isAuthenticated | async\">\r\n <li class=\"nav-item\">\r\n <a class=\"nav-link\" [routerLink]='[\"/authentication/profile\"]' title=\"Manage\">Hello {{ userName | async }}</a>\r\n </li>\r\n <li class=\"nav-item\">\r\n <a class=\"nav-link\" [routerLink]='[\"/authentication/logout\"]' [state]='{ local: true }' title=\"Logout\">Logout</a>\r\n </li>\r\n</ul>\r\n<ul class=\"navbar-nav\" *ngIf=\"!(isAuthenticated | async)\">\r\n <li class=\"nav-item\">\r\n <a class=\"nav-link\" [routerLink]='[\"/authentication/register\"]'>Register</a>\r\n </li>\r\n <li class=\"nav-item\">\r\n <a class=\"nav-link\" [routerLink]='[\"/authentication/login\"]'>Login</a>\r\n </li>\r\n</ul>\r\n","import { Injector, NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { LoginMenuComponent } from './login-menu/login-menu.component';\r\nimport { LoginComponent } from './login/login.component';\r\nimport { LogoutComponent } from './logout/logout.component';\r\nimport { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport { RouterModule } from '@angular/router';\r\nimport { AuthenticationSettingsProvider } from './authentication.settings';\r\nimport { AppIdProvider } from './appIdProvider.service';\r\nimport { resolveAppService } from '@kephas/ngx-core';\r\nimport { AuthenticationService } from './authentication.service';\r\nimport { AuthorizeGuard } from './authorize.guard';\r\nimport { AuthorizeInterceptor } from './authorize.interceptor';\r\n\r\nconst applicationPaths = AuthenticationSettingsProvider.instance.settings.applicationPaths;\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n HttpClientModule,\r\n RouterModule.forChild(\r\n [\r\n { path: applicationPaths.Register, component: LoginComponent },\r\n { path: applicationPaths.Profile, component: LoginComponent },\r\n { path: applicationPaths.Login, component: LoginComponent },\r\n { path: applicationPaths.LoginFailed, component: LoginComponent },\r\n { path: applicationPaths.LoginCallback, component: LoginComponent },\r\n { path: applicationPaths.LogOut, component: LogoutComponent },\r\n { path: applicationPaths.LoggedOut, component: LogoutComponent },\r\n { path: applicationPaths.LogOutCallback, component: LogoutComponent }\r\n ]\r\n )\r\n ],\r\n declarations: [LoginMenuComponent, LoginComponent, LogoutComponent],\r\n exports: [LoginMenuComponent, LoginComponent, LogoutComponent],\r\n providers: [\r\n {\r\n provide: AppIdProvider,\r\n useFactory: resolveAppService(AppIdProvider),\r\n deps: [Injector]\r\n },\r\n AuthenticationSettingsProvider,\r\n AuthenticationService,\r\n AuthorizeGuard,\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n multi: true,\r\n useClass: AuthorizeInterceptor,\r\n }\r\n ]\r\n})\r\nexport class OidcModule { }\r\n","/*\r\n * Public API Surface of angular-oidc\r\n */\r\n\r\nexport * from './lib/appIdProvider.service';\r\nexport * from './lib/authentication.settings';\r\nexport * from './lib/navigationState';\r\nexport * from './lib/authentication.service';\r\nexport * from './lib/authorize.interceptor';\r\nexport * from './lib/authorize.guard';\r\n\r\nexport * from './lib/login/login.component';\r\nexport * from './lib/logout/logout.component';\r\nexport * from './lib/login-menu/login-menu.component';\r\n\r\nexport * from './lib/oidc.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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