UNPKG

235 kBSource Map (JSON)View Raw
1{"version":3,"file":"angular-oauth2-oidc.mjs","sources":["../../../projects/lib/src/token-validation/null-validation-handler.ts","../../../projects/lib/src/oauth-module.config.ts","../../../projects/lib/src/date-time-provider.ts","../../../projects/lib/src/types.ts","../../../projects/lib/src/events.ts","../../../projects/lib/src/base64-helper.ts","../../../projects/lib/src/auth.config.ts","../../../projects/lib/src/encoder.ts","../../../projects/lib/src/token-validation/validation-handler.ts","../../../projects/lib/src/url-helper.service.ts","../../../projects/lib/src/token-validation/fast-sha256js.ts","../../../projects/lib/src/token-validation/hash-handler.ts","../../../projects/lib/src/oauth-service.ts","../../../projects/lib/src/interceptors/resource-server-error-handler.ts","../../../projects/lib/src/interceptors/default-oauth.interceptor.ts","../../../projects/lib/src/factories.ts","../../../projects/lib/src/provider.ts","../../../projects/lib/src/angular-oauth-oidc.module.ts","../../../projects/lib/src/token-validation/jwks-validation-handler.ts","../../../projects/lib/src/tokens.ts","../../../projects/lib/src/angular-oauth2-oidc.ts"],"sourcesContent":["import { ValidationHandler, ValidationParams } from './validation-handler';\n\n/**\n * A validation handler that isn't validating nothing.\n * Can be used to skip validation (at your own risk).\n */\nexport class NullValidationHandler implements ValidationHandler {\n validateSignature(validationParams: ValidationParams): Promise<any> {\n return Promise.resolve(null);\n }\n validateAtHash(validationParams: ValidationParams): Promise<boolean> {\n return Promise.resolve(true);\n }\n}\n","export abstract class OAuthModuleConfig {\n resourceServer: OAuthResourceServerConfig;\n}\n\nexport abstract class OAuthResourceServerConfig {\n /**\n * Urls for which calls should be intercepted.\n * If there is an ResourceServerErrorHandler registered, it is used for them.\n * If sendAccessToken is set to true, the access_token is send to them too.\n */\n allowedUrls?: Array<string>;\n sendAccessToken: boolean;\n customUrlValidation?: (url: string) => boolean;\n}\n","import { Injectable } from '@angular/core';\n\nexport abstract class DateTimeProvider {\n abstract now(): number;\n abstract new(): Date;\n}\n\n@Injectable()\nexport class SystemDateTimeProvider extends DateTimeProvider {\n now(): number {\n return Date.now();\n }\n\n new(): Date {\n return new Date();\n }\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * Additional options that can be passed to tryLogin.\n */\nexport class LoginOptions {\n /**\n * Is called, after a token has been received and\n * successfully validated.\n *\n * Deprecated: Use property ``events`` on OAuthService instead.\n */\n onTokenReceived?: (receivedTokens: ReceivedTokens) => void;\n\n /**\n * Hook, to validate the received tokens.\n *\n * Deprecated: Use property ``tokenValidationHandler`` on OAuthService instead.\n */\n validationHandler?: (receivedTokens: ReceivedTokens) => Promise<any>;\n\n /**\n * Called when tryLogin detects that the auth server\n * included an error message into the hash fragment.\n *\n * Deprecated: Use property ``events`` on OAuthService instead.\n */\n onLoginError?: (params: object) => void;\n\n /**\n * A custom hash fragment to be used instead of the\n * actual one. This is used for silent refreshes, to\n * pass the iframes hash fragment to this method, and\n * is also used by popup flows in the same manner.\n * This can be used with code flow, where is must be set\n * to a hash symbol followed by the querystring. The\n * question mark is optional, but may be present following\n * the hash symbol.\n */\n customHashFragment?: string;\n\n /**\n * Set this to true to disable the oauth2 state\n * check which is a best practice to avoid\n * security attacks.\n * As OIDC defines a nonce check that includes\n * this, this can be set to true when only doing\n * OIDC.\n */\n disableOAuth2StateCheck?: boolean;\n\n /**\n * Set this to true to disable the nonce\n * check which is used to avoid\n * replay attacks.\n * This flag should never be true in\n * production environments.\n */\n disableNonceCheck? = false;\n\n /**\n * Normally, you want to clear your hash fragment after\n * the lib read the token(s) so that they are not displayed\n * anymore in the url. If not, set this to true. For code flow\n * this controls removing query string values.\n */\n preventClearHashAfterLogin? = false;\n\n /**\n * Set this for code flow if you used a custom redirect Uri\n * when retrieving the code. This is used internally for silent\n * refresh and popup flows.\n */\n customRedirectUri?: string;\n}\n\n/**\n * Defines the logging interface the OAuthService uses\n * internally. Is compatible with the `console` object,\n * but you can provide your own implementation as well\n * through dependency injection.\n */\nexport abstract class OAuthLogger {\n abstract debug(message?: any, ...optionalParams: any[]): void;\n abstract info(message?: any, ...optionalParams: any[]): void;\n abstract log(message?: any, ...optionalParams: any[]): void;\n abstract warn(message?: any, ...optionalParams: any[]): void;\n abstract error(message?: any, ...optionalParams: any[]): void;\n}\n\n/**\n * Defines a simple storage that can be used for\n * storing the tokens at client side.\n * Is compatible to localStorage and sessionStorage,\n * but you can also create your own implementations.\n */\nexport abstract class OAuthStorage {\n abstract getItem(key: string): string | null;\n abstract removeItem(key: string): void;\n abstract setItem(key: string, data: string): void;\n}\n\n@Injectable()\nexport class MemoryStorage implements OAuthStorage {\n private data = new Map<string, string>();\n\n getItem(key: string): string {\n return this.data.get(key);\n }\n\n removeItem(key: string): void {\n this.data.delete(key);\n }\n\n setItem(key: string, data: string): void {\n this.data.set(key, data);\n }\n}\n\n/**\n * Represents the received tokens, the received state\n * and the parsed claims from the id-token.\n */\nexport class ReceivedTokens {\n idToken: string;\n accessToken: string;\n idClaims?: object;\n state?: string;\n}\n\n/**\n * Represents the parsed and validated id_token.\n */\nexport interface ParsedIdToken {\n idToken: string;\n idTokenClaims: object;\n idTokenHeader: object;\n idTokenClaimsJson: string;\n idTokenHeaderJson: string;\n idTokenExpiresAt: number;\n}\n\n/**\n * Represents the response from the token endpoint\n * http://openid.net/specs/openid-connect-core-1_0.html#TokenEndpoint\n */\nexport interface TokenResponse {\n access_token: string;\n id_token: string;\n token_type: string;\n expires_in: number;\n refresh_token: string;\n scope: string;\n state?: string;\n}\n\n/**\n * Represents the response from the user info endpoint\n * http://openid.net/specs/openid-connect-core-1_0.html#UserInfo\n */\nexport interface UserInfo {\n sub: string;\n [key: string]: any;\n}\n\n/**\n * Represents an OpenID Connect discovery document\n */\nexport interface OidcDiscoveryDoc {\n issuer: string;\n authorization_endpoint: string;\n token_endpoint: string;\n token_endpoint_auth_methods_supported: string[];\n token_endpoint_auth_signing_alg_values_supported: string[];\n userinfo_endpoint: string;\n check_session_iframe: string;\n end_session_endpoint: string;\n jwks_uri: string;\n registration_endpoint: string;\n scopes_supported: string[];\n response_types_supported: string[];\n acr_values_supported: string[];\n response_modes_supported: string[];\n grant_types_supported: string[];\n subject_types_supported: string[];\n userinfo_signing_alg_values_supported: string[];\n userinfo_encryption_alg_values_supported: string[];\n userinfo_encryption_enc_values_supported: string[];\n id_token_signing_alg_values_supported: string[];\n id_token_encryption_alg_values_supported: string[];\n id_token_encryption_enc_values_supported: string[];\n request_object_signing_alg_values_supported: string[];\n display_values_supported: string[];\n claim_types_supported: string[];\n claims_supported: string[];\n claims_parameter_supported: boolean;\n service_documentation: string;\n ui_locales_supported: string[];\n revocation_endpoint: string;\n}\n","export type EventType =\n | 'discovery_document_loaded'\n | 'jwks_load_error'\n | 'invalid_nonce_in_state'\n | 'discovery_document_load_error'\n | 'discovery_document_validation_error'\n | 'user_profile_loaded'\n | 'user_profile_load_error'\n | 'token_received'\n | 'token_error'\n | 'code_error'\n | 'token_refreshed'\n | 'token_refresh_error'\n | 'silent_refresh_error'\n | 'silently_refreshed'\n | 'silent_refresh_timeout'\n | 'token_validation_error'\n | 'token_expires'\n | 'session_changed'\n | 'session_error'\n | 'session_terminated'\n | 'session_unchanged'\n | 'logout'\n | 'popup_closed'\n | 'popup_blocked'\n | 'token_revoke_error';\n\nexport abstract class OAuthEvent {\n constructor(readonly type: EventType) {}\n}\n\nexport class OAuthSuccessEvent extends OAuthEvent {\n constructor(type: EventType, readonly info: any = null) {\n super(type);\n }\n}\n\nexport class OAuthInfoEvent extends OAuthEvent {\n constructor(type: EventType, readonly info: any = null) {\n super(type);\n }\n}\n\nexport class OAuthErrorEvent extends OAuthEvent {\n constructor(\n type: EventType,\n readonly reason: object,\n readonly params: object = null\n ) {\n super(type);\n }\n}\n","// see: https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_.22Unicode_Problem.22\nexport function b64DecodeUnicode(str) {\n const base64 = str.replace(/-/g, '+').replace(/_/g, '/');\n\n return decodeURIComponent(\n atob(base64)\n .split('')\n .map(function (c) {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join('')\n );\n}\n\nexport function base64UrlEncode(str): string {\n const base64 = btoa(str);\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n","export class AuthConfig {\n /**\n * The client's id as registered with the auth server\n */\n public clientId? = '';\n\n /**\n * The client's redirectUri as registered with the auth server\n */\n public redirectUri? = '';\n\n /**\n * An optional second redirectUri where the auth server\n * redirects the user to after logging out.\n */\n public postLogoutRedirectUri? = '';\n\n /**\n * Defines whether to use 'redirectUri' as a replacement\n * of 'postLogoutRedirectUri' if the latter is not set.\n */\n public redirectUriAsPostLogoutRedirectUriFallback? = true;\n\n /**\n * The auth server's endpoint that allows to log\n * the user in when using implicit flow.\n */\n public loginUrl? = '';\n\n /**\n * The requested scopes\n */\n public scope? = 'openid profile';\n\n public resource? = '';\n\n public rngUrl? = '';\n\n /**\n * Defines whether to use OpenId Connect during\n * implicit flow.\n */\n public oidc? = true;\n\n /**\n * Defines whether to request an access token during\n * implicit flow.\n */\n public requestAccessToken? = true;\n\n public options?: any = null;\n\n /**\n * The issuer's uri.\n */\n public issuer? = '';\n\n /**\n * The logout url.\n */\n public logoutUrl? = '';\n\n /**\n * Defines whether to clear the hash fragment after logging in.\n */\n public clearHashAfterLogin? = true;\n\n /**\n * Url of the token endpoint as defined by OpenId Connect and OAuth 2.\n */\n public tokenEndpoint?: string = null;\n\n /**\n * Url of the revocation endpoint as defined by OpenId Connect and OAuth 2.\n */\n public revocationEndpoint?: string = null;\n\n /**\n * Names of known parameters sent out in the TokenResponse. https://tools.ietf.org/html/rfc6749#section-5.1\n */\n public customTokenParameters?: string[] = [];\n\n /**\n * Url of the userinfo endpoint as defined by OpenId Connect.\n */\n public userinfoEndpoint?: string = null;\n\n public responseType? = '';\n\n /**\n * Defines whether additional debug information should\n * be shown at the console. Note that in certain browsers\n * the verbosity of the console needs to be explicitly set\n * to include Debug level messages.\n */\n public showDebugInformation? = false;\n\n /**\n * The redirect uri used when doing silent refresh.\n */\n public silentRefreshRedirectUri? = '';\n\n public silentRefreshMessagePrefix? = '';\n\n /**\n * Set this to true to display the iframe used for\n * silent refresh for debugging.\n */\n public silentRefreshShowIFrame? = false;\n\n /**\n * Timeout for silent refresh.\n * @internal\n * @deprecated use silentRefreshTimeout\n */\n public siletRefreshTimeout?: number = 1000 * 20;\n\n /**\n * Timeout for silent refresh.\n */\n public silentRefreshTimeout?: number = 1000 * 20;\n\n /**\n * Some auth servers don't allow using password flow\n * w/o a client secret while the standards do not\n * demand for it. In this case, you can set a password\n * here. As this password is exposed to the public\n * it does not bring additional security and is therefore\n * as good as using no password.\n */\n public dummyClientSecret?: string = '';\n\n /**\n * Defines whether https is required.\n * The default value is remoteOnly which only allows\n * http for localhost, while every other domains need\n * to be used with https.\n */\n public requireHttps?: boolean | 'remoteOnly' = 'remoteOnly';\n\n /**\n * Defines whether every url provided by the discovery\n * document has to start with the issuer's url.\n */\n public strictDiscoveryDocumentValidation? = true;\n\n /**\n * JSON Web Key Set (https://tools.ietf.org/html/rfc7517)\n * with keys used to validate received id_tokens.\n * This is taken out of the disovery document. Can be set manually too.\n */\n public jwks?: object = null;\n\n /**\n * Map with additional query parameter that are appended to\n * the request when initializing implicit flow.\n */\n public customQueryParams?: object = null;\n\n public silentRefreshIFrameName? = 'angular-oauth-oidc-silent-refresh-iframe';\n\n /**\n * Defines when the token_timeout event should be raised.\n * If you set this to the default value 0.75, the event\n * is triggered after 75% of the token's life time.\n */\n public timeoutFactor? = 0.75;\n\n /**\n * If true, the lib will try to check whether the user\n * is still logged in on a regular basis as described\n * in http://openid.net/specs/openid-connect-session-1_0.html#ChangeNotification\n */\n public sessionChecksEnabled? = false;\n\n /**\n * Interval in msec for checking the session\n * according to http://openid.net/specs/openid-connect-session-1_0.html#ChangeNotification\n */\n public sessionCheckIntervall? = 3 * 1000;\n\n /**\n * Url for the iframe used for session checks\n */\n public sessionCheckIFrameUrl?: string = null;\n\n /**\n * Name of the iframe to use for session checks\n */\n public sessionCheckIFrameName? = 'angular-oauth-oidc-check-session-iframe';\n\n /**\n * This property has been introduced to disable at_hash checks\n * and is indented for Identity Provider that does not deliver\n * an at_hash EVEN THOUGH its recommended by the OIDC specs.\n * Of course, when disabling these checks then we are bypassing\n * a security check which means we are more vulnerable.\n */\n public disableAtHashCheck? = false;\n\n /**\n * Defines wether to check the subject of a refreshed token after silent refresh.\n * Normally, it should be the same as before.\n */\n public skipSubjectCheck? = false;\n\n public useIdTokenHintForSilentRefresh? = false;\n\n /**\n * Defined whether to skip the validation of the issuer in the discovery document.\n * Normally, the discovey document's url starts with the url of the issuer.\n */\n public skipIssuerCheck? = false;\n\n /**\n * According to rfc6749 it is recommended (but not required) that the auth\n * server exposes the access_token's life time in seconds.\n * This is a fallback value for the case this value is not exposed.\n */\n public fallbackAccessTokenExpirationTimeInSec?: number;\n\n /**\n * final state sent to issuer is built as follows:\n * state = nonce + nonceStateSeparator + additional state\n * Default separator is ';' (encoded %3B).\n * In rare cases, this character might be forbidden or inconvenient to use by the issuer so it can be customized.\n */\n public nonceStateSeparator? = ';';\n\n /**\n * Set this to true to use HTTP BASIC auth for AJAX calls\n */\n public useHttpBasicAuth? = false;\n\n /**\n * The window of time (in seconds) to allow the current time to deviate when validating id_token's iat and exp values.\n */\n public clockSkewInSec?: number;\n\n /**\n * Decreases the Expiration time of tokens by this number of seconds\n */\n public decreaseExpirationBySec? = 0;\n\n /**\n * The interceptors waits this time span if there is no token\n */\n public waitForTokenInMsec? = 0;\n\n /**\n * Set this to true if you want to use silent refresh together with\n * code flow. As silent refresh is the only option for refreshing\n * with implicit flow, you don't need to explicitly turn it on in\n * this case.\n */\n public useSilentRefresh?;\n\n /**\n * Code Flow is by defauld used together with PKCI which is also higly recommented.\n * You can disbale it here by setting this flag to true.\n * https://tools.ietf.org/html/rfc7636#section-1.1\n */\n public disablePKCE? = false;\n\n /**\n * Set this to true to preserve the requested route including query parameters after code flow login.\n * This setting enables deep linking for the code flow.\n */\n public preserveRequestedRoute? = false;\n\n /**\n * Allows to disable the timer for the id_token used\n * for token refresh\n */\n public disableIdTokenTimer? = false;\n\n /**\n * Blocks other origins requesting a silent refresh\n */\n public checkOrigin? = false;\n\n constructor(json?: Partial<AuthConfig>) {\n if (json) {\n Object.assign(this, json);\n }\n }\n\n /**\n * This property allows you to override the method that is used to open the login url,\n * allowing a way for implementations to specify their own method of routing to new\n * urls.\n */\n public openUri?: (uri: string) => void = (uri) => {\n location.href = uri;\n };\n}\n","import { HttpParameterCodec } from '@angular/common/http';\n/**\n * This custom encoder allows charactes like +, % and / to be used in passwords\n */\nexport class WebHttpUrlEncodingCodec implements HttpParameterCodec {\n encodeKey(k: string): string {\n return encodeURIComponent(k);\n }\n\n encodeValue(v: string): string {\n return encodeURIComponent(v);\n }\n\n decodeKey(k: string): string {\n return decodeURIComponent(k);\n }\n\n decodeValue(v: string) {\n return decodeURIComponent(v);\n }\n}\n","import { base64UrlEncode } from '../base64-helper';\n\nexport interface ValidationParams {\n idToken: string;\n accessToken: string;\n idTokenHeader: object;\n idTokenClaims: object;\n jwks: object;\n loadKeys: () => Promise<object>;\n}\n\n/**\n * Interface for Handlers that are hooked in to\n * validate tokens.\n */\nexport abstract class ValidationHandler {\n /**\n * Validates the signature of an id_token.\n */\n public abstract validateSignature(\n validationParams: ValidationParams\n ): Promise<any>;\n\n /**\n * Validates the at_hash in an id_token against the received access_token.\n */\n public abstract validateAtHash(\n validationParams: ValidationParams\n ): Promise<boolean>;\n}\n\n/**\n * This abstract implementation of ValidationHandler already implements\n * the method validateAtHash. However, to make use of it,\n * you have to override the method calcHash.\n */\nexport abstract class AbstractValidationHandler implements ValidationHandler {\n /**\n * Validates the signature of an id_token.\n */\n abstract validateSignature(validationParams: ValidationParams): Promise<any>;\n\n /**\n * Validates the at_hash in an id_token against the received access_token.\n */\n async validateAtHash(params: ValidationParams): Promise<boolean> {\n const hashAlg = this.inferHashAlgorithm(params.idTokenHeader);\n\n const tokenHash = await this.calcHash(params.accessToken, hashAlg); // sha256(accessToken, { asString: true });\n\n const leftMostHalf = tokenHash.substr(0, tokenHash.length / 2);\n\n const atHash = base64UrlEncode(leftMostHalf);\n\n const claimsAtHash = params.idTokenClaims['at_hash'].replace(/=/g, '');\n\n if (atHash !== claimsAtHash) {\n console.error('exptected at_hash: ' + atHash);\n console.error('actual at_hash: ' + claimsAtHash);\n }\n\n return atHash === claimsAtHash;\n }\n\n /**\n * Infers the name of the hash algorithm to use\n * from the alg field of an id_token.\n *\n * @param jwtHeader the id_token's parsed header\n */\n protected inferHashAlgorithm(jwtHeader: object): string {\n const alg: string = jwtHeader['alg'];\n\n if (!alg.match(/^.S[0-9]{3}$/)) {\n throw new Error('Algorithm not supported: ' + alg);\n }\n\n return 'sha-' + alg.substr(2);\n }\n\n /**\n * Calculates the hash for the passed value by using\n * the passed hash algorithm.\n *\n * @param valueToHash\n * @param algorithm\n */\n protected abstract calcHash(\n valueToHash: string,\n algorithm: string\n ): Promise<string>;\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable()\nexport class UrlHelperService {\n public getHashFragmentParams(customHashFragment?: string): object {\n let hash = customHashFragment || window.location.hash;\n\n hash = decodeURIComponent(hash);\n\n if (hash.indexOf('#') !== 0) {\n return {};\n }\n\n const questionMarkPosition = hash.indexOf('?');\n\n if (questionMarkPosition > -1) {\n hash = hash.substr(questionMarkPosition + 1);\n } else {\n hash = hash.substr(1);\n }\n\n return this.parseQueryString(hash);\n }\n\n public parseQueryString(queryString: string): object {\n const data = {};\n let pair, separatorIndex, escapedKey, escapedValue, key, value;\n\n if (queryString === null) {\n return data;\n }\n\n const pairs = queryString.split('&');\n\n for (let i = 0; i < pairs.length; i++) {\n pair = pairs[i];\n separatorIndex = pair.indexOf('=');\n\n if (separatorIndex === -1) {\n escapedKey = pair;\n escapedValue = null;\n } else {\n escapedKey = pair.substr(0, separatorIndex);\n escapedValue = pair.substr(separatorIndex + 1);\n }\n\n key = decodeURIComponent(escapedKey);\n value = decodeURIComponent(escapedValue);\n\n if (key.substr(0, 1) === '/') {\n key = key.substr(1);\n }\n\n data[key] = value;\n }\n\n return data;\n }\n}\n","// Credits: https://github.com/dchest/fast-sha256-js/tree/master/src\n// We add this lib directly b/c the published version of fast-sha256-js\n// is commonjs and hence leads to a warning about tree-shakability emitted\n// by the Angular CLI\n\n// SHA-256 (+ HMAC and PBKDF2) for JavaScript.\n//\n// Written in 2014-2016 by Dmitry Chestnykh.\n// Public domain, no warranty.\n//\n// Functions (accept and return Uint8Arrays):\n//\n// sha256(message) -> hash\n// sha256.hmac(key, message) -> mac\n// sha256.pbkdf2(password, salt, rounds, dkLen) -> dk\n//\n// Classes:\n//\n// new sha256.Hash()\n// new sha256.HMAC(key)\n//\nexport const digestLength = 32;\nexport const blockSize = 64;\n\n// SHA-256 constants\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,\n 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\nfunction hashBlocks(\n w: Int32Array,\n v: Int32Array,\n p: Uint8Array,\n pos: number,\n len: number\n): number {\n let a: number,\n b: number,\n c: number,\n d: number,\n e: number,\n f: number,\n g: number,\n h: number,\n u: number,\n i: number,\n j: number,\n t1: number,\n t2: number;\n while (len >= 64) {\n a = v[0];\n b = v[1];\n c = v[2];\n d = v[3];\n e = v[4];\n f = v[5];\n g = v[6];\n h = v[7];\n\n for (i = 0; i < 16; i++) {\n j = pos + i * 4;\n w[i] =\n ((p[j] & 0xff) << 24) |\n ((p[j + 1] & 0xff) << 16) |\n ((p[j + 2] & 0xff) << 8) |\n (p[j + 3] & 0xff);\n }\n\n for (i = 16; i < 64; i++) {\n u = w[i - 2];\n t1 =\n ((u >>> 17) | (u << (32 - 17))) ^\n ((u >>> 19) | (u << (32 - 19))) ^\n (u >>> 10);\n\n u = w[i - 15];\n t2 =\n ((u >>> 7) | (u << (32 - 7))) ^\n ((u >>> 18) | (u << (32 - 18))) ^\n (u >>> 3);\n\n w[i] = ((t1 + w[i - 7]) | 0) + ((t2 + w[i - 16]) | 0);\n }\n\n for (i = 0; i < 64; i++) {\n t1 =\n ((((((e >>> 6) | (e << (32 - 6))) ^\n ((e >>> 11) | (e << (32 - 11))) ^\n ((e >>> 25) | (e << (32 - 25)))) +\n ((e & f) ^ (~e & g))) |\n 0) +\n ((h + ((K[i] + w[i]) | 0)) | 0)) |\n 0;\n\n t2 =\n ((((a >>> 2) | (a << (32 - 2))) ^\n ((a >>> 13) | (a << (32 - 13))) ^\n ((a >>> 22) | (a << (32 - 22)))) +\n ((a & b) ^ (a & c) ^ (b & c))) |\n 0;\n\n h = g;\n g = f;\n f = e;\n e = (d + t1) | 0;\n d = c;\n c = b;\n b = a;\n a = (t1 + t2) | 0;\n }\n\n v[0] += a;\n v[1] += b;\n v[2] += c;\n v[3] += d;\n v[4] += e;\n v[5] += f;\n v[6] += g;\n v[7] += h;\n\n pos += 64;\n len -= 64;\n }\n return pos;\n}\n\n// Hash implements SHA256 hash algorithm.\nexport class Hash {\n digestLength: number = digestLength;\n blockSize: number = blockSize;\n\n // Note: Int32Array is used instead of Uint32Array for performance reasons.\n private state: Int32Array = new Int32Array(8); // hash state\n private temp: Int32Array = new Int32Array(64); // temporary state\n private buffer: Uint8Array = new Uint8Array(128); // buffer for data to hash\n private bufferLength = 0; // number of bytes in buffer\n private bytesHashed = 0; // number of total bytes hashed\n\n finished = false; // indicates whether the hash was finalized\n\n constructor() {\n this.reset();\n }\n\n // Resets hash state making it possible\n // to re-use this instance to hash other data.\n reset(): this {\n this.state[0] = 0x6a09e667;\n this.state[1] = 0xbb67ae85;\n this.state[2] = 0x3c6ef372;\n this.state[3] = 0xa54ff53a;\n this.state[4] = 0x510e527f;\n this.state[5] = 0x9b05688c;\n this.state[6] = 0x1f83d9ab;\n this.state[7] = 0x5be0cd19;\n this.bufferLength = 0;\n this.bytesHashed = 0;\n this.finished = false;\n return this;\n }\n\n // Cleans internal buffers and re-initializes hash state.\n clean() {\n for (let i = 0; i < this.buffer.length; i++) {\n this.buffer[i] = 0;\n }\n for (let i = 0; i < this.temp.length; i++) {\n this.temp[i] = 0;\n }\n this.reset();\n }\n\n // Updates hash state with the given data.\n //\n // Optionally, length of the data can be specified to hash\n // fewer bytes than data.length.\n //\n // Throws error when trying to update already finalized hash:\n // instance must be reset to use it again.\n update(data: Uint8Array, dataLength: number = data.length): this {\n if (this.finished) {\n throw new Error(\"SHA256: can't update because hash was finished.\");\n }\n let dataPos = 0;\n this.bytesHashed += dataLength;\n if (this.bufferLength > 0) {\n while (this.bufferLength < 64 && dataLength > 0) {\n this.buffer[this.bufferLength++] = data[dataPos++];\n dataLength--;\n }\n if (this.bufferLength === 64) {\n hashBlocks(this.temp, this.state, this.buffer, 0, 64);\n this.bufferLength = 0;\n }\n }\n if (dataLength >= 64) {\n dataPos = hashBlocks(this.temp, this.state, data, dataPos, dataLength);\n dataLength %= 64;\n }\n while (dataLength > 0) {\n this.buffer[this.bufferLength++] = data[dataPos++];\n dataLength--;\n }\n return this;\n }\n\n // Finalizes hash state and puts hash into out.\n //\n // If hash was already finalized, puts the same value.\n finish(out: Uint8Array): this {\n if (!this.finished) {\n const bytesHashed = this.bytesHashed;\n const left = this.bufferLength;\n const bitLenHi = (bytesHashed / 0x20000000) | 0;\n const bitLenLo = bytesHashed << 3;\n const padLength = bytesHashed % 64 < 56 ? 64 : 128;\n\n this.buffer[left] = 0x80;\n for (let i = left + 1; i < padLength - 8; i++) {\n this.buffer[i] = 0;\n }\n this.buffer[padLength - 8] = (bitLenHi >>> 24) & 0xff;\n this.buffer[padLength - 7] = (bitLenHi >>> 16) & 0xff;\n this.buffer[padLength - 6] = (bitLenHi >>> 8) & 0xff;\n this.buffer[padLength - 5] = (bitLenHi >>> 0) & 0xff;\n this.buffer[padLength - 4] = (bitLenLo >>> 24) & 0xff;\n this.buffer[padLength - 3] = (bitLenLo >>> 16) & 0xff;\n this.buffer[padLength - 2] = (bitLenLo >>> 8) & 0xff;\n this.buffer[padLength - 1] = (bitLenLo >>> 0) & 0xff;\n\n hashBlocks(this.temp, this.state, this.buffer, 0, padLength);\n\n this.finished = true;\n }\n\n for (let i = 0; i < 8; i++) {\n out[i * 4 + 0] = (this.state[i] >>> 24) & 0xff;\n out[i * 4 + 1] = (this.state[i] >>> 16) & 0xff;\n out[i * 4 + 2] = (this.state[i] >>> 8) & 0xff;\n out[i * 4 + 3] = (this.state[i] >>> 0) & 0xff;\n }\n\n return this;\n }\n\n // Returns the final hash digest.\n digest(): Uint8Array {\n const out = new Uint8Array(this.digestLength);\n this.finish(out);\n return out;\n }\n\n // Internal function for use in HMAC for optimization.\n _saveState(out: Uint32Array) {\n for (let i = 0; i < this.state.length; i++) {\n out[i] = this.state[i];\n }\n }\n\n // Internal function for use in HMAC for optimization.\n _restoreState(from: Uint32Array, bytesHashed: number) {\n for (let i = 0; i < this.state.length; i++) {\n this.state[i] = from[i];\n }\n this.bytesHashed = bytesHashed;\n this.finished = false;\n this.bufferLength = 0;\n }\n}\n\n// HMAC implements HMAC-SHA256 message authentication algorithm.\nexport class HMAC {\n private inner: Hash = new Hash();\n private outer: Hash = new Hash();\n\n blockSize: number = this.inner.blockSize;\n digestLength: number = this.inner.digestLength;\n\n // Copies of hash states after keying.\n // Need for quick reset without hashing they key again.\n private istate: Uint32Array;\n private ostate: Uint32Array;\n\n constructor(key: Uint8Array) {\n const pad = new Uint8Array(this.blockSize);\n if (key.length > this.blockSize) {\n new Hash().update(key).finish(pad).clean();\n } else {\n for (let i = 0; i < key.length; i++) {\n pad[i] = key[i];\n }\n }\n for (let i = 0; i < pad.length; i++) {\n pad[i] ^= 0x36;\n }\n this.inner.update(pad);\n\n for (let i = 0; i < pad.length; i++) {\n pad[i] ^= 0x36 ^ 0x5c;\n }\n this.outer.update(pad);\n\n this.istate = new Uint32Array(8);\n this.ostate = new Uint32Array(8);\n\n this.inner._saveState(this.istate);\n this.outer._saveState(this.ostate);\n\n for (let i = 0; i < pad.length; i++) {\n pad[i] = 0;\n }\n }\n\n // Returns HMAC state to the state initialized with key\n // to make it possible to run HMAC over the other data with the same\n // key without creating a new instance.\n reset(): this {\n this.inner._restoreState(this.istate, this.inner.blockSize);\n this.outer._restoreState(this.ostate, this.outer.blockSize);\n return this;\n }\n\n // Cleans HMAC state.\n clean() {\n for (let i = 0; i < this.istate.length; i++) {\n this.ostate[i] = this.istate[i] = 0;\n }\n this.inner.clean();\n this.outer.clean();\n }\n\n // Updates state with provided data.\n update(data: Uint8Array): this {\n this.inner.update(data);\n return this;\n }\n\n // Finalizes HMAC and puts the result in out.\n finish(out: Uint8Array): this {\n if (this.outer.finished) {\n this.outer.finish(out);\n } else {\n this.inner.finish(out);\n this.outer.update(out, this.digestLength).finish(out);\n }\n return this;\n }\n\n // Returns message authentication code.\n digest(): Uint8Array {\n const out = new Uint8Array(this.digestLength);\n this.finish(out);\n return out;\n }\n}\n\n// Returns SHA256 hash of data.\nexport function hash(data: Uint8Array): Uint8Array {\n const h = new Hash().update(data);\n const digest = h.digest();\n h.clean();\n return digest;\n}\n\n// Function hash is both available as module.hash and as default export.\nexport default hash;\n\n// Returns HMAC-SHA256 of data under the key.\nexport function hmac(key: Uint8Array, data: Uint8Array) {\n const h = new HMAC(key).update(data);\n const digest = h.digest();\n h.clean();\n return digest;\n}\n\n// Fills hkdf buffer like this:\n// T(1) = HMAC-Hash(PRK, T(0) | info | 0x01)\nfunction fillBuffer(\n buffer: Uint8Array,\n hmac: HMAC,\n info: Uint8Array | undefined,\n counter: Uint8Array\n) {\n // Counter is a byte value: check if it overflowed.\n const num = counter[0];\n\n if (num === 0) {\n throw new Error('hkdf: cannot expand more');\n }\n\n // Prepare HMAC instance for new data with old key.\n hmac.reset();\n\n // Hash in previous output if it was generated\n // (i.e. counter is greater than 1).\n if (num > 1) {\n hmac.update(buffer);\n }\n\n // Hash in info if it exists.\n if (info) {\n hmac.update(info);\n }\n\n // Hash in the counter.\n hmac.update(counter);\n\n // Output result to buffer and clean HMAC instance.\n hmac.finish(buffer);\n\n // Increment counter inside typed array, this works properly.\n counter[0]++;\n}\n\nconst hkdfSalt = new Uint8Array(digestLength); // Filled with zeroes.\nexport function hkdf(\n key: Uint8Array,\n salt: Uint8Array = hkdfSalt,\n info?: Uint8Array,\n length = 32\n) {\n const counter = new Uint8Array([1]);\n\n // HKDF-Extract uses salt as HMAC key, and key as data.\n const okm = hmac(salt, key);\n\n // Initialize HMAC for expanding with extracted key.\n // Ensure no collisions with `hmac` function.\n const hmac_ = new HMAC(okm);\n\n // Allocate buffer.\n const buffer = new Uint8Array(hmac_.digestLength);\n let bufpos = buffer.length;\n\n const out = new Uint8Array(length);\n for (let i = 0; i < length; i++) {\n if (bufpos === buffer.length) {\n fillBuffer(buffer, hmac_, info, counter);\n bufpos = 0;\n }\n out[i] = buffer[bufpos++];\n }\n\n hmac_.clean();\n buffer.fill(0);\n counter.fill(0);\n return out;\n}\n\n// Derives a key from password and salt using PBKDF2-HMAC-SHA256\n// with the given number of iterations.\n//\n// The number of bytes returned is equal to dkLen.\n//\n// (For better security, avoid dkLen greater than hash length - 32 bytes).\nexport function pbkdf2(\n password: Uint8Array,\n salt: Uint8Array,\n iterations: number,\n dkLen: number\n) {\n const prf = new HMAC(password);\n const len = prf.digestLength;\n const ctr = new Uint8Array(4);\n const t = new Uint8Array(len);\n const u = new Uint8Array(len);\n const dk = new Uint8Array(dkLen);\n\n for (let i = 0; i * len < dkLen; i++) {\n const c = i + 1;\n ctr[0] = (c >>> 24) & 0xff;\n ctr[1] = (c >>> 16) & 0xff;\n ctr[2] = (c >>> 8) & 0xff;\n ctr[3] = (c >>> 0) & 0xff;\n prf.reset();\n prf.update(salt);\n prf.update(ctr);\n prf.finish(u);\n for (let j = 0; j < len; j++) {\n t[j] = u[j];\n }\n for (let j = 2; j <= iterations; j++) {\n prf.reset();\n prf.update(u).finish(u);\n for (let k = 0; k < len; k++) {\n t[k] ^= u[k];\n }\n }\n for (let j = 0; j < len && i * len + j < dkLen; j++) {\n dk[i * len + j] = t[j];\n }\n }\n for (let i = 0; i < len; i++) {\n t[i] = u[i] = 0;\n }\n for (let i = 0; i < 4; i++) {\n ctr[i] = 0;\n }\n prf.clean();\n return dk;\n}\n","import { Injectable } from '@angular/core';\n\nimport { factory } from './js-sha256';\n// const sha256 = factory();\n\nimport fsha256 from './fast-sha256js';\n\n/**\n * Abstraction for crypto algorithms\n */\nexport abstract class HashHandler {\n abstract calcHash(valueToHash: string, algorithm: string): Promise<string>;\n}\n\nfunction decodeUTF8(s) {\n if (typeof s !== 'string') throw new TypeError('expected string');\n const d = s,\n b = new Uint8Array(d.length);\n for (let i = 0; i < d.length; i++) b[i] = d.charCodeAt(i);\n return b;\n}\n\nfunction encodeUTF8(arr) {\n const s = [];\n for (let i = 0; i < arr.length; i++) s.push(String.fromCharCode(arr[i]));\n return s.join('');\n}\n\n@Injectable()\nexport class DefaultHashHandler implements HashHandler {\n async calcHash(valueToHash: string, algorithm: string): Promise<string> {\n // const encoder = new TextEncoder();\n // const hashArray = await window.crypto.subtle.digest(algorithm, data);\n // const data = encoder.encode(valueToHash);\n\n // const fhash = fsha256(valueToHash);\n\n const candHash = encodeUTF8(fsha256(decodeUTF8(valueToHash)));\n\n // const hashArray = (sha256 as any).array(valueToHash);\n // // const hashString = this.toHashString(hashArray);\n // const hashString = this.toHashString2(hashArray);\n\n // console.debug('hash orig - cand', candHash, hashString);\n // alert(1);\n\n return candHash;\n }\n\n toHashString2(byteArray: number[]) {\n let result = '';\n for (const e of byteArray) {\n result += String.fromCharCode(e);\n }\n return result;\n }\n\n toHashString(buffer: ArrayBuffer) {\n const byteArray = new Uint8Array(buffer);\n let result = '';\n for (const e of byteArray) {\n result += String.fromCharCode(e);\n }\n return result;\n }\n\n // hexString(buffer) {\n // const byteArray = new Uint8Array(buffer);\n // const hexCodes = [...byteArray].map(value => {\n // const hexCode = value.toString(16);\n // const paddedHexCode = hexCode.padStart(2, '0');\n // return paddedHexCode;\n // });\n\n // return hexCodes.join('');\n // }\n\n // toHashString(hexString: string) {\n // let result = '';\n // for (let i = 0; i < hexString.length; i += 2) {\n // let hexDigit = hexString.charAt(i) + hexString.charAt(i + 1);\n // let num = parseInt(hexDigit, 16);\n // result += String.fromCharCode(num);\n // }\n // return result;\n // }\n}\n","import { Injectable, NgZone, Optional, OnDestroy, Inject } from '@angular/core';\nimport {\n HttpClient,\n HttpHeaders,\n HttpParams,\n HttpErrorResponse,\n} from '@angular/common/http';\nimport {\n Observable,\n Subject,\n Subscription,\n of,\n race,\n from,\n combineLatest,\n throwError,\n} from 'rxjs';\nimport {\n filter,\n delay,\n first,\n tap,\n map,\n switchMap,\n debounceTime,\n catchError,\n} from 'rxjs/operators';\nimport { DOCUMENT } from '@angular/common';\nimport { DateTimeProvider } from './date-time-provider';\n\nimport {\n ValidationHandler,\n ValidationParams,\n} from './token-validation/validation-handler';\nimport { UrlHelperService } from './url-helper.service';\nimport {\n OAuthEvent,\n OAuthInfoEvent,\n OAuthErrorEvent,\n OAuthSuccessEvent,\n} from './events';\nimport {\n OAuthLogger,\n OAuthStorage,\n LoginOptions,\n ParsedIdToken,\n OidcDiscoveryDoc,\n TokenResponse,\n} from './types';\nimport { b64DecodeUnicode, base64UrlEncode } from './base64-helper';\nimport { AuthConfig } from './auth.config';\nimport { WebHttpUrlEncodingCodec } from './encoder';\nimport { HashHandler } from './token-validation/hash-handler';\n\n/**\n * Service for logging in and logging out with\n * OIDC and OAuth2. Supports implicit flow and\n * password flow.\n */\n@Injectable()\nexport class OAuthService extends AuthConfig implements OnDestroy {\n // Extending AuthConfig ist just for LEGACY reasons\n // to not break existing code.\n\n /**\n * The ValidationHandler used to validate received\n * id_tokens.\n */\n public tokenValidationHandler: ValidationHandler;\n\n /**\n * @internal\n * Deprecated: use property events instead\n */\n public discoveryDocumentLoaded = false;\n\n /**\n * @internal\n * Deprecated: use property events instead\n */\n public discoveryDocumentLoaded$: Observable<OidcDiscoveryDoc>;\n\n /**\n * Informs about events, like token_received or token_expires.\n * See the string enum EventType for a full list of event types.\n */\n public events: Observable<OAuthEvent>;\n\n /**\n * The received (passed around) state, when logging\n * in with implicit flow.\n */\n public state? = '';\n\n protected eventsSubject: Subject<OAuthEvent> = new Subject<OAuthEvent>();\n protected discoveryDocumentLoadedSubject: Subject<OidcDiscoveryDoc> =\n new Subject<OidcDiscoveryDoc>();\n protected silentRefreshPostMessageEventListener: EventListener;\n protected grantTypesSupported: Array<string> = [];\n protected _storage: OAuthStorage;\n protected accessTokenTimeoutSubscription: Subscription;\n protected idTokenTimeoutSubscription: Subscription;\n protected tokenReceivedSubscription: Subscription;\n protected automaticRefreshSubscription: Subscription;\n protected sessionCheckEventListener: EventListener;\n protected jwksUri: string;\n protected sessionCheckTimer: any;\n protected silentRefreshSubject: string;\n protected inImplicitFlow = false;\n\n protected saveNoncesInLocalStorage = false;\n private document: Document;\n\n constructor(\n protected ngZone: NgZone,\n protected http: HttpClient,\n @Optional() storage: OAuthStorage,\n @Optional() tokenValidationHandler: ValidationHandler,\n @Optional() protected config: AuthConfig,\n protected urlHelper: UrlHelperService,\n protected logger: OAuthLogger,\n @Optional() protected crypto: HashHandler,\n @Inject(DOCUMENT) document: Document,\n protected dateTimeService: DateTimeProvider\n ) {\n super();\n\n this.debug('angular-oauth2-oidc v10');\n\n // See https://github.com/manfredsteyer/angular-oauth2-oidc/issues/773 for why this is needed\n this.document = document;\n\n if (!config) {\n config = {};\n }\n\n this.discoveryDocumentLoaded$ =\n this.discoveryDocumentLoadedSubject.asObservable();\n this.events = this.eventsSubject.asObservable();\n\n if (tokenValidationHandler) {\n this.tokenValidationHandler = tokenValidationHandler;\n }\n\n if (config) {\n this.configure(config);\n }\n\n try {\n if (storage) {\n this.setStorage(storage);\n } else if (typeof sessionStorage !== 'undefined') {\n this.setStorage(sessionStorage);\n }\n } catch (e) {\n console.error(\n 'No OAuthStorage provided and cannot access default (sessionStorage).' +\n 'Consider providing a custom OAuthStorage implementation in your module.',\n e\n );\n }\n\n // in IE, sessionStorage does not always survive a redirect\n if (this.checkLocalStorageAccessable()) {\n const ua = window?.navigator?.userAgent;\n const msie = ua?.includes('MSIE ') || ua?.includes('Trident');\n\n if (msie) {\n this.saveNoncesInLocalStorage = true;\n }\n }\n\n this.setupRefreshTimer();\n }\n\n private checkLocalStorageAccessable() {\n if (typeof window === 'undefined') return false;\n\n const test = 'test';\n try {\n if (typeof window['localStorage'] === 'undefined') return false;\n\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n }\n\n /**\n * Use this method to configure the service\n * @param config the configuration\n */\n public configure(config: AuthConfig): void {\n // For the sake of downward compatibility with\n // original configuration API\n Object.assign(this, new AuthConfig(), config);\n\n this.config = Object.assign({} as AuthConfig, new AuthConfig(), config);\n\n if (this.sessionChecksEnabled) {\n this.setupSessionCheck();\n }\n\n this.configChanged();\n }\n\n protected configChanged(): void {\n this.setupRefreshTimer();\n }\n\n public restartSessionChecksIfStillLoggedIn(): void {\n if (this.hasValidIdToken()) {\n this.initSessionCheck();\n }\n }\n\n protected restartRefreshTimerIfStillLoggedIn(): void {\n this.setupExpirationTimers();\n }\n\n protected setupSessionCheck(): void {\n this.events\n .pipe(filter((e) => e.type === 'token_received'))\n .subscribe(() => {\n this.initSessionCheck();\n });\n }\n\n /**\n * Will setup up silent refreshing for when the token is\n * about to expire. When the user is logged out via this.logOut method, the\n * silent refreshing will pause and not refresh the tokens until the user is\n * logged back in via receiving a new token.\n * @param params Additional parameter to pass\n * @param listenTo Setup automatic refresh of a specific token type\n */\n public setupAutomaticSilentRefresh(\n params: object = {},\n listenTo?: 'access_token' | 'id_token' | 'any',\n noPrompt = true\n ): void {\n let shouldRunSilentRefresh = true;\n this.clearAutomaticRefreshTimer();\n this.automaticRefreshSubscription = this.events\n .pipe(\n tap((e) => {\n if (e.type === 'token_received') {\n shouldRunSilentRefresh = true;\n } else if (e.type === 'logout') {\n shouldRunSilentRefresh = false;\n }\n }),\n filter(\n (e: OAuthInfoEvent) =>\n e.type === 'token_expires' &&\n (listenTo == null || listenTo === 'any' || e.info === listenTo)\n ),\n debounceTime(1000)\n )\n .subscribe(() => {\n if (shouldRunSilentRefresh) {\n // this.silentRefresh(params, noPrompt).catch(_ => {\n this.refreshInternal(params, noPrompt).catch(() => {\n this.debug('Automatic silent refresh did not work');\n });\n }\n });\n\n this.restartRefreshTimerIfStillLoggedIn();\n }\n\n protected refreshInternal(\n params,\n noPrompt\n ): Promise<TokenResponse | OAuthEvent> {\n if (!this.useSilentRefresh && this.responseType === 'code') {\n return this.refreshToken();\n } else {\n return this.silentRefresh(params, noPrompt);\n }\n }\n\n /**\n * Convenience method that first calls `loadDiscoveryDocument(...)` and\n * directly chains using the `then(...)` part of the promise to call\n * the `tryLogin(...)` method.\n *\n * @param options LoginOptions to pass through to `tryLogin(...)`\n */\n public loadDiscoveryDocumentAndTryLogin(\n options: LoginOptions = null\n ): Promise<boolean> {\n return this.loadDiscoveryDocument().then(() => {\n return this.tryLogin(options);\n });\n }\n\n /**\n * Convenience method that first calls `loadDiscoveryDocumentAndTryLogin(...)`\n * and if then chains to `initLoginFlow()`, but only if there is no valid\n * IdToken or no valid AccessToken.\n *\n * @param options LoginOptions to pass through to `tryLogin(...)`\n */\n public loadDiscoveryDocumentAndLogin(\n options: LoginOptions & { state?: string } = null\n ): Promise<boolean> {\n options = options || {};\n return this.loadDiscoveryDocumentAndTryLogin(options).then(() => {\n if (!this.hasValidIdToken() || !this.hasValidAccessToken()) {\n const state = typeof options.state === 'string' ? options.state : '';\n this.initLoginFlow(state);\n return false;\n } else {\n return true;\n }\n });\n }\n\n protected debug(...args): void {\n if (this.showDebugInformation) {\n this.logger.debug(...args);\n }\n }\n\n protected validateUrlFromDiscoveryDocument(url: string): string[] {\n const errors: string[] = [];\n const httpsCheck = this.validateUrlForHttps(url);\n const issuerCheck = this.validateUrlAgainstIssuer(url);\n\n if (!httpsCheck) {\n errors.push(\n 'https for all urls required. Also for urls received by discovery.'\n );\n }\n\n if (!issuerCheck) {\n errors.push(\n 'Every url in discovery document has to start with the issuer url.' +\n 'Also see property strictDiscoveryDocumentValidation.'\n );\n }\n\n return errors;\n }\n\n protected validateUrlForHttps(url: string): boolean {\n if (!url) {\n return true;\n }\n\n const lcUrl = url.toLowerCase();\n\n if (this.requireHttps === false) {\n return true;\n }\n\n if (\n (lcUrl.match(/^http:\\/\\/localhost($|[:/])/) ||\n lcUrl.match(/^http:\\/\\/localhost($|[:/])/)) &&\n this.requireHttps === 'remoteOnly'\n ) {\n return true;\n }\n\n return lcUrl.startsWith('https://');\n }\n\n protected assertUrlNotNullAndCorrectProtocol(\n url: string | undefined,\n description: string\n ) {\n if (!url) {\n throw new Error(`'${description}' should not be null`);\n }\n if (!this.validateUrlForHttps(url)) {\n throw new Error(\n `'${description}' must use HTTPS (with TLS), or config value for property 'requireHttps' must be set to 'false' and allow HTTP (without TLS).`\n );\n }\n }\n\n protected validateUrlAgainstIssuer(url: string) {\n if (!this.strictDiscoveryDocumentValidation) {\n return true;\n }\n if (!url) {\n return true;\n }\n return url.toLowerCase().startsWith(this.issuer.toLowerCase());\n }\n\n protected setupRefreshTimer(): void {\n if (typeof window === 'undefined') {\n this.debug('timer not supported on this plattform');\n return;\n }\n\n if (this.hasValidIdToken() || this.hasValidAccessToken()) {\n this.clearAccessTokenTimer();\n this.clearIdTokenTimer();\n this.setupExpirationTimers();\n }\n\n if (this.tokenReceivedSubscription)\n this.tokenReceivedSubscription.unsubscribe();\n\n this.tokenReceivedSubscription = this.events\n .pipe(filter((e) => e.type === 'token_received'))\n .subscribe(() => {\n this.clearAccessTokenTimer();\n this.clearIdTokenTimer();\n this.setupExpirationTimers();\n });\n }\n\n protected setupExpirationTimers(): void {\n if (this.hasValidAccessToken()) {\n this.setupAccessTokenTimer();\n }\n\n if (!this.disableIdTokenTimer && this.hasValidIdToken()) {\n this.setupIdTokenTimer();\n }\n }\n\n protected setupAccessTokenTimer(): void {\n const expiration = this.getAccessTokenExpiration();\n const storedAt = this.getAccessTokenStoredAt();\n const timeout = this.calcTimeout(storedAt, expiration);\n\n this.ngZone.runOutsideAngular(() => {\n this.accessTokenTimeoutSubscription = of(\n new OAuthInfoEvent('token_expires', 'access_token')\n )\n .pipe(delay(timeout))\n .subscribe((e) => {\n this.ngZone.run(() => {\n this.eventsSubject.next(e);\n });\n });\n });\n }\n\n protected setupIdTokenTimer(): void {\n const expiration = this.getIdTokenExpiration();\n const storedAt = this.getIdTokenStoredAt();\n const timeout = this.calcTimeout(storedAt, expiration);\n\n this.ngZone.runOutsideAngular(() => {\n this.idTokenTimeoutSubscription = of(\n new OAuthInfoEvent('token_expires', 'id_token')\n )\n .pipe(delay(timeout))\n .subscribe((e) => {\n this.ngZone.run(() => {\n this.eventsSubject.next(e);\n });\n });\n });\n }\n\n /**\n * Stops timers for automatic refresh.\n * To restart it, call setupAutomaticSilentRefresh again.\n */\n public stopAutomaticRefresh() {\n this.clearAccessTokenTimer();\n this.clearIdTokenTimer();\n this.clearAutomaticRefreshTimer();\n }\n\n protected clearAccessTokenTimer(): void {\n if (this.accessTokenTimeoutSubscription) {\n this.accessTokenTimeoutSubscription.unsubscribe();\n }\n }\n\n protected clearIdTokenTimer(): void {\n if (this.idTokenTimeoutSubscription) {\n this.idTokenTimeoutSubscription.unsubscribe();\n }\n }\n\n protected clearAutomaticRefreshTimer(): void {\n if (this.automaticRefreshSubscription) {\n this.automaticRefreshSubscription.unsubscribe();\n }\n }\n\n protected calcTimeout(storedAt: number, expiration: number): number {\n const now = this.dateTimeService.now();\n const delta =\n (expiration - storedAt) * this.timeoutFactor - (now - storedAt);\n const duration = Math.max(0, delta);\n const maxTimeoutValue = 2_147_483_647;\n return duration > maxTimeoutValue ? maxTimeoutValue : duration;\n }\n\n /**\n * DEPRECATED. Use a provider for OAuthStorage instead:\n *\n * { provide: OAuthStorage, useFactory: oAuthStorageFactory }\n * export function oAuthStorageFactory(): OAuthStorage { return localStorage; }\n * Sets a custom storage used to store the received\n * tokens on client side. By default, the browser's\n * sessionStorage is used.\n * @ignore\n *\n * @param storage\n */\n public setStorage(storage: OAuthStorage): void {\n this._storage = storage;\n this.configChanged();\n }\n\n /**\n * Loads the discovery document to configure most\n * properties of this service. The url of the discovery\n * document is infered from the issuer's url according\n * to the OpenId Connect spec. To use another url you\n * can pass it to to optional parameter fullUrl.\n *\n * @param fullUrl\n */\n public loadDiscoveryDocument(\n fullUrl: string = null\n ): Promise<OAuthSuccessEvent> {\n return new Promise((resolve, reject) => {\n if (!fullUrl) {\n fullUrl = this.issuer || '';\n if (!fullUrl.endsWith('/')) {\n fullUrl += '/';\n }\n fullUrl += '.well-known/openid-configuration';\n }\n\n if (!this.validateUrlForHttps(fullUrl)) {\n reject(\n \"issuer must use HTTPS (with TLS), or config value for property 'requireHttps' must be set to 'false' and allow HTTP (without TLS).\"\n );\n return;\n }\n\n this.http.get<OidcDiscoveryDoc>(fullUrl).subscribe(\n (doc) => {\n if (!this.validateDiscoveryDocument(doc)) {\n this.eventsSubject.next(\n new OAuthErrorEvent('discovery_document_validation_error', null)\n );\n reject('discovery_document_validation_error');\n return;\n }\n\n this.loginUrl = doc.authorization_endpoint;\n this.logoutUrl = doc.end_session_endpoint || this.logoutUrl;\n this.grantTypesSupported = doc.grant_types_supported;\n this.issuer = doc.issuer;\n this.tokenEndpoint = doc.token_endpoint;\n this.userinfoEndpoint =\n doc.userinfo_endpoint || this.userinfoEndpoint;\n this.jwksUri = doc.jwks_uri;\n this.sessionCheckIFrameUrl =\n doc.check_session_iframe || this.sessionCheckIFrameUrl;\n\n this.discoveryDocumentLoaded = true;\n this.discoveryDocumentLoadedSubject.next(doc);\n this.revocationEndpoint =\n doc.revocation_endpoint || this.revocationEndpoint;\n\n if (this.sessionChecksEnabled) {\n this.restartSessionChecksIfStillLoggedIn();\n }\n\n this.loadJwks()\n .then((jwks) => {\n const result: object = {\n discoveryDocument: doc,\n jwks: jwks,\n };\n\n const event = new OAuthSuccessEvent(\n 'discovery_document_loaded',\n result\n );\n this.eventsSubject.next(event);\n resolve(event);\n return;\n })\n .catch((err) => {\n this.eventsSubject.next(\n new OAuthErrorEvent('discovery_document_load_error', err)\n );\n reject(err);\n return;\n });\n },\n (err) => {\n this.logger.error('error loading discovery document', err);\n this.eventsSubject.next(\n new OAuthErrorEvent('discovery_document_load_error', err)\n );\n reject(err);\n }\n );\n });\n }\n\n protected loadJwks(): Promise<object> {\n return new Promise<object>((resolve, reject) => {\n if (this.jwksUri) {\n this.http.get(this.jwksUri).subscribe(\n (jwks) => {\n this.jwks = jwks;\n // this.eventsSubject.next(\n // new OAuthSuccessEvent('discovery_document_loaded')\n // );\n resolve(jwks);\n },\n (err) => {\n this.logger.error('error loading jwks', err);\n this.eventsSubject.next(\n new OAuthErrorEvent('jwks_load_error', err)\n );\n reject(err);\n }\n );\n } else {\n resolve(null);\n }\n });\n }\n\n protected validateDiscoveryDocument(doc: OidcDiscoveryDoc): boolean {\n let errors: string[];\n\n if (!this.skipIssuerCheck && doc.issuer !== this.issuer) {\n this.logger.error(\n 'invalid issuer in discovery document',\n 'expected: ' + this.issuer,\n 'current: ' + doc.issuer\n );\n return false;\n }\n\n errors = this.validateUrlFromDiscoveryDocument(doc.authorization_endpoint);\n if (errors.length > 0) {\n this.logger.error(\n 'error validating authorization_endpoint in discovery document',\n errors\n );\n return false;\n }\n\n errors = this.validateUrlFromDiscoveryDocument(doc.end_session_endpoint);\n if (errors.length > 0) {\n this.logger.error(\n 'error validating end_session_endpoint in discovery document',\n errors\n );\n return false;\n }\n\n errors = this.validateUrlFromDiscoveryDocument(doc.token_endpoint);\n if (errors.length > 0) {\n this.logger.error(\n 'error validating token_endpoint in discovery document',\n errors\n );\n }\n\n errors = this.validateUrlFromDiscoveryDocument(doc.revocation_endpoint);\n if (errors.length > 0) {\n this.logger.error(\n 'error validating revocation_endpoint in discovery document',\n errors\n );\n }\n\n errors = this.validateUrlFromDiscoveryDocument(doc.userinfo_endpoint);\n if (errors.length > 0) {\n this.logger.error(\n 'error validating userinfo_endpoint in discovery document',\n errors\n );\n return false;\n }\n\n errors = this.validateUrlFromDiscoveryDocument(doc.jwks_uri);\n if (errors.length > 0) {\n this.logger.error(\n 'error validating jwks_uri in discovery document',\n errors\n );\n return false;\n }\n\n if (this.sessionChecksEnabled && !doc.check_session_iframe) {\n this.logger.warn(\n 'sessionChecksEnabled is activated but discovery document' +\n ' does not contain a check_session_iframe field'\n );\n }\n\n return true;\n }\n\n /**\n * Uses password flow to exchange userName and password for an\n * access_token. After receiving the access_token, this method\n * uses it to query the userinfo endpoint in order to get information\n * about the user in question.\n *\n * When using this, make sure that the property oidc is set to false.\n * Otherwise stricter validations take place that make this operation\n * fail.\n *\n * @param userName\n * @param password\n * @param headers Optional additional http-headers.\n */\n public fetchTokenUsingPasswordFlowAndLoadUserProfile(\n userName: string,\n password: string,\n headers: HttpHeaders = new HttpHeaders()\n ): Promise<object> {\n return this.fetchTokenUsingPasswordFlow(userName, password, headers).then(\n () => this.loadUserProfile()\n );\n }\n\n /**\n * Loads the user profile by accessing the user info endpoint defined by OpenId Connect.\n *\n * When using this with OAuth2 password flow, make sure that the property oidc is set to false.\n * Otherwise stricter validations take place that make this operation fail.\n */\n public loadUserProfile(): Promise<object> {\n if (!this.hasValidAccessToken()) {\n throw new Error('Can not load User Profile without access_token');\n }\n if (!this.validateUrlForHttps(this.userinfoEndpoint)) {\n throw new Error(\n \"userinfoEndpoint must use HTTPS (with TLS), or config value for property 'requireHttps' must be set to 'false' and allow HTTP (without TLS).\"\n );\n }\n\n return new Promise((resolve, reject) => {\n const headers = new HttpHeaders().set(\n 'Authorization',\n 'Bearer ' + this.getAccessToken()\n );\n\n this.http\n .get(this.userinfoEndpoint, {\n headers,\n observe: 'response',\n responseType: 'text',\n })\n .subscribe(\n (response) => {\n this.debug('userinfo received', JSON.stringify(response));\n if (\n response.headers\n .get('content-type')\n .startsWith('application/json')\n ) {\n let info = JSON.parse(response.body);\n const existingClaims = this.getIdentityClaims() || {};\n\n if (!this.skipSubjectCheck) {\n if (\n this.oidc &&\n (!existingClaims['sub'] || info.sub !== existingClaims['sub'])\n ) {\n const err =\n 'if property oidc is true, the received user-id (sub) has to be the user-id ' +\n 'of the user that has logged in with oidc.\\n' +\n 'if you are not using oidc but just oauth2 password flow set oidc to false';\n\n reject(err);\n return;\n }\n }\n\n info = Object.assign({}, existingClaims, info);\n\n this._storage.setItem(\n 'id_token_claims_obj',\n JSON.stringify(info)\n );\n this.eventsSubject.next(\n new OAuthSuccessEvent('user_profile_loaded')\n );\n resolve({ info });\n } else {\n this.debug('userinfo is not JSON, treating it as JWE/JWS');\n this.eventsSubject.next(\n new OAuthSuccessEvent('user_profile_loaded')\n );\n resolve(JSON.parse(response.body));\n }\n },\n (err) => {\n this.logger.error('error loading user info', err);\n this.eventsSubject.next(\n new OAuthErrorEvent('user_profile_load_error', err)\n );\n reject(err);\n }\n );\n });\n }\n\n /**\n * Uses password flow to exchange userName and password for an access_token.\n * @param userName\n * @param password\n * @param headers Optional additional http-headers.\n */\n public fetchTokenUsingPasswordFlow(\n userName: string,\n password: string,\n headers: HttpHeaders = new HttpHeaders()\n ): Promise<TokenResponse> {\n const parameters = {\n username: userName,\n password: password,\n };\n return this.fetchTokenUsingGrant('password', parameters, headers);\n }\n\n /**\n * Uses a custom grant type to retrieve tokens.\n * @param grantType Grant type.\n * @param parameters Parameters to pass.\n * @param headers Optional additional HTTP headers.\n */\n public fetchTokenUsingGrant(\n grantType: string,\n parameters: object,\n headers: HttpHeaders = new HttpHeaders()\n ): Promise<TokenResponse> {\n this.assertUrlNotNullAndCorrectProtocol(\n this.tokenEndpoint,\n 'tokenEndpoint'\n );\n\n /**\n * A `HttpParameterCodec` that uses `encodeURIComponent` and `decodeURIComponent` to\n * serialize and parse URL parameter keys and values.\n *\n * @stable\n */\n let params = new HttpParams({ encoder: new WebHttpUrlEncodingCodec() })\n .set('grant_type', grantType)\n .set('scope', this.scope);\n\n if (this.useHttpBasicAuth) {\n const header = btoa(`${this.clientId}:${this.dummyClientSecret}`);\n headers = headers.set('Authorization', 'Basic ' + header);\n }\n\n if (!this.useHttpBasicAuth) {\n params = params.set('client_id', this.clientId);\n }\n\n if (!this.useHttpBasicAuth && this.dummyClientSecret) {\n params = params.set('client_secret', this.dummyClientSecret);\n }\n\n if (this.customQueryParams) {\n for (const key of Object.getOwnPropertyNames(this.customQueryParams)) {\n params = params.set(key, this.customQueryParams[key]);\n }\n }\n\n // set explicit parameters last, to allow overwriting\n for (const key of Object.keys(parameters)) {\n params = params.set(key, parameters[key]);\n }\n\n headers = headers.set('Content-Type', 'application/x-www-form-urlencoded');\n\n return new Promise((resolve, reject) => {\n this.http\n .post<TokenResponse>(this.tokenEndpoint, params, { headers })\n .subscribe(\n (tokenResponse) => {\n this.debug('tokenResponse', tokenResponse);\n this.storeAccessTokenResponse(\n tokenResponse.access_token,\n tokenResponse.refresh_token,\n tokenResponse.expires_in ||\n this.fallbackAccessTokenExpirationTimeInSec,\n tokenResponse.scope,\n this.extractRecognizedCustomParameters(tokenResponse)\n );\n if (this.oidc && tokenResponse.id_token) {\n this.processIdToken(\n tokenResponse.id_token,\n tokenResponse.access_token\n ).then((result) => {\n this.storeIdToken(result);\n resolve(tokenResponse);\n });\n }\n this.eventsSubject.next(new OAuthSuccessEvent('token_received'));\n resolve(tokenResponse);\n },\n (err) => {\n this.logger.error('Error performing ${grantType} flow', err);\n this.eventsSubject.next(new OAuthErrorEvent('token_error', err));\n reject(err);\n }\n );\n });\n }\n\n /**\n * Refreshes the token using a refresh_token.\n * This does not work for implicit flow, b/c\n * there is no refresh_token in this flow.\n * A solution for this is provided by the\n * method silentRefresh.\n */\n public refreshToken(): Promise<TokenResponse> {\n this.assertUrlNotNullAndCorrectProtocol(\n this.tokenEndpoint,\n 'tokenEndpoint'\n );\n return new Promise((resolve, reject) => {\n let params = new HttpParams({ encoder: new WebHttpUrlEncodingCodec() })\n .set('grant_type', 'refresh_token')\n .set('scope', this.scope)\n .set('refresh_token', this._storage.getItem('refresh_token'));\n\n let headers = new HttpHeaders().set(\n 'Content-Type',\n 'application/x-www-form-urlencoded'\n );\n\n if (this.useHttpBasicAuth) {\n const header = btoa(`${this.clientId}:${this.dummyClientSecret}`);\n headers = headers.set('Authorization', 'Basic ' + header);\n }\n\n if (!this.useHttpBasicAuth) {\n params = params.set('client_id', this.clientId);\n }\n\n if (!this.useHttpBasicAuth && this.dummyClientSecret) {\n params = params.set('client_secret', this.dummyClientSecret);\n }\n\n if (this.customQueryParams) {\n for (const key of Object.getOwnPropertyNames(this.customQueryParams)) {\n params = params.set(key, this.customQueryParams[key]);\n }\n }\n\n this.http\n .post<TokenResponse>(this.tokenEndpoint, params, { headers })\n .pipe(\n switchMap((tokenResponse) => {\n if (this.oidc && tokenResponse.id_token) {\n return from(\n this.processIdToken(\n tokenResponse.id_token,\n tokenResponse.access_token,\n true\n )\n ).pipe(\n tap((result) => this.storeIdToken(result)),\n map(() => tokenResponse)\n );\n } else {\n return of(tokenResponse);\n }\n })\n )\n .subscribe(\n (tokenResponse) => {\n this.debug('refresh tokenResponse', tokenResponse);\n this.storeAccessTokenResponse(\n tokenResponse.access_token,\n tokenResponse.refresh_token,\n tokenResponse.expires_in ||\n this.fallbackAccessTokenExpirationTimeInSec,\n tokenResponse.scope,\n this.extractRecognizedCustomParameters(tokenResponse)\n );\n\n this.eventsSubject.next(new OAuthSuccessEvent('token_received'));\n this.eventsSubject.next(new OAuthSuccessEvent('token_refreshed'));\n resolve(tokenResponse);\n },\n (err) => {\n this.logger.error('Error refreshing token', err);\n this.eventsSubject.next(\n new OAuthErrorEvent('token_refresh_error', err)\n );\n reject(err);\n }\n );\n });\n }\n\n protected removeSilentRefreshEventListener(): void {\n if (this.silentRefreshPostMessageEventListener) {\n window.removeEventListener(\n 'message',\n this.silentRefreshPostMessageEventListener\n );\n this.silentRefreshPostMessageEventListener = null;\n }\n }\n\n protected setupSilentRefreshEventListener(): void {\n this.removeSilentRefreshEventListener();\n\n this.silentRefreshPostMessageEventListener = (e: MessageEvent) => {\n const message = this.processMessageEventMessage(e);\n\n if (this.checkOrigin && e.origin !== location.origin) {\n console.error('wrong origin requested silent refresh!');\n }\n\n this.tryLogin({\n customHashFragment: message,\n preventClearHashAfterLogin: true,\n customRedirectUri: this.silentRefreshRedirectUri || this.redirectUri,\n }).catch((err) =>\n this.debug('tryLogin during silent refresh failed', err)\n );\n };\n\n window.addEventListener(\n 'message',\n this.silentRefreshPostMessageEventListener\n );\n }\n\n /**\n * Performs a silent refresh for implicit flow.\n * Use this method to get new tokens when/before\n * the existing tokens expire.\n */\n public silentRefresh(\n params: object = {},\n noPrompt = true\n ): Promise<OAuthEvent> {\n const claims: object = this.getIdentityClaims() || {};\n\n if (this.useIdTokenHintForSilentRefresh && this.hasValidIdToken()) {\n params['id_token_hint'] = this.getIdToken();\n }\n\n if (!this.validateUrlForHttps(this.loginUrl)) {\n throw new Error(\n \"loginUrl must use HTTPS (with TLS), or config value for property 'requireHttps' must be set to 'false' and allow HTTP (without TLS).\"\n );\n }\n\n if (typeof this.document === 'undefined') {\n throw new Error('silent refresh is not supported on this platform');\n }\n\n const existingIframe = this.document.getElementById(\n this.silentRefreshIFrameName\n );\n\n if (existingIframe) {\n this.document.body.removeChild(existingIframe);\n }\n\n this.silentRefreshSubject = claims['sub'];\n\n const iframe = this.document.createElement('iframe');\n iframe.id = this.silentRefreshIFrameName;\n\n this.setupSilentRefreshEventListener();\n\n const redirectUri = this.silentRefreshRedirectUri || this.redirectUri;\n this.createLoginUrl(null, null, redirectUri, noPrompt, params).then(\n (url) => {\n iframe.setAttribute('src', url);\n\n if (!this.silentRefreshShowIFrame) {\n iframe.style['display'] = 'none';\n }\n this.document.body.appendChild(iframe);\n }\n );\n\n const errors = this.events.pipe(\n filter((e) => e instanceof OAuthErrorEvent),\n first()\n );\n const success = this.events.pipe(\n filter((e) => e.type === 'token_received'),\n first()\n );\n const timeout = of(\n new OAuthErrorEvent('silent_refresh_timeout', null)\n ).pipe(delay(this.silentRefreshTimeout));\n\n return race([errors, success, timeout])\n .pipe(\n map((e) => {\n if (e instanceof OAuthErrorEvent) {\n if (e.type === 'silent_refresh_timeout') {\n this.eventsSubject.next(e);\n } else {\n e = new OAuthErrorEvent('silent_refresh_error', e);\n this.eventsSubject.next(e);\n }\n throw e;\n } else if (e.type === 'token_received') {\n e = new OAuthSuccessEvent('silently_refreshed');\n this.eventsSubject.next(e);\n }\n return e;\n })\n )\n .toPromise();\n }\n\n /**\n * This method exists for backwards compatibility.\n * {@link OAuthService#initLoginFlowInPopup} handles both code\n * and implicit flows.\n */\n public initImplicitFlowInPopup(options?: {\n height?: number;\n width?: number;\n windowRef?: Window;\n }) {\n return this.initLoginFlowInPopup(options);\n }\n\n public initLoginFlowInPopup(options?: {\n height?: number;\n width?: number;\n windowRef?: Window;\n }) {\n options = options || {};\n return this.createLoginUrl(\n null,\n null,\n this.silentRefreshRedirectUri,\n false,\n {\n display: 'popup',\n }\n ).then((url) => {\n return new Promise((resolve, reject) => {\n /**\n * Error handling section\n */\n const checkForPopupClosedInterval = 500;\n\n let windowRef = null;\n // If we got no window reference we open a window\n // else we are using the window already opened\n if (!options.windowRef) {\n windowRef = window.open(\n url,\n 'ngx-oauth2-oidc-login',\n this.calculatePopupFeatures(options)\n );\n } else if (options.windowRef && !options.windowRef.closed) {\n windowRef = options.windowRef;\n windowRef.location.href = url;\n }\n\n let checkForPopupClosedTimer: any;\n\n const tryLogin = (hash: string) => {\n this.tryLogin({\n customHashFragment: hash,\n preventClearHashAfterLogin: true,\n customRedirectUri: this.silentRefreshRedirectUri,\n }).then(\n () => {\n cleanup();\n resolve(true);\n },\n (err) => {\n cleanup();\n reject(err);\n }\n );\n };\n\n const checkForPopupClosed = () => {\n if (!windowRef || windowRef.closed) {\n cleanup();\n reject(new OAuthErrorEvent('popup_closed', {}));\n }\n };\n if (!windowRef) {\n reject(new OAuthErrorEvent('popup_blocked', {}));\n } else {\n checkForPopupClosedTimer = window.setInterval(\n checkForPopupClosed,\n checkForPopupClosedInterval\n );\n }\n\n const cleanup = () => {\n window.clearInterval(checkForPopupClosedTimer);\n window.removeEventListener('storage', storageListener);\n window.removeEventListener('message', listener);\n if (windowRef !== null) {\n windowRef.close();\n }\n windowRef = null;\n };\n\n const listener = (e: MessageEvent) => {\n const message = this.processMessageEventMessage(e);\n\n if (message && message !== null) {\n window.removeEventListener('storage', storageListener);\n tryLogin(message);\n } else {\n console.log('false event firing');\n }\n };\n\n const storageListener = (event: StorageEvent) => {\n if (event.key === 'auth_hash') {\n window.removeEventListener('message', listener);\n tryLogin(event.newValue);\n }\n };\n\n window.addEventListener('message', listener);\n window.addEventListener('storage', storageListener);\n });\n });\n }\n\n protected calculatePopupFeatures(options: {\n height?: number;\n width?: number;\n }): string {\n // Specify an static height and width and calculate centered position\n\n const height = options.height || 470;\n const width = options.width || 500;\n const left = window.screenLeft + (window.outerWidth - width) / 2;\n const top = window.screenTop + (window.outerHeight - height) / 2;\n return `location=no,toolbar=no,width=${width},height=${height},top=${top},left=${left}`;\n }\n\n protected processMessageEventMessage(e: MessageEvent): string {\n let expectedPrefix = '#';\n\n if (this.silentRefreshMessagePrefix) {\n expectedPrefix += this.silentRefreshMessagePrefix;\n }\n\n if (!e || !e.data || typeof e.data !== 'string') {\n return;\n }\n\n const prefixedMessage: string = e.data;\n\n if (!prefixedMessage.startsWith(expectedPrefix)) {\n return;\n }\n\n return '#' + prefixedMessage.substr(expectedPrefix.length);\n }\n\n protected canPerformSessionCheck(): boolean {\n if (!this.sessionChecksEnabled) {\n return false;\n }\n if (!this.sessionCheckIFrameUrl) {\n console.warn(\n 'sessionChecksEnabled is activated but there is no sessionCheckIFrameUrl'\n );\n return false;\n }\n const sessionState = this.getSessionState();\n if (!sessionState) {\n console.warn(\n 'sessionChecksEnabled is activated but there is no session_state'\n );\n return false;\n }\n if (typeof this.document === 'undefined') {\n return false;\n }\n\n return true;\n }\n\n protected setupSessionCheckEventListener(): void {\n this.removeSessionCheckEventListener();\n\n this.sessionCheckEventListener = (e: MessageEvent) => {\n const origin = e.origin.toLowerCase();\n const issuer = this.issuer.toLowerCase();\n\n this.debug('sessionCheckEventListener');\n\n if (!issuer.startsWith(origin)) {\n this.debug(\n 'sessionCheckEventListener',\n 'wrong origin',\n origin,\n 'expected',\n issuer,\n 'event',\n e\n );\n\n return;\n }\n\n // only run in Angular zone if it is 'changed' or 'error'\n switch (e.data) {\n case 'unchanged':\n this.ngZone.run(() => {\n this.handleSessionUnchanged();\n });\n break;\n case 'changed':\n this.ngZone.run(() => {\n this.handleSessionChange();\n });\n break;\n case 'error':\n this.ngZone.run(() => {\n this.handleSessionError();\n });\n break;\n }\n\n this.debug('got info from session check inframe', e);\n };\n\n // prevent Angular from refreshing the view on every message (runs in intervals)\n this.ngZone.runOutsideAngular(() => {\n window.addEventListener('message', this.sessionCheckEventListener);\n });\n }\n\n protected handleSessionUnchanged(): void {\n this.debug('session check', 'session unchanged');\n this.eventsSubject.next(new OAuthInfoEvent('session_unchanged'));\n }\n\n protected handleSessionChange(): void {\n this.eventsSubject.next(new OAuthInfoEvent('session_changed'));\n this.stopSessionCheckTimer();\n\n if (!this.useSilentRefresh && this.responseType === 'code') {\n this.refreshToken()\n .then(() => {\n this.debug('token refresh after session change worked');\n })\n .catch(() => {\n this.debug('token refresh did not work after session changed');\n this.eventsSubject.next(new OAuthInfoEvent('session_terminated'));\n this.logOut(true);\n });\n } else if (this.silentRefreshRedirectUri) {\n this.silentRefresh().catch(() =>\n this.debug('silent refresh failed after session changed')\n );\n this.waitForSilentRefreshAfterSessionChange();\n } else {\n this.eventsSubject.next(new OAuthInfoEvent('session_terminated'));\n this.logOut(true);\n }\n }\n\n protected waitForSilentRefreshAfterSessionChange(): void {\n this.events\n .pipe(\n filter(\n (e: OAuthEvent) =>\n e.type === 'silently_refreshed' ||\n e.type === 'silent_refresh_timeout' ||\n e.type === 'silent_refresh_error'\n ),\n first()\n )\n .subscribe((e) => {\n if (e.type !== 'silently_refreshed') {\n this.debug('silent refresh did not work after session changed');\n this.eventsSubject.next(new OAuthInfoEvent('session_terminated'));\n this.logOut(true);\n }\n });\n }\n\n protected handleSessionError(): void {\n this.stopSessionCheckTimer();\n this.eventsSubject.next(new OAuthInfoEvent('session_error'));\n }\n\n protected removeSessionCheckEventListener(): void {\n if (this.sessionCheckEventListener) {\n window.removeEventListener('message', this.sessionCheckEventListener);\n this.sessionCheckEventListener = null;\n }\n }\n\n protected initSessionCheck(): void {\n if (!this.canPerformSessionCheck()) {\n return;\n }\n\n const existingIframe = this.document.getElementById(\n this.sessionCheckIFrameName\n );\n if (existingIframe) {\n this.document.body.removeChild(existingIframe);\n }\n\n const iframe = this.document.createElement('iframe');\n iframe.id = this.sessionCheckIFrameName;\n\n this.setupSessionCheckEventListener();\n\n const url = this.sessionCheckIFrameUrl;\n iframe.setAttribute('src', url);\n iframe.style.display = 'none';\n this.document.body.appendChild(iframe);\n\n this.startSessionCheckTimer();\n }\n\n protected startSessionCheckTimer(): void {\n this.stopSessionCheckTimer();\n this.ngZone.runOutsideAngular(() => {\n this.sessionCheckTimer = setInterval(\n this.checkSession.bind(this),\n this.sessionCheckIntervall\n );\n });\n }\n\n protected stopSessionCheckTimer(): void {\n if (this.sessionCheckTimer) {\n clearInterval(this.sessionCheckTimer);\n this.sessionCheckTimer = null;\n }\n }\n\n public checkSession(): void {\n const iframe: any = this.document.getElementById(\n this.sessionCheckIFrameName\n );\n\n if (!iframe) {\n this.logger.warn(\n 'checkSession did not find iframe',\n this.sessionCheckIFrameName\n );\n }\n\n const sessionState = this.getSessionState();\n\n if (!sessionState) {\n this.stopSessionCheckTimer();\n }\n\n const message = this.clientId + ' ' + sessionState;\n iframe.contentWindow.postMessage(message, this.issuer);\n }\n\n protected async createLoginUrl(\n state = '',\n loginHint = '',\n customRedirectUri = '',\n noPrompt = false,\n params: object = {}\n ): Promise<string> {\n const that = this; // eslint-disable-line @typescript-eslint/no-this-alias\n\n let redirectUri: string;\n\n if (customRedirectUri) {\n redirectUri = customRedirectUri;\n } else {\n redirectUri = this.redirectUri;\n }\n\n const nonce = await this.createAndSaveNonce();\n\n if (state) {\n state =\n nonce + this.config.nonceStateSeparator + encodeURIComponent(state);\n } else {\n state = nonce;\n }\n\n if (!this.requestAccessToken && !this.oidc) {\n throw new Error('Either requestAccessToken or oidc or both must be true');\n }\n\n if (this.config.responseType) {\n this.responseType = this.config.responseType;\n } else {\n if (this.oidc && this.requestAccessToken) {\n this.responseType = 'id_token token';\n } else if (this.oidc && !this.requestAccessToken) {\n this.responseType = 'id_token';\n } else {\n this.responseType = 'token';\n }\n }\n\n const seperationChar = that.loginUrl.indexOf('?') > -1 ? '&' : '?';\n\n let scope = that.scope;\n\n if (this.oidc && !scope.match(/(^|\\s)openid($|\\s)/)) {\n scope = 'openid ' + scope;\n }\n\n let url =\n that.loginUrl +\n seperationChar +\n 'response_type=' +\n encodeURIComponent(that.responseType) +\n '&client_id=' +\n encodeURIComponent(that.clientId) +\n '&state=' +\n encodeURIComponent(state) +\n '&redirect_uri=' +\n encodeURIComponent(redirectUri) +\n '&scope=' +\n encodeURIComponent(scope);\n\n if (this.responseType.includes('code') && !this.disablePKCE) {\n const [challenge, verifier] =\n await this.createChallangeVerifierPairForPKCE();\n\n if (\n this.saveNoncesInLocalStorage &&\n typeof window['localStorage'] !== 'undefined'\n ) {\n localStorage.setItem('PKCE_verifier', verifier);\n } else {\n this._storage.setItem('PKCE_verifier', verifier);\n }\n\n url += '&code_challenge=' + challenge;\n url += '&code_challenge_method=S256';\n }\n\n if (loginHint) {\n url += '&login_hint=' + encodeURIComponent(loginHint);\n }\n\n if (that.resource) {\n url += '&resource=' + encodeURIComponent(that.resource);\n }\n\n if (that.oidc) {\n url += '&nonce=' + encodeURIComponent(nonce);\n }\n\n if (noPrompt) {\n url += '&prompt=none';\n }\n\n for (const key of Object.keys(params)) {\n url +=\n '&' + encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);\n }\n\n if (this.customQueryParams) {\n for (const key of Object.getOwnPropertyNames(this.customQueryParams)) {\n url +=\n '&' + key + '=' + encodeURIComponent(this.customQueryParams[key]);\n }\n }\n\n return url;\n }\n\n initImplicitFlowInternal(\n additionalState = '',\n params: string | object = ''\n ): void {\n if (this.inImplicitFlow) {\n return;\n }\n\n this.inImplicitFlow = true;\n\n if (!this.validateUrlForHttps(this.loginUrl)) {\n throw new Error(\n \"loginUrl must use HTTPS (with TLS), or config value for property 'requireHttps' must be set to 'false' and allow HTTP (without TLS).\"\n );\n }\n\n let addParams: object = {};\n let loginHint: string = null;\n\n if (typeof params === 'string') {\n loginHint = params;\n } else if (typeof params === 'object') {\n addParams = params;\n }\n\n this.createLoginUrl(additionalState, loginHint, null, false, addParams)\n .then(this.config.openUri)\n .catch((error) => {\n console.error('Error in initImplicitFlow', error);\n this.inImplicitFlow = false;\n });\n }\n\n /**\n * Starts the implicit flow and redirects to user to\n * the auth servers' login url.\n *\n * @param additionalState Optional state that is passed around.\n * You'll find this state in the property `state` after `tryLogin` logged in the user.\n * @param params Hash with additional parameter. If it is a string, it is used for the\n * parameter loginHint (for the sake of compatibility with former versions)\n */\n public initImplicitFlow(\n additionalState = '',\n params: string | object = ''\n ): void {\n if (this.loginUrl !== '') {\n this.initImplicitFlowInternal(additionalState, params);\n } else {\n this.events\n .pipe(filter((e) => e.type === 'discovery_document_loaded'))\n .subscribe(() =>\n this.initImplicitFlowInternal(additionalState, params)\n );\n }\n }\n\n /**\n * Reset current implicit flow\n *\n * @description This method allows resetting the current implict flow in order to be initialized again.\n */\n public resetImplicitFlow(): void {\n this.inImplicitFlow = false;\n }\n\n protected callOnTokenReceivedIfExists(options: LoginOptions): void {\n const that = this; // eslint-disable-line @typescript-eslint/no-this-alias\n if (options.onTokenReceived) {\n const tokenParams = {\n idClaims: that.getIdentityClaims(),\n idToken: that.getIdToken(),\n accessToken: that.getAccessToken(),\n state: that.state,\n };\n options.onTokenReceived(tokenParams);\n }\n }\n\n protected storeAccessTokenResponse(\n accessToken: string,\n refreshToken: string,\n expiresIn: number,\n grantedScopes: string,\n customParameters?: Map<string, string>\n ): void {\n this._storage.setItem('access_token', accessToken);\n if (grantedScopes && !Array.isArray(grantedScopes)) {\n this._storage.setItem(\n 'granted_scopes',\n JSON.stringify(grantedScopes.split(' '))\n );\n } else if (grantedScopes && Array.isArray(grantedScopes)) {\n this._storage.setItem('granted_scopes', JSON.stringify(grantedScopes));\n }\n\n this._storage.setItem(\n 'access_token_stored_at',\n '' + this.dateTimeService.now()\n );\n if (expiresIn) {\n const expiresInMilliSeconds = expiresIn * 1000;\n const now = this.dateTimeService.new();\n const expiresAt = now.getTime() + expiresInMilliSeconds;\n this._storage.setItem('expires_at', '' + expiresAt);\n }\n\n if (refreshToken) {\n this._storage.setItem('refresh_token', refreshToken);\n }\n if (customParameters) {\n customParameters.forEach((value: string, key: string) => {\n this._storage.setItem(key, value);\n });\n }\n }\n\n /**\n * Delegates to tryLoginImplicitFlow for the sake of competability\n * @param options Optional options.\n */\n public tryLogin(options: LoginOptions = null): Promise<boolean> {\n if (this.config.responseType === 'code') {\n return this.tryLoginCodeFlow(options).then(() => true);\n } else {\n return this.tryLoginImplicitFlow(options);\n }\n }\n\n private parseQueryString(queryString: string): object {\n if (!queryString || queryString.length === 0) {\n return {};\n }\n\n if (queryString.charAt(0) === '?') {\n queryString = queryString.substr(1);\n }\n\n return this.urlHelper.parseQueryString(queryString);\n }\n\n public async tryLoginCodeFlow(options: LoginOptions = null): Promise<void> {\n options = options || {};\n\n const querySource = options.customHashFragment\n ? options.customHashFragment.substring(1)\n : window.location.search;\n\n const parts = this.getCodePartsFromUrl(querySource);\n\n const code = parts['code'];\n const state = parts['state'];\n\n const sessionState = parts['session_state'];\n\n if (!options.preventClearHashAfterLogin) {\n const href =\n location.origin +\n location.pathname +\n location.search\n .replace(/code=[^&$]*/, '')\n .replace(/scope=[^&$]*/, '')\n .replace(/state=[^&$]*/, '')\n .replace(/session_state=[^&$]*/, '')\n .replace(/^\\?&/, '?')\n .replace(/&$/, '')\n .replace(/^\\?$/, '')\n .replace(/&+/g, '&')\n .replace(/\\?&/, '?')\n .replace(/\\?$/, '') +\n location.hash;\n\n history.replaceState(null, window.name, href);\n }\n\n const [nonceInState, userState] = this.parseState(state);\n this.state = userState;\n\n if (parts['error']) {\n this.debug('error trying to login');\n this.handleLoginError(options, parts);\n const err = new OAuthErrorEvent('code_error', {}, parts);\n this.eventsSubject.next(err);\n return Promise.reject(err);\n }\n\n if (!options.disableNonceCheck) {\n if (!nonceInState) {\n this.saveRequestedRoute();\n return Promise.resolve();\n }\n\n if (!options.disableOAuth2StateCheck) {\n const success = this.validateNonce(nonceInState);\n if (!success) {\n const event = new OAuthErrorEvent('invalid_nonce_in_state', null);\n this.eventsSubject.next(event);\n return Promise.reject(event);\n }\n }\n }\n\n this.storeSessionState(sessionState);\n\n if (code) {\n await this.getTokenFromCode(code, options);\n this.restoreRequestedRoute();\n return Promise.resolve();\n } else {\n return Promise.resolve();\n }\n }\n\n private saveRequestedRoute() {\n if (this.config.preserveRequestedRoute) {\n this._storage.setItem(\n 'requested_route',\n window.location.pathname + window.location.search\n );\n }\n }\n\n private restoreRequestedRoute() {\n const requestedRoute = this._storage.getItem('requested_route');\n if (requestedRoute) {\n history.replaceState(null, '', window.location.origin + requestedRoute);\n }\n }\n\n /**\n * Retrieve the returned auth code from the redirect uri that has been called.\n * If required also check hash, as we could use hash location strategy.\n */\n private getCodePartsFromUrl(queryString: string): object {\n if (!queryString || queryString.length === 0) {\n return this.urlHelper.getHashFragmentParams();\n }\n\n // normalize query string\n if (queryString.charAt(0) === '?') {\n queryString = queryString.substr(1);\n }\n\n return this.urlHelper.parseQueryString(queryString);\n }\n\n /**\n * Get token using an intermediate code. Works for the Authorization Code flow.\n */\n private getTokenFromCode(\n code: string,\n options: LoginOptions\n ): Promise<object> {\n let params = new HttpParams({ encoder: new WebHttpUrlEncodingCodec() })\n .set('grant_type', 'authorization_code')\n .set('code', code)\n .set('redirect_uri', options.customRedirectUri || this.redirectUri);\n\n if (!this.disablePKCE) {\n let PKCEVerifier;\n\n if (\n this.saveNoncesInLocalStorage &&\n typeof window['localStorage'] !== 'undefined'\n ) {\n PKCEVerifier = localStorage.getItem('PKCE_verifier');\n } else {\n PKCEVerifier = this._storage.getItem('PKCE_verifier');\n }\n\n if (!PKCEVerifier) {\n console.warn('No PKCE verifier found in oauth storage!');\n } else {\n params = params.set('code_verifier', PKCEVerifier);\n }\n }\n\n return this.fetchAndProcessToken(params, options);\n }\n\n private fetchAndProcessToken(\n params: HttpParams,\n options: LoginOptions\n ): Promise<TokenResponse> {\n options = options || {};\n\n this.assertUrlNotNullAndCorrectProtocol(\n this.tokenEndpoint,\n 'tokenEndpoint'\n );\n let headers = new HttpHeaders().set(\n 'Content-Type',\n 'application/x-www-form-urlencoded'\n );\n\n if (this.useHttpBasicAuth) {\n const header = btoa(`${this.clientId}:${this.dummyClientSecret}`);\n headers = headers.set('Authorization', 'Basic ' + header);\n }\n\n if (!this.useHttpBasicAuth) {\n params = params.set('client_id', this.clientId);\n }\n\n if (!this.useHttpBasicAuth && this.dummyClientSecret) {\n params = params.set('client_secret', this.dummyClientSecret);\n }\n\n return new Promise((resolve, reject) => {\n if (this.customQueryParams) {\n for (const key of Object.getOwnPropertyNames(this.customQueryParams)) {\n params = params.set(key, this.customQueryParams[key]);\n }\n }\n\n this.http\n .post<TokenResponse>(this.tokenEndpoint, params, { headers })\n .subscribe(\n (tokenResponse) => {\n this.debug('refresh tokenResponse', tokenResponse);\n this.storeAccessTokenResponse(\n tokenResponse.access_token,\n tokenResponse.refresh_token,\n tokenResponse.expires_in ||\n this.fallbackAccessTokenExpirationTimeInSec,\n tokenResponse.scope,\n this.extractRecognizedCustomParameters(tokenResponse)\n );\n\n if (this.oidc && tokenResponse.id_token) {\n this.processIdToken(\n tokenResponse.id_token,\n tokenResponse.access_token,\n options.disableNonceCheck\n )\n .then((result) => {\n this.storeIdToken(result);\n\n this.eventsSubject.next(\n new OAuthSuccessEvent('token_received')\n );\n this.eventsSubject.next(\n new OAuthSuccessEvent('token_refreshed')\n );\n\n resolve(tokenResponse);\n })\n .catch((reason) => {\n this.eventsSubject.next(\n new OAuthErrorEvent('token_validation_error', reason)\n );\n console.error('Error validating tokens');\n console.error(reason);\n\n reject(reason);\n });\n } else {\n this.eventsSubject.next(new OAuthSuccessEvent('token_received'));\n this.eventsSubject.next(new OAuthSuccessEvent('token_refreshed'));\n\n resolve(tokenResponse);\n }\n },\n (err) => {\n console.error('Error getting token', err);\n this.eventsSubject.next(\n new OAuthErrorEvent('token_refresh_error', err)\n );\n reject(err);\n }\n );\n });\n }\n\n /**\n * Checks whether there are tokens in the hash fragment\n * as a result of the implicit flow. These tokens are\n * parsed, validated and used to sign the user in to the\n * current client.\n *\n * @param options Optional options.\n */\n public tryLoginImplicitFlow(options: LoginOptions = null): Promise<boolean> {\n options = options || {};\n\n let parts: object;\n\n if (options.customHashFragment) {\n parts = this.urlHelper.getHashFragmentParams(options.customHashFragment);\n } else {\n parts = this.urlHelper.getHashFragmentParams();\n }\n\n this.debug('parsed url', parts);\n\n const state = parts['state'];\n\n const [nonceInState, userState] = this.parseState(state);\n this.state = userState;\n\n if (parts['error']) {\n this.debug('error trying to login');\n this.handleLoginError(options, parts);\n const err = new OAuthErrorEvent('token_error', {}, parts);\n this.eventsSubject.next(err);\n return Promise.reject(err);\n }\n\n const accessToken = parts['access_token'];\n const idToken = parts['id_token'];\n const sessionState = parts['session_state'];\n const grantedScopes = parts['scope'];\n\n if (!this.requestAccessToken && !this.oidc) {\n return Promise.reject(\n 'Either requestAccessToken or oidc (or both) must be true.'\n );\n }\n\n if (this.requestAccessToken && !accessToken) {\n return Promise.resolve(false);\n }\n if (this.requestAccessToken && !options.disableOAuth2StateCheck && !state) {\n return Promise.resolve(false);\n }\n if (this.oidc && !idToken) {\n return Promise.resolve(false);\n }\n\n if (this.sessionChecksEnabled && !sessionState) {\n this.logger.warn(\n 'session checks (Session Status Change Notification) ' +\n 'were activated in the configuration but the id_token ' +\n 'does not contain a session_state claim'\n );\n }\n\n if (this.requestAccessToken && !options.disableNonceCheck) {\n const success = this.validateNonce(nonceInState);\n\n if (!success) {\n const event = new OAuthErrorEvent('invalid_nonce_in_state', null);\n this.eventsSubject.next(event);\n return Promise.reject(event);\n }\n }\n\n if (this.requestAccessToken) {\n this.storeAccessTokenResponse(\n accessToken,\n null,\n parts['expires_in'] || this.fallbackAccessTokenExpirationTimeInSec,\n grantedScopes\n );\n }\n\n if (!this.oidc) {\n this.eventsSubject.next(new OAuthSuccessEvent('token_received'));\n if (this.clearHashAfterLogin && !options.preventClearHashAfterLogin) {\n this.clearLocationHash();\n }\n\n this.callOnTokenReceivedIfExists(options);\n return Promise.resolve(true);\n }\n\n return this.processIdToken(idToken, accessToken, options.disableNonceCheck)\n .then((result) => {\n if (options.validationHandler) {\n return options\n .validationHandler({\n accessToken: accessToken,\n idClaims: result.idTokenClaims,\n idToken: result.idToken,\n state: state,\n })\n .then(() => result);\n }\n return result;\n })\n .then((result) => {\n this.storeIdToken(result);\n this.storeSessionState(sessionState);\n if (this.clearHashAfterLogin && !options.preventClearHashAfterLogin) {\n this.clearLocationHash();\n }\n this.eventsSubject.next(new OAuthSuccessEvent('token_received'));\n this.callOnTokenReceivedIfExists(options);\n this.inImplicitFlow = false;\n return true;\n })\n .catch((reason) => {\n this.eventsSubject.next(\n new OAuthErrorEvent('token_validation_error', reason)\n );\n this.logger.error('Error validating tokens');\n this.logger.error(reason);\n return Promise.reject(reason);\n });\n }\n\n private parseState(state: string): [string, string] {\n let nonce = state;\n let userState = '';\n\n if (state) {\n const idx = state.indexOf(this.config.nonceStateSeparator);\n if (idx > -1) {\n nonce = state.substr(0, idx);\n userState = state.substr(idx + this.config.nonceStateSeparator.length);\n }\n }\n return [nonce, userState];\n }\n\n protected validateNonce(nonceInState: string): boolean {\n let savedNonce;\n\n if (\n this.saveNoncesInLocalStorage &&\n typeof window['localStorage'] !== 'undefined'\n ) {\n savedNonce = localStorage.getItem('nonce');\n } else {\n savedNonce = this._storage.getItem('nonce');\n }\n\n if (savedNonce !== nonceInState) {\n const err = 'Validating access_token failed, wrong state/nonce.';\n console.error(err, savedNonce, nonceInState);\n return false;\n }\n return true;\n }\n\n protected storeIdToken(idToken: ParsedIdToken): void {\n this._storage.setItem('id_token', idToken.idToken);\n this._storage.setItem('id_token_claims_obj', idToken.idTokenClaimsJson);\n this._storage.setItem('id_token_expires_at', '' + idToken.idTokenExpiresAt);\n this._storage.setItem(\n 'id_token_stored_at',\n '' + this.dateTimeService.now()\n );\n }\n\n protected storeSessionState(sessionState: string): void {\n this._storage.setItem('session_state', sessionState);\n }\n\n protected getSessionState(): string {\n return this._storage.getItem('session_state');\n }\n\n protected handleLoginError(options: LoginOptions, parts: object): void {\n if (options.onLoginError) {\n options.onLoginError(parts);\n }\n if (this.clearHashAfterLogin && !options.preventClearHashAfterLogin) {\n this.clearLocationHash();\n }\n }\n\n private getClockSkewInMsec(defaultSkewMsc = 600_000) {\n if (!this.clockSkewInSec && this.clockSkewInSec !== 0) {\n return defaultSkewMsc;\n }\n return this.clockSkewInSec * 1000;\n }\n\n /**\n * @ignore\n */\n public processIdToken(\n idToken: string,\n accessToken: string,\n skipNonceCheck = false\n ): Promise<ParsedIdToken> {\n const tokenParts = idToken.split('.');\n const headerBase64 = this.padBase64(tokenParts[0]);\n const headerJson = b64DecodeUnicode(headerBase64);\n const header = JSON.parse(headerJson);\n const claimsBase64 = this.padBase64(tokenParts[1]);\n const claimsJson = b64DecodeUnicode(claimsBase64);\n const claims = JSON.parse(claimsJson);\n\n let savedNonce;\n if (\n this.saveNoncesInLocalStorage &&\n typeof window['localStorage'] !== 'undefined'\n ) {\n savedNonce = localStorage.getItem('nonce');\n } else {\n savedNonce = this._storage.getItem('nonce');\n }\n\n if (Array.isArray(claims.aud)) {\n if (claims.aud.every((v) => v !== this.clientId)) {\n const err = 'Wrong audience: ' + claims.aud.join(',');\n this.logger.warn(err);\n return Promise.reject(err);\n }\n } else {\n if (claims.aud !== this.clientId) {\n const err = 'Wrong audience: ' + claims.aud;\n this.logger.warn(err);\n return Promise.reject(err);\n }\n }\n\n if (!claims.sub) {\n const err = 'No sub claim in id_token';\n this.logger.warn(err);\n return Promise.reject(err);\n }\n\n /* For now, we only check whether the sub against\n * silentRefreshSubject when sessionChecksEnabled is on\n * We will reconsider in a later version to do this\n * in every other case too.\n */\n if (\n this.sessionChecksEnabled &&\n this.silentRefreshSubject &&\n this.silentRefreshSubject !== claims['sub']\n ) {\n const err =\n 'After refreshing, we got an id_token for another user (sub). ' +\n `Expected sub: ${this.silentRefreshSubject}, received sub: ${claims['sub']}`;\n\n this.logger.warn(err);\n return Promise.reject(err);\n }\n\n if (!claims.iat) {\n const err = 'No iat claim in id_token';\n this.logger.warn(err);\n return Promise.reject(err);\n }\n\n if (!this.skipIssuerCheck && claims.iss !== this.issuer) {\n const err = 'Wrong issuer: ' + claims.iss;\n this.logger.warn(err);\n return Promise.reject(err);\n }\n\n if (!skipNonceCheck && claims.nonce !== savedNonce) {\n const err = 'Wrong nonce: ' + claims.nonce;\n this.logger.warn(err);\n return Promise.reject(err);\n }\n // at_hash is not applicable to authorization code flow\n // addressing https://github.com/manfredsteyer/angular-oauth2-oidc/issues/661\n // i.e. Based on spec the at_hash check is only true for implicit code flow on Ping Federate\n // https://www.pingidentity.com/developer/en/resources/openid-connect-developers-guide.html\n if (\n Object.prototype.hasOwnProperty.call(this, 'responseType') &&\n (this.responseType === 'code' || this.responseType === 'id_token')\n ) {\n this.disableAtHashCheck = true;\n }\n if (\n !this.disableAtHashCheck &&\n this.requestAccessToken &&\n !claims['at_hash']\n ) {\n const err = 'An at_hash is needed!';\n this.logger.warn(err);\n return Promise.reject(err);\n }\n\n const now = this.dateTimeService.now();\n const issuedAtMSec = claims.iat * 1000;\n const expiresAtMSec = claims.exp * 1000;\n const clockSkewInMSec = this.getClockSkewInMsec(); // (this.getClockSkewInMsec() || 600) * 1000;\n\n if (\n issuedAtMSec - clockSkewInMSec >= now ||\n expiresAtMSec + clockSkewInMSec - this.decreaseExpirationBySec <= now\n ) {\n const err = 'Token has expired';\n console.error(err);\n console.error({\n now: now,\n issuedAtMSec: issuedAtMSec,\n expiresAtMSec: expiresAtMSec,\n });\n return Promise.reject(err);\n }\n\n const validationParams: ValidationParams = {\n accessToken: accessToken,\n idToken: idToken,\n jwks: this.jwks,\n idTokenClaims: claims,\n idTokenHeader: header,\n loadKeys: () => this.loadJwks(),\n };\n\n if (this.disableAtHashCheck) {\n return this.checkSignature(validationParams).then(() => {\n const result: ParsedIdToken = {\n idToken: idToken,\n idTokenClaims: claims,\n idTokenClaimsJson: claimsJson,\n idTokenHeader: header,\n idTokenHeaderJson: headerJson,\n idTokenExpiresAt: expiresAtMSec,\n };\n return result;\n });\n }\n\n return this.checkAtHash(validationParams).then((atHashValid) => {\n if (!this.disableAtHashCheck && this.requestAccessToken && !atHashValid) {\n const err = 'Wrong at_hash';\n this.logger.warn(err);\n return Promise.reject(err);\n }\n\n return this.checkSignature(validationParams).then(() => {\n const atHashCheckEnabled = !this.disableAtHashCheck;\n const result: ParsedIdToken = {\n idToken: idToken,\n idTokenClaims: claims,\n idTokenClaimsJson: claimsJson,\n idTokenHeader: header,\n idTokenHeaderJson: headerJson,\n idTokenExpiresAt: expiresAtMSec,\n };\n if (atHashCheckEnabled) {\n return this.checkAtHash(validationParams).then((atHashValid) => {\n if (this.requestAccessToken && !atHashValid) {\n const err = 'Wrong at_hash';\n this.logger.warn(err);\n return Promise.reject(err);\n } else {\n return result;\n }\n });\n } else {\n return result;\n }\n });\n });\n }\n\n /**\n * Returns the received claims about the user.\n */\n public getIdentityClaims(): Record<string, any> {\n const claims = this._storage.getItem('id_token_claims_obj');\n if (!claims) {\n return null;\n }\n return JSON.parse(claims);\n }\n\n /**\n * Returns the granted scopes from the server.\n */\n public getGrantedScopes(): object {\n const scopes = this._storage.getItem('granted_scopes');\n if (!scopes) {\n return null;\n }\n return JSON.parse(scopes);\n }\n\n /**\n * Returns the current id_token.\n */\n public getIdToken(): string {\n return this._storage ? this._storage.getItem('id_token') : null;\n }\n\n protected padBase64(base64data): string {\n while (base64data.length % 4 !== 0) {\n base64data += '=';\n }\n return base64data;\n }\n\n /**\n * Returns the current access_token.\n */\n public getAccessToken(): string {\n return this._storage ? this._storage.getItem('access_token') : null;\n }\n\n public getRefreshToken(): string {\n return this._storage ? this._storage.getItem('refresh_token') : null;\n }\n\n /**\n * Returns the expiration date of the access_token\n * as milliseconds since 1970.\n */\n public getAccessTokenExpiration(): number {\n if (!this._storage.getItem('expires_at')) {\n return null;\n }\n return parseInt(this._storage.getItem('expires_at'), 10);\n }\n\n protected getAccessTokenStoredAt(): number {\n return parseInt(this._storage.getItem('access_token_stored_at'), 10);\n }\n\n protected getIdTokenStoredAt(): number {\n return parseInt(this._storage.getItem('id_token_stored_at'), 10);\n }\n\n /**\n * Returns the expiration date of the id_token\n * as milliseconds since 1970.\n */\n public getIdTokenExpiration(): number {\n if (!this._storage.getItem('id_token_expires_at')) {\n return null;\n }\n\n return parseInt(this._storage.getItem('id_token_expires_at'), 10);\n }\n\n /**\n * Checkes, whether there is a valid access_token.\n */\n public hasValidAccessToken(): boolean {\n if (this.getAccessToken()) {\n const expiresAt = this._storage.getItem('expires_at');\n const now = this.dateTimeService.new();\n if (\n expiresAt &&\n parseInt(expiresAt, 10) - this.decreaseExpirationBySec <\n now.getTime() - this.getClockSkewInMsec()\n ) {\n return false;\n }\n\n return true;\n }\n\n return false;\n }\n\n /**\n * Checks whether there is a valid id_token.\n */\n public hasValidIdToken(): boolean {\n if (this.getIdToken()) {\n const expiresAt = this._storage.getItem('id_token_expires_at');\n const now = this.dateTimeService.new();\n if (\n expiresAt &&\n parseInt(expiresAt, 10) - this.decreaseExpirationBySec <\n now.getTime() - this.getClockSkewInMsec()\n ) {\n return false;\n }\n\n return true;\n }\n\n return false;\n }\n\n /**\n * Retrieve a saved custom property of the TokenReponse object. Only if predefined in authconfig.\n */\n public getCustomTokenResponseProperty(requestedProperty: string): any {\n return this._storage &&\n this.config.customTokenParameters &&\n this.config.customTokenParameters.indexOf(requestedProperty) >= 0 &&\n this._storage.getItem(requestedProperty) !== null\n ? JSON.parse(this._storage.getItem(requestedProperty))\n : null;\n }\n\n /**\n * Returns the auth-header that can be used\n * to transmit the access_token to a service\n */\n public authorizationHeader(): string {\n return 'Bearer ' + this.getAccessToken();\n }\n\n /**\n * Removes all tokens and logs the user out.\n * If a logout url is configured, the user is\n * redirected to it with optional state parameter.\n * @param noRedirectToLogoutUrl\n * @param state\n */\n public logOut(): void;\n public logOut(customParameters: boolean | object): void;\n public logOut(noRedirectToLogoutUrl: boolean): void;\n public logOut(noRedirectToLogoutUrl: boolean, state: string): void;\n public logOut(customParameters: boolean | object = {}, state = ''): void {\n let noRedirectToLogoutUrl = false;\n if (typeof customParameters === 'boolean') {\n noRedirectToLogoutUrl = customParameters;\n customParameters = {};\n }\n\n const id_token = this.getIdToken();\n this._storage.removeItem('access_token');\n this._storage.removeItem('id_token');\n this._storage.removeItem('refresh_token');\n\n if (this.saveNoncesInLocalStorage) {\n localStorage.removeItem('nonce');\n localStorage.removeItem('PKCE_verifier');\n } else {\n this._storage.removeItem('nonce');\n this._storage.removeItem('PKCE_verifier');\n }\n\n this._storage.removeItem('expires_at');\n this._storage.removeItem('id_token_claims_obj');\n this._storage.removeItem('id_token_expires_at');\n this._storage.removeItem('id_token_stored_at');\n this._storage.removeItem('access_token_stored_at');\n this._storage.removeItem('granted_scopes');\n this._storage.removeItem('session_state');\n if (this.config.customTokenParameters) {\n this.config.customTokenParameters.forEach((customParam) =>\n this._storage.removeItem(customParam)\n );\n }\n this.silentRefreshSubject = null;\n\n this.eventsSubject.next(new OAuthInfoEvent('logout'));\n\n if (!this.logoutUrl) {\n return;\n }\n if (noRedirectToLogoutUrl) {\n return;\n }\n\n // if (!id_token && !this.postLogoutRedirectUri) {\n // return;\n // }\n\n let logoutUrl: string;\n\n if (!this.validateUrlForHttps(this.logoutUrl)) {\n throw new Error(\n \"logoutUrl must use HTTPS (with TLS), or config value for property 'requireHttps' must be set to 'false' and allow HTTP (without TLS).\"\n );\n }\n\n // For backward compatibility\n if (this.logoutUrl.indexOf('{{') > -1) {\n logoutUrl = this.logoutUrl\n .replace(/\\{\\{id_token\\}\\}/, encodeURIComponent(id_token))\n .replace(/\\{\\{client_id\\}\\}/, encodeURIComponent(this.clientId));\n } else {\n let params = new HttpParams({ encoder: new WebHttpUrlEncodingCodec() });\n\n if (id_token) {\n params = params.set('id_token_hint', id_token);\n }\n\n const postLogoutUrl =\n this.postLogoutRedirectUri ||\n (this.redirectUriAsPostLogoutRedirectUriFallback && this.redirectUri) ||\n '';\n if (postLogoutUrl) {\n params = params.set('post_logout_redirect_uri', postLogoutUrl);\n\n if (state) {\n params = params.set('state', state);\n }\n }\n\n for (const key in customParameters) {\n params = params.set(key, customParameters[key]);\n }\n\n logoutUrl =\n this.logoutUrl +\n (this.logoutUrl.indexOf('?') > -1 ? '&' : '?') +\n params.toString();\n }\n this.config.openUri(logoutUrl);\n }\n\n /**\n * @ignore\n */\n public createAndSaveNonce(): Promise<string> {\n const that = this; // eslint-disable-line @typescript-eslint/no-this-alias\n return this.createNonce().then(function (nonce: any) {\n // Use localStorage for nonce if possible\n // localStorage is the only storage who survives a\n // redirect in ALL browsers (also IE)\n // Otherwiese we'd force teams who have to support\n // IE into using localStorage for everything\n if (\n that.saveNoncesInLocalStorage &&\n typeof window['localStorage'] !== 'undefined'\n ) {\n localStorage.setItem('nonce', nonce);\n } else {\n that._storage.setItem('nonce', nonce);\n }\n return nonce;\n });\n }\n\n /**\n * @ignore\n */\n public ngOnDestroy(): void {\n this.clearAccessTokenTimer();\n this.clearIdTokenTimer();\n\n this.removeSilentRefreshEventListener();\n const silentRefreshFrame = this.document.getElementById(\n this.silentRefreshIFrameName\n );\n if (silentRefreshFrame) {\n silentRefreshFrame.remove();\n }\n\n this.stopSessionCheckTimer();\n this.removeSessionCheckEventListener();\n const sessionCheckFrame = this.document.getElementById(\n this.sessionCheckIFrameName\n );\n if (sessionCheckFrame) {\n sessionCheckFrame.remove();\n }\n }\n\n protected createNonce(): Promise<string> {\n return new Promise((resolve) => {\n if (this.rngUrl) {\n throw new Error(\n 'createNonce with rng-web-api has not been implemented so far'\n );\n }\n\n /*\n * This alphabet is from:\n * https://tools.ietf.org/html/rfc7636#section-4.1\n *\n * [A-Z] / [a-z] / [0-9] / \"-\" / \".\" / \"_\" / \"~\"\n */\n const unreserved =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\n let size = 45;\n let id = '';\n\n const crypto =\n typeof self === 'undefined' ? null : self.crypto || self['msCrypto'];\n if (crypto) {\n let bytes = new Uint8Array(size);\n crypto.getRandomValues(bytes);\n\n // Needed for IE\n if (!bytes.map) {\n (bytes as any).map = Array.prototype.map;\n }\n\n bytes = bytes.map((x) => unreserved.charCodeAt(x % unreserved.length));\n id = String.fromCharCode.apply(null, bytes);\n } else {\n while (0 < size--) {\n id += unreserved[(Math.random() * unreserved.length) | 0];\n }\n }\n\n resolve(base64UrlEncode(id));\n });\n }\n\n protected async checkAtHash(params: ValidationParams): Promise<boolean> {\n if (!this.tokenValidationHandler) {\n this.logger.warn(\n 'No tokenValidationHandler configured. Cannot check at_hash.'\n );\n return true;\n }\n return this.tokenValidationHandler.validateAtHash(params);\n }\n\n protected checkSignature(params: ValidationParams): Promise<any> {\n if (!this.tokenValidationHandler) {\n this.logger.warn(\n 'No tokenValidationHandler configured. Cannot check signature.'\n );\n return Promise.resolve(null);\n }\n return this.tokenValidationHandler.validateSignature(params);\n }\n\n /**\n * Start the implicit flow or the code flow,\n * depending on your configuration.\n */\n public initLoginFlow(additionalState = '', params = {}): void {\n if (this.responseType === 'code') {\n return this.initCodeFlow(additionalState, params);\n } else {\n return this.initImplicitFlow(additionalState, params);\n }\n }\n\n /**\n * Starts the authorization code flow and redirects to user to\n * the auth servers login url.\n */\n public initCodeFlow(additionalState = '', params = {}): void {\n if (this.loginUrl !== '') {\n this.initCodeFlowInternal(additionalState, params);\n } else {\n this.events\n .pipe(filter((e) => e.type === 'discovery_document_loaded'))\n .subscribe(() => this.initCodeFlowInternal(additionalState, params));\n }\n }\n\n private initCodeFlowInternal(additionalState = '', params = {}): void {\n if (!this.validateUrlForHttps(this.loginUrl)) {\n throw new Error(\n \"loginUrl must use HTTPS (with TLS), or config value for property 'requireHttps' must be set to 'false' and allow HTTP (without TLS).\"\n );\n }\n\n let addParams = {};\n let loginHint = null;\n if (typeof params === 'string') {\n loginHint = params;\n } else if (typeof params === 'object') {\n addParams = params;\n }\n\n this.createLoginUrl(additionalState, loginHint, null, false, addParams)\n .then(this.config.openUri)\n .catch((error) => {\n console.error('Error in initAuthorizationCodeFlow');\n console.error(error);\n });\n }\n\n protected async createChallangeVerifierPairForPKCE(): Promise<\n [string, string]\n > {\n if (!this.crypto) {\n throw new Error(\n 'PKCE support for code flow needs a CryptoHander. Did you import the OAuthModule using forRoot() ?'\n );\n }\n\n const verifier = await this.createNonce();\n const challengeRaw = await this.crypto.calcHash(verifier, 'sha-256');\n const challenge = base64UrlEncode(challengeRaw);\n\n return [challenge, verifier];\n }\n\n private extractRecognizedCustomParameters(\n tokenResponse: TokenResponse\n ): Map<string, string> {\n const foundParameters: Map<string, string> = new Map<string, string>();\n if (!this.config.customTokenParameters) {\n return foundParameters;\n }\n this.config.customTokenParameters.forEach((recognizedParameter: string) => {\n if (tokenResponse[recognizedParameter]) {\n foundParameters.set(\n recognizedParameter,\n JSON.stringify(tokenResponse[recognizedParameter])\n );\n }\n });\n return foundParameters;\n }\n\n /**\n * Revokes the auth token to secure the vulnarability\n * of the token issued allowing the authorization server to clean\n * up any security credentials associated with the authorization\n */\n public revokeTokenAndLogout(\n customParameters: boolean | object = {},\n ignoreCorsIssues = false\n ): Promise<any> {\n const revokeEndpoint = this.revocationEndpoint;\n const accessToken = this.getAccessToken();\n const refreshToken = this.getRefreshToken();\n\n if (!accessToken) {\n return Promise.resolve();\n }\n\n let params = new HttpParams({ encoder: new WebHttpUrlEncodingCodec() });\n\n let headers = new HttpHeaders().set(\n 'Content-Type',\n 'application/x-www-form-urlencoded'\n );\n\n if (this.useHttpBasicAuth) {\n const header = btoa(`${this.clientId}:${this.dummyClientSecret}`);\n headers = headers.set('Authorization', 'Basic ' + header);\n }\n\n if (!this.useHttpBasicAuth) {\n params = params.set('client_id', this.clientId);\n }\n\n if (!this.useHttpBasicAuth && this.dummyClientSecret) {\n params = params.set('client_secret', this.dummyClientSecret);\n }\n\n if (this.customQueryParams) {\n for (const key of Object.getOwnPropertyNames(this.customQueryParams)) {\n params = params.set(key, this.customQueryParams[key]);\n }\n }\n\n return new Promise((resolve, reject) => {\n let revokeAccessToken: Observable<void>;\n let revokeRefreshToken: Observable<void>;\n\n if (accessToken) {\n const revokationParams = params\n .set('token', accessToken)\n .set('token_type_hint', 'access_token');\n revokeAccessToken = this.http.post<void>(\n revokeEndpoint,\n revokationParams,\n { headers }\n );\n } else {\n revokeAccessToken = of(null);\n }\n\n if (refreshToken) {\n const revokationParams = params\n .set('token', refreshToken)\n .set('token_type_hint', 'refresh_token');\n revokeRefreshToken = this.http.post<void>(\n revokeEndpoint,\n revokationParams,\n { headers }\n );\n } else {\n revokeRefreshToken = of(null);\n }\n\n if (ignoreCorsIssues) {\n revokeAccessToken = revokeAccessToken.pipe(\n catchError((err: HttpErrorResponse) => {\n if (err.status === 0) {\n return of<void>(null);\n }\n return throwError(err);\n })\n );\n\n revokeRefreshToken = revokeRefreshToken.pipe(\n catchError((err: HttpErrorResponse) => {\n if (err.status === 0) {\n return of<void>(null);\n }\n return throwError(err);\n })\n );\n }\n\n combineLatest([revokeAccessToken, revokeRefreshToken]).subscribe(\n (res) => {\n this.logOut(customParameters);\n resolve(res);\n this.logger.info('Token successfully revoked');\n },\n (err) => {\n this.logger.error('Error revoking token', err);\n this.eventsSubject.next(\n new OAuthErrorEvent('token_revoke_error', err)\n );\n reject(err);\n }\n );\n });\n }\n\n /**\n * Clear location.hash if it's present\n */\n private clearLocationHash() {\n // Checking for empty hash is necessary for Firefox\n // as setting an empty hash to an empty string adds # to the URL\n if (location.hash != '') {\n location.hash = '';\n }\n }\n}\n","import { HttpResponse } from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\n\nexport abstract class OAuthResourceServerErrorHandler {\n abstract handleError(err: HttpResponse<any>): Observable<any>;\n}\n\nexport class OAuthNoopResourceServerErrorHandler\n implements OAuthResourceServerErrorHandler\n{\n handleError(err: HttpResponse<any>): Observable<any> {\n return throwError(err);\n }\n}\n","import { Injectable, Optional } from '@angular/core';\n\nimport {\n HttpEvent,\n HttpHandler,\n HttpInterceptor,\n HttpRequest,\n} from '@angular/common/http';\nimport { Observable, of, merge } from 'rxjs';\nimport {\n catchError,\n filter,\n map,\n take,\n mergeMap,\n timeout,\n} from 'rxjs/operators';\nimport { OAuthResourceServerErrorHandler } from './resource-server-error-handler';\nimport { OAuthModuleConfig } from '../oauth-module.config';\nimport { OAuthService } from '../oauth-service';\n\n@Injectable()\nexport class DefaultOAuthInterceptor implements HttpInterceptor {\n constructor(\n private oAuthService: OAuthService,\n private errorHandler: OAuthResourceServerErrorHandler,\n @Optional() private moduleConfig: OAuthModuleConfig\n ) {}\n\n private checkUrl(url: string): boolean {\n if (this.moduleConfig.resourceServer.customUrlValidation) {\n return this.moduleConfig.resourceServer.customUrlValidation(url);\n }\n\n if (this.moduleConfig.resourceServer.allowedUrls) {\n return !!this.moduleConfig.resourceServer.allowedUrls.find((u) =>\n url.toLowerCase().startsWith(u.toLowerCase())\n );\n }\n\n return true;\n }\n\n public intercept(\n req: HttpRequest<any>,\n next: HttpHandler\n ): Observable<HttpEvent<any>> {\n const url = req.url.toLowerCase();\n\n if (\n !this.moduleConfig ||\n !this.moduleConfig.resourceServer ||\n !this.checkUrl(url)\n ) {\n return next.handle(req);\n }\n\n const sendAccessToken = this.moduleConfig.resourceServer.sendAccessToken;\n\n if (!sendAccessToken) {\n return next\n .handle(req)\n .pipe(catchError((err) => this.errorHandler.handleError(err)));\n }\n\n return merge(\n of(this.oAuthService.getAccessToken()).pipe(filter((token) => !!token)),\n this.oAuthService.events.pipe(\n filter((e) => e.type === 'token_received'),\n timeout(this.oAuthService.waitForTokenInMsec || 0),\n catchError(() => of(null)), // timeout is not an error\n map(() => this.oAuthService.getAccessToken())\n )\n ).pipe(\n take(1),\n mergeMap((token) => {\n if (token) {\n const header = 'Bearer ' + token;\n const headers = req.headers.set('Authorization', header);\n req = req.clone({ headers });\n }\n\n return next\n .handle(req)\n .pipe(catchError((err) => this.errorHandler.handleError(err)));\n })\n );\n }\n}\n","import { MemoryStorage } from './types';\n\nexport function createDefaultLogger() {\n return console;\n}\n\nexport function createDefaultStorage() {\n return typeof sessionStorage !== 'undefined'\n ? sessionStorage\n : new MemoryStorage();\n}\n","import { makeEnvironmentProviders, EnvironmentProviders } from '@angular/core';\nimport { OAuthModuleConfig } from './oauth-module.config';\nimport { NullValidationHandler } from './token-validation/null-validation-handler';\nimport { DateTimeProvider, SystemDateTimeProvider } from './date-time-provider';\nimport { OAuthStorage, OAuthLogger } from './types';\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\n\nimport { OAuthService } from './oauth-service';\nimport { UrlHelperService } from './url-helper.service';\n\nimport {\n OAuthResourceServerErrorHandler,\n OAuthNoopResourceServerErrorHandler,\n} from './interceptors/resource-server-error-handler';\nimport { DefaultOAuthInterceptor } from './interceptors/default-oauth.interceptor';\nimport { ValidationHandler } from './token-validation/validation-handler';\nimport { createDefaultLogger, createDefaultStorage } from './factories';\nimport {\n HashHandler,\n DefaultHashHandler,\n} from './token-validation/hash-handler';\n\nexport function provideOAuthClient(\n config: OAuthModuleConfig = null,\n validationHandlerClass = NullValidationHandler\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n OAuthService,\n UrlHelperService,\n { provide: OAuthLogger, useFactory: createDefaultLogger },\n { provide: OAuthStorage, useFactory: createDefaultStorage },\n { provide: ValidationHandler, useClass: validationHandlerClass },\n { provide: HashHandler, useClass: DefaultHashHandler },\n {\n provide: OAuthResourceServerErrorHandler,\n useClass: OAuthNoopResourceServerErrorHandler,\n },\n { provide: OAuthModuleConfig, useValue: config },\n {\n provide: HTTP_INTERCEPTORS,\n useClass: DefaultOAuthInterceptor,\n multi: true,\n },\n { provide: DateTimeProvider, useClass: SystemDateTimeProvider },\n ]);\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { OAuthModuleConfig } from './oauth-module.config';\nimport { NullValidationHandler } from './token-validation/null-validation-handler';\nimport { provideOAuthClient } from './provider';\n\n@NgModule({\n imports: [CommonModule],\n declarations: [],\n exports: [],\n})\nexport class OAuthModule {\n static forRoot(\n config: OAuthModuleConfig = null,\n validationHandlerClass = NullValidationHandler\n ): ModuleWithProviders<OAuthModule> {\n return {\n ngModule: OAuthModule,\n providers: [provideOAuthClient(config, validationHandlerClass)],\n };\n }\n}\n","import { NullValidationHandler } from './null-validation-handler';\n\nconst err = `PLEASE READ THIS CAREFULLY:\n\nBeginning with angular-oauth2-oidc version 9, the JwksValidationHandler\nhas been moved to an library of its own. If you need it for implementing\nOAuth2/OIDC **implicit flow**, please install it using npm:\n\n npm i angular-oauth2-oidc-jwks --save\n\nAfter that, you can import it into your application:\n\n import { JwksValidationHandler } from 'angular-oauth2-oidc-jwks';\n\nPlease note, that this dependency is not needed for the **code flow**,\nwhich is nowadays the **recommented** one for single page applications.\nThis also results in smaller bundle sizes.\n`;\n\n/**\n * This is just a dummy of the JwksValidationHandler\n * telling the users that the real one has been moved\n * to an library of its own, namely angular-oauth2-oidc-utils\n */\nexport class JwksValidationHandler extends NullValidationHandler {\n constructor() {\n super();\n console.error(err);\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { AuthConfig } from './auth.config';\n\nexport const AUTH_CONFIG = new InjectionToken<AuthConfig>('AUTH_CONFIG');\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["fsha256","i7.DateTimeProvider","i1.OAuthService","i2.OAuthResourceServerErrorHandler","i3.OAuthModuleConfig"],"mappings":"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"}
\No newline at end of file