@azure/msal-browser 2.20.0 → 2.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +29 -0
- package/CHANGELOG.md +14 -1
- package/README.md +3 -3
- package/dist/_virtual/_tslib.js +1 -1
- package/dist/app/ClientApplication.js +1 -1
- package/dist/app/IPublicClientApplication.js +1 -1
- package/dist/app/PublicClientApplication.js +29 -24
- package/dist/app/PublicClientApplication.js.map +1 -1
- package/dist/cache/AsyncMemoryStorage.js +1 -1
- package/dist/cache/BrowserCacheManager.d.ts +5 -1
- package/dist/cache/BrowserCacheManager.d.ts.map +1 -1
- package/dist/cache/BrowserCacheManager.js +21 -1
- package/dist/cache/BrowserCacheManager.js.map +1 -1
- package/dist/cache/BrowserStorage.js +1 -1
- package/dist/cache/DatabaseStorage.js +1 -1
- package/dist/cache/MemoryStorage.js +1 -1
- package/dist/cache/TokenCache.js +1 -1
- package/dist/config/Configuration.js +1 -1
- package/dist/crypto/BrowserCrypto.js +1 -1
- package/dist/crypto/CryptoOps.d.ts +5 -0
- package/dist/crypto/CryptoOps.d.ts.map +1 -1
- package/dist/crypto/CryptoOps.js +22 -5
- package/dist/crypto/CryptoOps.js.map +1 -1
- package/dist/crypto/GuidGenerator.js +1 -1
- package/dist/crypto/PkceGenerator.js +1 -1
- package/dist/crypto/SignedHttpRequest.js +1 -1
- package/dist/encode/Base64Decode.js +1 -1
- package/dist/encode/Base64Encode.js +1 -1
- package/dist/error/BrowserAuthError.js +1 -1
- package/dist/error/BrowserConfigurationAuthError.js +1 -1
- package/dist/event/EventHandler.js +1 -1
- package/dist/event/EventMessage.js +1 -1
- package/dist/event/EventType.js +1 -1
- package/dist/index.cjs.js +396 -258
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/interaction_client/BaseInteractionClient.d.ts +1 -1
- package/dist/interaction_client/BaseInteractionClient.d.ts.map +1 -1
- package/dist/interaction_client/BaseInteractionClient.js +39 -24
- package/dist/interaction_client/BaseInteractionClient.js.map +1 -1
- package/dist/interaction_client/HybridSpaAuthorizationCodeClient.js +1 -1
- package/dist/interaction_client/PopupClient.d.ts.map +1 -1
- package/dist/interaction_client/PopupClient.js +46 -36
- package/dist/interaction_client/PopupClient.js.map +1 -1
- package/dist/interaction_client/RedirectClient.js +14 -13
- package/dist/interaction_client/RedirectClient.js.map +1 -1
- package/dist/interaction_client/SilentAuthCodeClient.js +10 -8
- package/dist/interaction_client/SilentAuthCodeClient.js.map +1 -1
- package/dist/interaction_client/SilentCacheClient.d.ts +1 -1
- package/dist/interaction_client/SilentCacheClient.d.ts.map +1 -1
- package/dist/interaction_client/SilentCacheClient.js +12 -2
- package/dist/interaction_client/SilentCacheClient.js.map +1 -1
- package/dist/interaction_client/SilentIframeClient.js +13 -11
- package/dist/interaction_client/SilentIframeClient.js.map +1 -1
- package/dist/interaction_client/SilentRefreshClient.js +10 -7
- package/dist/interaction_client/SilentRefreshClient.js.map +1 -1
- package/dist/interaction_client/StandardInteractionClient.d.ts +2 -2
- package/dist/interaction_client/StandardInteractionClient.d.ts.map +1 -1
- package/dist/interaction_client/StandardInteractionClient.js +51 -32
- package/dist/interaction_client/StandardInteractionClient.js.map +1 -1
- package/dist/interaction_handler/InteractionHandler.js +1 -1
- package/dist/interaction_handler/PopupHandler.js +1 -1
- package/dist/interaction_handler/RedirectHandler.js +1 -1
- package/dist/interaction_handler/SilentHandler.js +1 -1
- package/dist/navigation/NavigationClient.js +1 -1
- package/dist/network/FetchClient.js +1 -1
- package/dist/network/XhrClient.js +1 -1
- package/dist/packageMetadata.d.ts +1 -1
- package/dist/packageMetadata.js +2 -2
- package/dist/packageMetadata.js.map +1 -1
- package/dist/request/AuthorizationCodeRequest.d.ts +1 -1
- package/dist/request/AuthorizationCodeRequest.d.ts.map +1 -1
- package/dist/request/AuthorizationUrlRequest.d.ts +1 -1
- package/dist/request/AuthorizationUrlRequest.d.ts.map +1 -1
- package/dist/request/PopupRequest.d.ts +1 -1
- package/dist/request/PopupRequest.d.ts.map +1 -1
- package/dist/request/RedirectRequest.d.ts +1 -1
- package/dist/request/RedirectRequest.d.ts.map +1 -1
- package/dist/request/SilentRequest.d.ts +1 -1
- package/dist/request/SilentRequest.d.ts.map +1 -1
- package/dist/request/SsoSilentRequest.d.ts +1 -1
- package/dist/request/SsoSilentRequest.d.ts.map +1 -1
- package/dist/utils/BrowserConstants.js +1 -1
- package/dist/utils/BrowserProtocolUtils.js +1 -1
- package/dist/utils/BrowserStringUtils.js +1 -1
- package/dist/utils/BrowserUtils.js +1 -1
- package/dist/utils/MathUtils.js +1 -1
- package/dist/utils/PopupUtils.js +1 -1
- package/lib/msal-browser.js +396 -258
- package/lib/msal-browser.js.map +1 -1
- package/lib/msal-browser.min.js +30 -30
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @azure/msal-browser v2.
|
|
1
|
+
/*! @azure/msal-browser v2.21.0 2022-01-04 */
|
|
2
2
|
'use strict';
|
|
3
3
|
export { PublicClientApplication } from './app/PublicClientApplication.js';
|
|
4
4
|
export { ApiId, BrowserCacheLocation, InteractionStatus, InteractionType, WrapperSKU } from './utils/BrowserConstants.js';
|
|
@@ -22,7 +22,7 @@ export declare abstract class BaseInteractionClient {
|
|
|
22
22
|
* Initializer function for all request APIs
|
|
23
23
|
* @param request
|
|
24
24
|
*/
|
|
25
|
-
protected initializeBaseRequest(request: Partial<BaseAuthRequest>): BaseAuthRequest
|
|
25
|
+
protected initializeBaseRequest(request: Partial<BaseAuthRequest>): Promise<BaseAuthRequest>;
|
|
26
26
|
/**
|
|
27
27
|
*
|
|
28
28
|
* Use to get the redirect uri configured in MSAL or null.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseInteractionClient.d.ts","sourceRoot":"","sources":["../../src/interaction_client/BaseInteractionClient.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,oBAAoB,EAAE,WAAW,EAAiB,eAAe,EAAmC,sBAAsB,
|
|
1
|
+
{"version":3,"file":"BaseInteractionClient.d.ts","sourceRoot":"","sources":["../../src/interaction_client/BaseInteractionClient.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,oBAAoB,EAAE,WAAW,EAAiB,eAAe,EAAmC,sBAAsB,EAAiE,MAAM,oBAAoB,CAAC;AAChQ,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAK/D,8BAAsB,qBAAqB;IAEvC,SAAS,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACvC,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC;IAC9C,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC;IACjC,SAAS,CAAC,aAAa,EAAE,cAAc,CAAC;IACxC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC;IACrC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;gBAEpB,MAAM,EAAE,oBAAoB,EAAE,WAAW,EAAE,mBAAmB,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,MAAM;IAUtK,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,eAAe,GAAC,YAAY,GAAC,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,GAAC,IAAI,CAAC;IAEjH,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;cAE1C,kBAAkB,CAAC,OAAO,CAAC,EAAE,WAAW,GAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B9E;;;OAGG;cACa,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IAqClG;;;;;;OAMG;IACH,SAAS,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM;IAM7D;;;;;OAKG;IACH,SAAS,CAAC,gCAAgC,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,sBAAsB;CAa5G"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/*! @azure/msal-browser v2.
|
|
1
|
+
/*! @azure/msal-browser v2.21.0 2022-01-04 */
|
|
2
2
|
'use strict';
|
|
3
|
-
import { __awaiter, __generator,
|
|
4
|
-
import { AccountEntity, AuthenticationScheme, ClientConfigurationError, UrlString, ServerTelemetryManager } from '@azure/msal-common';
|
|
3
|
+
import { __awaiter, __generator, __assign, __spread } from '../_virtual/_tslib.js';
|
|
4
|
+
import { AccountEntity, AuthenticationScheme, ClientConfigurationError, StringUtils, UrlString, ServerTelemetryManager } from '@azure/msal-common';
|
|
5
5
|
import { version } from '../packageMetadata.js';
|
|
6
6
|
import { BrowserConstants } from '../utils/BrowserConstants.js';
|
|
7
7
|
import { BrowserUtils } from '../utils/BrowserUtils.js';
|
|
@@ -71,28 +71,43 @@ var BaseInteractionClient = /** @class */ (function () {
|
|
|
71
71
|
* @param request
|
|
72
72
|
*/
|
|
73
73
|
BaseInteractionClient.prototype.initializeBaseRequest = function (request) {
|
|
74
|
-
this
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
74
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
75
|
+
var authority, scopes, _a, validatedRequest;
|
|
76
|
+
return __generator(this, function (_b) {
|
|
77
|
+
switch (_b.label) {
|
|
78
|
+
case 0:
|
|
79
|
+
this.logger.verbose("Initializing BaseAuthRequest");
|
|
80
|
+
authority = request.authority || this.config.auth.authority;
|
|
81
|
+
scopes = __spread(((request && request.scopes) || []));
|
|
82
|
+
// Set authenticationScheme to BEARER if not explicitly set in the request
|
|
83
|
+
if (!request.authenticationScheme) {
|
|
84
|
+
request.authenticationScheme = AuthenticationScheme.BEARER;
|
|
85
|
+
this.logger.verbose("Authentication Scheme wasn't explicitly set in request, defaulting to \"Bearer\" request");
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
if (request.authenticationScheme === AuthenticationScheme.SSH) {
|
|
89
|
+
if (!request.sshJwk) {
|
|
90
|
+
throw ClientConfigurationError.createMissingSshJwkError();
|
|
91
|
+
}
|
|
92
|
+
if (!request.sshKid) {
|
|
93
|
+
throw ClientConfigurationError.createMissingSshKidError();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
this.logger.verbose("Authentication Scheme set to \"" + request.authenticationScheme + "\" as configured in Auth request");
|
|
97
|
+
}
|
|
98
|
+
if (!(request.claims && !StringUtils.isEmpty(request.claims))) return [3 /*break*/, 2];
|
|
99
|
+
_a = request;
|
|
100
|
+
return [4 /*yield*/, this.browserCrypto.hashString(request.claims)];
|
|
101
|
+
case 1:
|
|
102
|
+
_a.requestedClaimsHash = _b.sent();
|
|
103
|
+
_b.label = 2;
|
|
104
|
+
case 2:
|
|
105
|
+
validatedRequest = __assign(__assign({}, request), { correlationId: this.correlationId, authority: authority,
|
|
106
|
+
scopes: scopes });
|
|
107
|
+
return [2 /*return*/, validatedRequest];
|
|
89
108
|
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
var validatedRequest = __assign(__assign({}, request), { correlationId: this.correlationId, authority: authority,
|
|
94
|
-
scopes: scopes });
|
|
95
|
-
return validatedRequest;
|
|
109
|
+
});
|
|
110
|
+
});
|
|
96
111
|
};
|
|
97
112
|
/**
|
|
98
113
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseInteractionClient.js","sources":["../../src/interaction_client/BaseInteractionClient.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ICrypto, INetworkModule, Logger, AuthenticationResult, AccountInfo, AccountEntity, BaseAuthRequest, AuthenticationScheme, UrlString, ServerTelemetryManager, ServerTelemetryRequest, ClientConfigurationError } from \"@azure/msal-common\";\nimport { BrowserConfiguration } from \"../config/Configuration\";\nimport { BrowserCacheManager } from \"../cache/BrowserCacheManager\";\nimport { EventHandler } from \"../event/EventHandler\";\nimport { EndSessionRequest } from \"../request/EndSessionRequest\";\nimport { RedirectRequest } from \"../request/RedirectRequest\";\nimport { PopupRequest } from \"../request/PopupRequest\";\nimport { SsoSilentRequest } from \"../request/SsoSilentRequest\";\nimport { version } from \"../packageMetadata\";\nimport { BrowserConstants } from \"../utils/BrowserConstants\";\nimport { BrowserUtils } from \"../utils/BrowserUtils\";\n\nexport abstract class BaseInteractionClient {\n\n protected config: BrowserConfiguration;\n protected browserStorage: BrowserCacheManager;\n protected browserCrypto: ICrypto;\n protected networkClient: INetworkModule;\n protected logger: Logger;\n protected eventHandler: EventHandler;\n protected correlationId: string;\n\n constructor(config: BrowserConfiguration, storageImpl: BrowserCacheManager, browserCrypto: ICrypto, logger: Logger, eventHandler: EventHandler, correlationId?: string) {\n this.config = config;\n this.browserStorage = storageImpl;\n this.browserCrypto = browserCrypto;\n this.networkClient = this.config.system.networkClient;\n this.eventHandler = eventHandler;\n this.correlationId = correlationId || this.browserCrypto.createNewGuid();\n this.logger = logger.clone(BrowserConstants.MSAL_SKU, version, this.correlationId);\n }\n\n abstract acquireToken(request: RedirectRequest|PopupRequest|SsoSilentRequest): Promise<AuthenticationResult|void>;\n\n abstract logout(request: EndSessionRequest): Promise<void>;\n\n protected async clearCacheOnLogout(account?: AccountInfo| null): Promise<void> {\n if (account) {\n if (AccountEntity.accountInfoIsEqual(account, this.browserStorage.getActiveAccount(), false)) {\n this.logger.verbose(\"Setting active account to null\");\n this.browserStorage.setActiveAccount(null);\n }\n // Clear given account.\n try {\n await this.browserStorage.removeAccount(AccountEntity.generateAccountCacheKey(account));\n this.logger.verbose(\"Cleared cache items belonging to the account provided in the logout request.\");\n } catch (error) {\n this.logger.error(\"Account provided in logout request was not found. Local cache unchanged.\");\n }\n } else {\n try {\n // Clear all accounts and tokens\n await this.browserStorage.clear();\n // Clear any stray keys from IndexedDB\n await this.browserCrypto.clearKeystore();\n this.logger.verbose(\"No account provided in logout request, clearing all cache items.\");\n } catch(e) {\n this.logger.error(\"Attempted to clear all MSAL cache items and failed. Local cache unchanged.\");\n }\n }\n }\n\n /**\n * Initializer function for all request APIs\n * @param request\n */\n protected initializeBaseRequest(request: Partial<BaseAuthRequest>): BaseAuthRequest {\n this.logger.verbose(\"Initializing BaseAuthRequest\");\n const authority = request.authority || this.config.auth.authority;\n\n const scopes = [...((request && request.scopes) || [])];\n\n // Set authenticationScheme to BEARER if not explicitly set in the request\n if (!request.authenticationScheme) {\n request.authenticationScheme = AuthenticationScheme.BEARER;\n this.logger.verbose(\"Authentication Scheme wasn't explicitly set in request, defaulting to \\\"Bearer\\\" request\");\n } else {\n if (request.authenticationScheme === AuthenticationScheme.SSH) {\n if (!request.sshJwk) {\n throw ClientConfigurationError.createMissingSshJwkError();\n }\n if(!request.sshKid) {\n throw ClientConfigurationError.createMissingSshKidError();\n }\n }\n this.logger.verbose(`Authentication Scheme set to \"${request.authenticationScheme}\" as configured in Auth request`);\n }\n\n const validatedRequest: BaseAuthRequest = {\n ...request,\n correlationId: this.correlationId,\n authority,\n scopes\n };\n\n return validatedRequest;\n }\n\n /**\n *\n * Use to get the redirect uri configured in MSAL or null.\n * @param requestRedirectUri\n * @returns Redirect URL\n *\n */\n protected getRedirectUri(requestRedirectUri?: string): string {\n this.logger.verbose(\"getRedirectUri called\");\n const redirectUri = requestRedirectUri || this.config.auth.redirectUri || BrowserUtils.getCurrentUri();\n return UrlString.getAbsoluteUrl(redirectUri, BrowserUtils.getCurrentUri());\n }\n\n /**\n *\n * @param apiId\n * @param correlationId\n * @param forceRefresh\n */\n protected initializeServerTelemetryManager(apiId: number, forceRefresh?: boolean): ServerTelemetryManager {\n this.logger.verbose(\"initializeServerTelemetryManager called\");\n const telemetryPayload: ServerTelemetryRequest = {\n clientId: this.config.auth.clientId,\n correlationId: this.correlationId,\n apiId: apiId,\n forceRefresh: forceRefresh || false,\n wrapperSKU: this.browserStorage.getWrapperMetadata()[0],\n wrapperVer: this.browserStorage.getWrapperMetadata()[1]\n };\n\n return new ServerTelemetryManager(telemetryPayload, this.browserStorage);\n }\n}\n"],"names":[],"mappings":";;;;;;;;AAAA;;;;;IA2BI,+BAAY,MAA4B,EAAE,WAAgC,EAAE,aAAsB,EAAE,MAAc,EAAE,YAA0B,EAAE,aAAsB;QAClK,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;QACtD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;QACzE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;KACtF;IAMe,kDAAkB,GAAlC,UAAmC,OAA2B;;;;;6BACtD,OAAO,EAAP,wBAAO;wBACP,IAAI,aAAa,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,EAAE,KAAK,CAAC,EAAE;4BAC1F,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;4BACtD,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;yBAC9C;;;;wBAGG,qBAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,aAAa,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC,EAAA;;wBAAvF,SAAuF,CAAC;wBACxF,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,8EAA8E,CAAC,CAAC;;;;wBAEpG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;;;;;;wBAK9F,qBAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,EAAA;;;wBAAjC,SAAiC,CAAC;;wBAElC,qBAAM,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,EAAA;;;wBAAxC,SAAwC,CAAC;wBACzC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,kEAAkE,CAAC,CAAC;;;;wBAExF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;;;;;;KAG3G;;;;;
|
|
1
|
+
{"version":3,"file":"BaseInteractionClient.js","sources":["../../src/interaction_client/BaseInteractionClient.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ICrypto, INetworkModule, Logger, AuthenticationResult, AccountInfo, AccountEntity, BaseAuthRequest, AuthenticationScheme, UrlString, ServerTelemetryManager, ServerTelemetryRequest, ClientConfigurationError, StringUtils } from \"@azure/msal-common\";\nimport { BrowserConfiguration } from \"../config/Configuration\";\nimport { BrowserCacheManager } from \"../cache/BrowserCacheManager\";\nimport { EventHandler } from \"../event/EventHandler\";\nimport { EndSessionRequest } from \"../request/EndSessionRequest\";\nimport { RedirectRequest } from \"../request/RedirectRequest\";\nimport { PopupRequest } from \"../request/PopupRequest\";\nimport { SsoSilentRequest } from \"../request/SsoSilentRequest\";\nimport { version } from \"../packageMetadata\";\nimport { BrowserConstants } from \"../utils/BrowserConstants\";\nimport { BrowserUtils } from \"../utils/BrowserUtils\";\n\nexport abstract class BaseInteractionClient {\n\n protected config: BrowserConfiguration;\n protected browserStorage: BrowserCacheManager;\n protected browserCrypto: ICrypto;\n protected networkClient: INetworkModule;\n protected logger: Logger;\n protected eventHandler: EventHandler;\n protected correlationId: string;\n\n constructor(config: BrowserConfiguration, storageImpl: BrowserCacheManager, browserCrypto: ICrypto, logger: Logger, eventHandler: EventHandler, correlationId?: string) {\n this.config = config;\n this.browserStorage = storageImpl;\n this.browserCrypto = browserCrypto;\n this.networkClient = this.config.system.networkClient;\n this.eventHandler = eventHandler;\n this.correlationId = correlationId || this.browserCrypto.createNewGuid();\n this.logger = logger.clone(BrowserConstants.MSAL_SKU, version, this.correlationId);\n }\n\n abstract acquireToken(request: RedirectRequest|PopupRequest|SsoSilentRequest): Promise<AuthenticationResult|void>;\n\n abstract logout(request: EndSessionRequest): Promise<void>;\n\n protected async clearCacheOnLogout(account?: AccountInfo| null): Promise<void> {\n if (account) {\n if (AccountEntity.accountInfoIsEqual(account, this.browserStorage.getActiveAccount(), false)) {\n this.logger.verbose(\"Setting active account to null\");\n this.browserStorage.setActiveAccount(null);\n }\n // Clear given account.\n try {\n await this.browserStorage.removeAccount(AccountEntity.generateAccountCacheKey(account));\n this.logger.verbose(\"Cleared cache items belonging to the account provided in the logout request.\");\n } catch (error) {\n this.logger.error(\"Account provided in logout request was not found. Local cache unchanged.\");\n }\n } else {\n try {\n // Clear all accounts and tokens\n await this.browserStorage.clear();\n // Clear any stray keys from IndexedDB\n await this.browserCrypto.clearKeystore();\n this.logger.verbose(\"No account provided in logout request, clearing all cache items.\");\n } catch(e) {\n this.logger.error(\"Attempted to clear all MSAL cache items and failed. Local cache unchanged.\");\n }\n }\n }\n\n /**\n * Initializer function for all request APIs\n * @param request\n */\n protected async initializeBaseRequest(request: Partial<BaseAuthRequest>): Promise<BaseAuthRequest> {\n this.logger.verbose(\"Initializing BaseAuthRequest\");\n const authority = request.authority || this.config.auth.authority;\n\n const scopes = [...((request && request.scopes) || [])];\n\n // Set authenticationScheme to BEARER if not explicitly set in the request\n if (!request.authenticationScheme) {\n request.authenticationScheme = AuthenticationScheme.BEARER;\n this.logger.verbose(\"Authentication Scheme wasn't explicitly set in request, defaulting to \\\"Bearer\\\" request\");\n } else {\n if (request.authenticationScheme === AuthenticationScheme.SSH) {\n if (!request.sshJwk) {\n throw ClientConfigurationError.createMissingSshJwkError();\n }\n if(!request.sshKid) {\n throw ClientConfigurationError.createMissingSshKidError();\n }\n }\n this.logger.verbose(`Authentication Scheme set to \"${request.authenticationScheme}\" as configured in Auth request`);\n }\n\n // Set requested claims hash if claims were requested\n if (request.claims && !StringUtils.isEmpty(request.claims)) {\n request.requestedClaimsHash = await this.browserCrypto.hashString(request.claims);\n } \n\n const validatedRequest: BaseAuthRequest = {\n ...request,\n correlationId: this.correlationId,\n authority,\n scopes\n };\n\n return validatedRequest;\n }\n\n /**\n *\n * Use to get the redirect uri configured in MSAL or null.\n * @param requestRedirectUri\n * @returns Redirect URL\n *\n */\n protected getRedirectUri(requestRedirectUri?: string): string {\n this.logger.verbose(\"getRedirectUri called\");\n const redirectUri = requestRedirectUri || this.config.auth.redirectUri || BrowserUtils.getCurrentUri();\n return UrlString.getAbsoluteUrl(redirectUri, BrowserUtils.getCurrentUri());\n }\n\n /**\n *\n * @param apiId\n * @param correlationId\n * @param forceRefresh\n */\n protected initializeServerTelemetryManager(apiId: number, forceRefresh?: boolean): ServerTelemetryManager {\n this.logger.verbose(\"initializeServerTelemetryManager called\");\n const telemetryPayload: ServerTelemetryRequest = {\n clientId: this.config.auth.clientId,\n correlationId: this.correlationId,\n apiId: apiId,\n forceRefresh: forceRefresh || false,\n wrapperSKU: this.browserStorage.getWrapperMetadata()[0],\n wrapperVer: this.browserStorage.getWrapperMetadata()[1]\n };\n\n return new ServerTelemetryManager(telemetryPayload, this.browserStorage);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PopupClient.d.ts","sourceRoot":"","sources":["../../src/interaction_client/PopupClient.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAA2H,MAAM,oBAAoB,CAAC;AAEnL,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAKxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAG3E,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,qBAAa,WAAY,SAAQ,yBAAyB;IACtD;;;OAGG;
|
|
1
|
+
{"version":3,"file":"PopupClient.d.ts","sourceRoot":"","sources":["../../src/interaction_client/PopupClient.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAA2H,MAAM,oBAAoB,CAAC;AAEnL,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAKxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAG3E,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,qBAAa,WAAY,SAAQ,yBAAyB;IACtD;;;OAGG;IACG,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAsBxE;;;OAGG;IACH,MAAM,CAAC,aAAa,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B7D;;;;;;;;OAQG;YACW,sBAAsB;IAsDpC;;;;;;;;OAQG;YACW,gBAAgB;CAqEjC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @azure/msal-browser v2.
|
|
1
|
+
/*! @azure/msal-browser v2.21.0 2022-01-04 */
|
|
2
2
|
'use strict';
|
|
3
3
|
import { __extends, __awaiter, __generator } from '../_virtual/_tslib.js';
|
|
4
4
|
import { AuthError, ThrottlingUtils, UrlString } from '@azure/msal-common';
|
|
@@ -23,26 +23,36 @@ var PopupClient = /** @class */ (function (_super) {
|
|
|
23
23
|
* @param request
|
|
24
24
|
*/
|
|
25
25
|
PopupClient.prototype.acquireToken = function (request) {
|
|
26
|
-
|
|
27
|
-
var validRequest
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
26
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
27
|
+
var validRequest, popupName, popupWindowAttributes, popup, e_1;
|
|
28
|
+
return __generator(this, function (_a) {
|
|
29
|
+
switch (_a.label) {
|
|
30
|
+
case 0:
|
|
31
|
+
_a.trys.push([0, 2, , 3]);
|
|
32
|
+
return [4 /*yield*/, this.preflightInteractiveRequest(request, InteractionType.Popup)];
|
|
33
|
+
case 1:
|
|
34
|
+
validRequest = _a.sent();
|
|
35
|
+
popupName = PopupUtils.generatePopupName(this.config.auth.clientId, validRequest);
|
|
36
|
+
popupWindowAttributes = request.popupWindowAttributes || {};
|
|
37
|
+
// asyncPopups flag is true. Acquires token without first opening popup. Popup will be opened later asynchronously.
|
|
38
|
+
if (this.config.system.asyncPopups) {
|
|
39
|
+
this.logger.verbose("asyncPopups set to true, acquiring token");
|
|
40
|
+
// Passes on popup position and dimensions if in request
|
|
41
|
+
return [2 /*return*/, this.acquireTokenPopupAsync(validRequest, popupName, popupWindowAttributes)];
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// asyncPopups flag is set to false. Opens popup before acquiring token.
|
|
45
|
+
this.logger.verbose("asyncPopup set to false, opening popup before acquiring token");
|
|
46
|
+
popup = PopupUtils.openSizedPopup("about:blank", popupName, popupWindowAttributes, this.logger);
|
|
47
|
+
return [2 /*return*/, this.acquireTokenPopupAsync(validRequest, popupName, popupWindowAttributes, popup)];
|
|
48
|
+
}
|
|
49
|
+
case 2:
|
|
50
|
+
e_1 = _a.sent();
|
|
51
|
+
return [2 /*return*/, Promise.reject(e_1)];
|
|
52
|
+
case 3: return [2 /*return*/];
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
});
|
|
46
56
|
};
|
|
47
57
|
/**
|
|
48
58
|
* Clears local cache for the current user then opens a popup window prompting the user to sign-out of the server
|
|
@@ -85,7 +95,7 @@ var PopupClient = /** @class */ (function (_super) {
|
|
|
85
95
|
*/
|
|
86
96
|
PopupClient.prototype.acquireTokenPopupAsync = function (validRequest, popupName, popupWindowAttributes, popup) {
|
|
87
97
|
return __awaiter(this, void 0, void 0, function () {
|
|
88
|
-
var serverTelemetryManager, authCodeRequest, authClient, navigateUrl, interactionHandler, popupParameters, popupWindow, hash, state, result,
|
|
98
|
+
var serverTelemetryManager, authCodeRequest, authClient, navigateUrl, interactionHandler, popupParameters, popupWindow, hash, state, result, e_2;
|
|
89
99
|
return __generator(this, function (_a) {
|
|
90
100
|
switch (_a.label) {
|
|
91
101
|
case 0:
|
|
@@ -123,17 +133,17 @@ var PopupClient = /** @class */ (function (_super) {
|
|
|
123
133
|
result = _a.sent();
|
|
124
134
|
return [2 /*return*/, result];
|
|
125
135
|
case 7:
|
|
126
|
-
|
|
136
|
+
e_2 = _a.sent();
|
|
127
137
|
if (popup) {
|
|
128
138
|
// Close the synchronous popup if an error is thrown before the window unload event is registered
|
|
129
139
|
popup.close();
|
|
130
140
|
}
|
|
131
|
-
if (
|
|
132
|
-
|
|
141
|
+
if (e_2 instanceof AuthError) {
|
|
142
|
+
e_2.setCorrelationId(this.correlationId);
|
|
133
143
|
}
|
|
134
|
-
serverTelemetryManager.cacheFailedRequest(
|
|
144
|
+
serverTelemetryManager.cacheFailedRequest(e_2);
|
|
135
145
|
this.browserStorage.cleanRequestByState(validRequest.state);
|
|
136
|
-
throw
|
|
146
|
+
throw e_2;
|
|
137
147
|
case 8: return [2 /*return*/];
|
|
138
148
|
}
|
|
139
149
|
});
|
|
@@ -150,7 +160,7 @@ var PopupClient = /** @class */ (function (_super) {
|
|
|
150
160
|
*/
|
|
151
161
|
PopupClient.prototype.logoutPopupAsync = function (validRequest, popupName, popupWindowAttributes, requestAuthority, popup, mainWindowRedirectUri) {
|
|
152
162
|
return __awaiter(this, void 0, void 0, function () {
|
|
153
|
-
var serverTelemetryManager, authClient, logoutUri, popupUtils, popupWindow,
|
|
163
|
+
var serverTelemetryManager, authClient, logoutUri, popupUtils, popupWindow, e_3, navigationOptions, absoluteUrl, e_4;
|
|
154
164
|
return __generator(this, function (_a) {
|
|
155
165
|
switch (_a.label) {
|
|
156
166
|
case 0:
|
|
@@ -186,8 +196,8 @@ var PopupClient = /** @class */ (function (_super) {
|
|
|
186
196
|
this.logger.verbose("Popup successfully redirected to postLogoutRedirectUri");
|
|
187
197
|
return [3 /*break*/, 7];
|
|
188
198
|
case 6:
|
|
189
|
-
|
|
190
|
-
this.logger.verbose("Error occurred while monitoring popup for same origin. Session on server may remain active. Error: " +
|
|
199
|
+
e_3 = _a.sent();
|
|
200
|
+
this.logger.verbose("Error occurred while monitoring popup for same origin. Session on server may remain active. Error: " + e_3);
|
|
191
201
|
return [3 /*break*/, 7];
|
|
192
202
|
case 7:
|
|
193
203
|
popupUtils.cleanPopup(popupWindow);
|
|
@@ -207,19 +217,19 @@ var PopupClient = /** @class */ (function (_super) {
|
|
|
207
217
|
}
|
|
208
218
|
return [3 /*break*/, 9];
|
|
209
219
|
case 8:
|
|
210
|
-
|
|
220
|
+
e_4 = _a.sent();
|
|
211
221
|
if (popup) {
|
|
212
222
|
// Close the synchronous popup if an error is thrown before the window unload event is registered
|
|
213
223
|
popup.close();
|
|
214
224
|
}
|
|
215
|
-
if (
|
|
216
|
-
|
|
225
|
+
if (e_4 instanceof AuthError) {
|
|
226
|
+
e_4.setCorrelationId(this.correlationId);
|
|
217
227
|
}
|
|
218
228
|
this.browserStorage.setInteractionInProgress(false);
|
|
219
|
-
this.eventHandler.emitEvent(EventType.LOGOUT_FAILURE, InteractionType.Popup, null,
|
|
229
|
+
this.eventHandler.emitEvent(EventType.LOGOUT_FAILURE, InteractionType.Popup, null, e_4);
|
|
220
230
|
this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Popup);
|
|
221
|
-
serverTelemetryManager.cacheFailedRequest(
|
|
222
|
-
throw
|
|
231
|
+
serverTelemetryManager.cacheFailedRequest(e_4);
|
|
232
|
+
throw e_4;
|
|
223
233
|
case 9:
|
|
224
234
|
this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Popup);
|
|
225
235
|
return [2 /*return*/];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PopupClient.js","sources":["../../src/interaction_client/PopupClient.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { AuthenticationResult, CommonAuthorizationCodeRequest, AuthorizationCodeClient, ThrottlingUtils, CommonEndSessionRequest, UrlString, AuthError } from \"@azure/msal-common\";\nimport { AuthorizationUrlRequest } from \"../request/AuthorizationUrlRequest\";\nimport { StandardInteractionClient } from \"./StandardInteractionClient\";\nimport { PopupWindowAttributes, PopupUtils } from \"../utils/PopupUtils\";\nimport { EventType } from \"../event/EventType\";\nimport { InteractionType, ApiId } from \"../utils/BrowserConstants\";\nimport { PopupHandler, PopupParams } from \"../interaction_handler/PopupHandler\";\nimport { EndSessionPopupRequest } from \"../request/EndSessionPopupRequest\";\nimport { NavigationOptions } from \"../navigation/NavigationOptions\";\nimport { BrowserUtils } from \"../utils/BrowserUtils\";\nimport { PopupRequest } from \"../request/PopupRequest\";\n\nexport class PopupClient extends StandardInteractionClient {\n /**\n * Acquires tokens by opening a popup window to the /authorize endpoint of the authority\n * @param request \n */\n acquireToken(request: PopupRequest): Promise<AuthenticationResult> {\n try {\n const validRequest = this.preflightInteractiveRequest(request, InteractionType.Popup);\n const popupName = PopupUtils.generatePopupName(this.config.auth.clientId, validRequest);\n const popupWindowAttributes = request.popupWindowAttributes || {};\n\n // asyncPopups flag is true. Acquires token without first opening popup. Popup will be opened later asynchronously.\n if (this.config.system.asyncPopups) {\n this.logger.verbose(\"asyncPopups set to true, acquiring token\");\n // Passes on popup position and dimensions if in request\n return this.acquireTokenPopupAsync(validRequest, popupName, popupWindowAttributes);\n } else {\n // asyncPopups flag is set to false. Opens popup before acquiring token.\n this.logger.verbose(\"asyncPopup set to false, opening popup before acquiring token\");\n const popup = PopupUtils.openSizedPopup(\"about:blank\", popupName, popupWindowAttributes, this.logger);\n return this.acquireTokenPopupAsync(validRequest, popupName, popupWindowAttributes, popup);\n }\n } catch (e) {\n return Promise.reject(e);\n }\n }\n\n /**\n * Clears local cache for the current user then opens a popup window prompting the user to sign-out of the server\n * @param logoutRequest \n */\n logout(logoutRequest?: EndSessionPopupRequest): Promise<void> {\n try {\n this.logger.verbose(\"logoutPopup called\");\n const validLogoutRequest = this.initializeLogoutRequest(logoutRequest);\n\n const popupName = PopupUtils.generateLogoutPopupName(this.config.auth.clientId, validLogoutRequest);\n const authority = logoutRequest && logoutRequest.authority;\n const mainWindowRedirectUri = logoutRequest && logoutRequest.mainWindowRedirectUri;\n const popupWindowAttributes = logoutRequest?.popupWindowAttributes || {};\n\n // asyncPopups flag is true. Acquires token without first opening popup. Popup will be opened later asynchronously.\n if (this.config.system.asyncPopups) {\n this.logger.verbose(\"asyncPopups set to true\");\n // Passes on popup position and dimensions if in request\n return this.logoutPopupAsync(validLogoutRequest, popupName, popupWindowAttributes, authority, undefined, mainWindowRedirectUri);\n } else {\n // asyncPopups flag is set to false. Opens popup before logging out.\n this.logger.verbose(\"asyncPopup set to false, opening popup\");\n const popup = PopupUtils.openSizedPopup(\"about:blank\", popupName, popupWindowAttributes, this.logger);\n return this.logoutPopupAsync(validLogoutRequest, popupName, popupWindowAttributes, authority, popup, mainWindowRedirectUri);\n }\n } catch (e) {\n // Since this function is synchronous we need to reject\n return Promise.reject(e);\n }\n }\n\n /**\n * Helper which obtains an access_token for your API via opening a popup window in the user's browser\n * @param validRequest\n * @param popupName\n * @param popup\n * @param popupWindowAttributes\n *\n * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\n */\n private async acquireTokenPopupAsync(validRequest: AuthorizationUrlRequest, popupName: string, popupWindowAttributes: PopupWindowAttributes, popup?: Window|null): Promise<AuthenticationResult> {\n this.logger.verbose(\"acquireTokenPopupAsync called\");\n const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenPopup);\n\n try {\n // Create auth code request and generate PKCE params\n const authCodeRequest: CommonAuthorizationCodeRequest = await this.initializeAuthorizationCodeRequest(validRequest);\n\n // Initialize the client\n const authClient: AuthorizationCodeClient = await this.createAuthCodeClient(serverTelemetryManager, validRequest.authority);\n this.logger.verbose(\"Auth code client created\");\n\n // Create acquire token url.\n const navigateUrl = await authClient.getAuthCodeUrl(validRequest);\n\n // Create popup interaction handler.\n const interactionHandler = new PopupHandler(authClient, this.browserStorage, authCodeRequest, this.logger);\n\n // Show the UI once the url has been created. Get the window handle for the popup.\n const popupParameters: PopupParams = {\n popup,\n popupName,\n popupWindowAttributes\n };\n const popupWindow: Window = interactionHandler.initiateAuthRequest(navigateUrl, popupParameters);\n this.eventHandler.emitEvent(EventType.POPUP_OPENED, InteractionType.Popup, {popupWindow}, null);\n\n // Monitor the window for the hash. Return the string value and close the popup when the hash is received. Default timeout is 60 seconds.\n const hash = await interactionHandler.monitorPopupForHash(popupWindow);\n const state = this.validateAndExtractStateFromHash(hash, InteractionType.Popup, validRequest.correlationId);\n\n // Remove throttle if it exists\n ThrottlingUtils.removeThrottle(this.browserStorage, this.config.auth.clientId, authCodeRequest);\n\n // Handle response from hash string.\n const result = await interactionHandler.handleCodeResponseFromHash(hash, state, authClient.authority, this.networkClient);\n\n return result;\n } catch (e) { \n if (popup) {\n // Close the synchronous popup if an error is thrown before the window unload event is registered\n popup.close();\n }\n\n if (e instanceof AuthError) {\n e.setCorrelationId(this.correlationId);\n }\n\n serverTelemetryManager.cacheFailedRequest(e);\n this.browserStorage.cleanRequestByState(validRequest.state);\n throw e;\n }\n }\n\n /**\n * \n * @param validRequest \n * @param popupName \n * @param requestAuthority\n * @param popup \n * @param mainWindowRedirectUri \n * @param popupWindowAttributes \n */\n private async logoutPopupAsync(validRequest: CommonEndSessionRequest, popupName: string, popupWindowAttributes: PopupWindowAttributes, requestAuthority?: string, popup?: Window|null, mainWindowRedirectUri?: string): Promise<void> {\n this.logger.verbose(\"logoutPopupAsync called\");\n this.eventHandler.emitEvent(EventType.LOGOUT_START, InteractionType.Popup, validRequest);\n\n const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.logoutPopup);\n \n try {\n // Clear cache on logout\n await this.clearCacheOnLogout(validRequest.account);\n\n this.browserStorage.setInteractionInProgress(true);\n // Initialize the client\n const authClient = await this.createAuthCodeClient(serverTelemetryManager, requestAuthority);\n this.logger.verbose(\"Auth code client created\");\n\n // Create logout string and navigate user window to logout.\n const logoutUri: string = authClient.getLogoutUri(validRequest);\n\n this.eventHandler.emitEvent(EventType.LOGOUT_SUCCESS, InteractionType.Popup, validRequest);\n\n const popupUtils = new PopupUtils(this.browserStorage, this.logger);\n // Open the popup window to requestUrl.\n const popupWindow = popupUtils.openPopup(logoutUri, {popupName, popupWindowAttributes, popup});\n this.eventHandler.emitEvent(EventType.POPUP_OPENED, InteractionType.Popup, {popupWindow}, null);\n\n try {\n // Don't care if this throws an error (User Cancelled)\n await popupUtils.monitorPopupForSameOrigin(popupWindow);\n this.logger.verbose(\"Popup successfully redirected to postLogoutRedirectUri\");\n } catch (e) {\n this.logger.verbose(`Error occurred while monitoring popup for same origin. Session on server may remain active. Error: ${e}`);\n }\n\n popupUtils.cleanPopup(popupWindow);\n\n if (mainWindowRedirectUri) {\n const navigationOptions: NavigationOptions = {\n apiId: ApiId.logoutPopup,\n timeout: this.config.system.redirectNavigationTimeout,\n noHistory: false\n };\n const absoluteUrl = UrlString.getAbsoluteUrl(mainWindowRedirectUri, BrowserUtils.getCurrentUri());\n\n this.logger.verbose(\"Redirecting main window to url specified in the request\");\n this.logger.verbosePii(`Redirecing main window to: ${absoluteUrl}`);\n this.navigationClient.navigateInternal(absoluteUrl, navigationOptions);\n } else {\n this.logger.verbose(\"No main window navigation requested\");\n }\n\n } catch (e) {\n if (popup) {\n // Close the synchronous popup if an error is thrown before the window unload event is registered\n popup.close();\n }\n\n if (e instanceof AuthError) {\n e.setCorrelationId(this.correlationId);\n }\n \n this.browserStorage.setInteractionInProgress(false);\n this.eventHandler.emitEvent(EventType.LOGOUT_FAILURE, InteractionType.Popup, null, e);\n this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Popup);\n serverTelemetryManager.cacheFailedRequest(e);\n throw e;\n }\n\n this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Popup);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PopupClient.js","sources":["../../src/interaction_client/PopupClient.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { AuthenticationResult, CommonAuthorizationCodeRequest, AuthorizationCodeClient, ThrottlingUtils, CommonEndSessionRequest, UrlString, AuthError } from \"@azure/msal-common\";\nimport { AuthorizationUrlRequest } from \"../request/AuthorizationUrlRequest\";\nimport { StandardInteractionClient } from \"./StandardInteractionClient\";\nimport { PopupWindowAttributes, PopupUtils } from \"../utils/PopupUtils\";\nimport { EventType } from \"../event/EventType\";\nimport { InteractionType, ApiId } from \"../utils/BrowserConstants\";\nimport { PopupHandler, PopupParams } from \"../interaction_handler/PopupHandler\";\nimport { EndSessionPopupRequest } from \"../request/EndSessionPopupRequest\";\nimport { NavigationOptions } from \"../navigation/NavigationOptions\";\nimport { BrowserUtils } from \"../utils/BrowserUtils\";\nimport { PopupRequest } from \"../request/PopupRequest\";\n\nexport class PopupClient extends StandardInteractionClient {\n /**\n * Acquires tokens by opening a popup window to the /authorize endpoint of the authority\n * @param request \n */\n async acquireToken(request: PopupRequest): Promise<AuthenticationResult> {\n try {\n const validRequest = await this.preflightInteractiveRequest(request, InteractionType.Popup);\n const popupName = PopupUtils.generatePopupName(this.config.auth.clientId, validRequest);\n const popupWindowAttributes = request.popupWindowAttributes || {};\n\n // asyncPopups flag is true. Acquires token without first opening popup. Popup will be opened later asynchronously.\n if (this.config.system.asyncPopups) {\n this.logger.verbose(\"asyncPopups set to true, acquiring token\");\n // Passes on popup position and dimensions if in request\n return this.acquireTokenPopupAsync(validRequest, popupName, popupWindowAttributes);\n } else {\n // asyncPopups flag is set to false. Opens popup before acquiring token.\n this.logger.verbose(\"asyncPopup set to false, opening popup before acquiring token\");\n const popup = PopupUtils.openSizedPopup(\"about:blank\", popupName, popupWindowAttributes, this.logger);\n return this.acquireTokenPopupAsync(validRequest, popupName, popupWindowAttributes, popup);\n }\n } catch (e) {\n return Promise.reject(e);\n }\n }\n\n /**\n * Clears local cache for the current user then opens a popup window prompting the user to sign-out of the server\n * @param logoutRequest \n */\n logout(logoutRequest?: EndSessionPopupRequest): Promise<void> {\n try {\n this.logger.verbose(\"logoutPopup called\");\n const validLogoutRequest = this.initializeLogoutRequest(logoutRequest);\n\n const popupName = PopupUtils.generateLogoutPopupName(this.config.auth.clientId, validLogoutRequest);\n const authority = logoutRequest && logoutRequest.authority;\n const mainWindowRedirectUri = logoutRequest && logoutRequest.mainWindowRedirectUri;\n const popupWindowAttributes = logoutRequest?.popupWindowAttributes || {};\n\n // asyncPopups flag is true. Acquires token without first opening popup. Popup will be opened later asynchronously.\n if (this.config.system.asyncPopups) {\n this.logger.verbose(\"asyncPopups set to true\");\n // Passes on popup position and dimensions if in request\n return this.logoutPopupAsync(validLogoutRequest, popupName, popupWindowAttributes, authority, undefined, mainWindowRedirectUri);\n } else {\n // asyncPopups flag is set to false. Opens popup before logging out.\n this.logger.verbose(\"asyncPopup set to false, opening popup\");\n const popup = PopupUtils.openSizedPopup(\"about:blank\", popupName, popupWindowAttributes, this.logger);\n return this.logoutPopupAsync(validLogoutRequest, popupName, popupWindowAttributes, authority, popup, mainWindowRedirectUri);\n }\n } catch (e) {\n // Since this function is synchronous we need to reject\n return Promise.reject(e);\n }\n }\n\n /**\n * Helper which obtains an access_token for your API via opening a popup window in the user's browser\n * @param validRequest\n * @param popupName\n * @param popup\n * @param popupWindowAttributes\n *\n * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\n */\n private async acquireTokenPopupAsync(validRequest: AuthorizationUrlRequest, popupName: string, popupWindowAttributes: PopupWindowAttributes, popup?: Window|null): Promise<AuthenticationResult> {\n this.logger.verbose(\"acquireTokenPopupAsync called\");\n const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenPopup);\n\n try {\n // Create auth code request and generate PKCE params\n const authCodeRequest: CommonAuthorizationCodeRequest = await this.initializeAuthorizationCodeRequest(validRequest);\n\n // Initialize the client\n const authClient: AuthorizationCodeClient = await this.createAuthCodeClient(serverTelemetryManager, validRequest.authority);\n this.logger.verbose(\"Auth code client created\");\n\n // Create acquire token url.\n const navigateUrl = await authClient.getAuthCodeUrl(validRequest);\n\n // Create popup interaction handler.\n const interactionHandler = new PopupHandler(authClient, this.browserStorage, authCodeRequest, this.logger);\n\n // Show the UI once the url has been created. Get the window handle for the popup.\n const popupParameters: PopupParams = {\n popup,\n popupName,\n popupWindowAttributes\n };\n const popupWindow: Window = interactionHandler.initiateAuthRequest(navigateUrl, popupParameters);\n this.eventHandler.emitEvent(EventType.POPUP_OPENED, InteractionType.Popup, {popupWindow}, null);\n\n // Monitor the window for the hash. Return the string value and close the popup when the hash is received. Default timeout is 60 seconds.\n const hash = await interactionHandler.monitorPopupForHash(popupWindow);\n const state = this.validateAndExtractStateFromHash(hash, InteractionType.Popup, validRequest.correlationId);\n\n // Remove throttle if it exists\n ThrottlingUtils.removeThrottle(this.browserStorage, this.config.auth.clientId, authCodeRequest);\n\n // Handle response from hash string.\n const result = await interactionHandler.handleCodeResponseFromHash(hash, state, authClient.authority, this.networkClient);\n\n return result;\n } catch (e) { \n if (popup) {\n // Close the synchronous popup if an error is thrown before the window unload event is registered\n popup.close();\n }\n\n if (e instanceof AuthError) {\n e.setCorrelationId(this.correlationId);\n }\n\n serverTelemetryManager.cacheFailedRequest(e);\n this.browserStorage.cleanRequestByState(validRequest.state);\n throw e;\n }\n }\n\n /**\n * \n * @param validRequest \n * @param popupName \n * @param requestAuthority\n * @param popup \n * @param mainWindowRedirectUri \n * @param popupWindowAttributes \n */\n private async logoutPopupAsync(validRequest: CommonEndSessionRequest, popupName: string, popupWindowAttributes: PopupWindowAttributes, requestAuthority?: string, popup?: Window|null, mainWindowRedirectUri?: string): Promise<void> {\n this.logger.verbose(\"logoutPopupAsync called\");\n this.eventHandler.emitEvent(EventType.LOGOUT_START, InteractionType.Popup, validRequest);\n\n const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.logoutPopup);\n \n try {\n // Clear cache on logout\n await this.clearCacheOnLogout(validRequest.account);\n\n this.browserStorage.setInteractionInProgress(true);\n // Initialize the client\n const authClient = await this.createAuthCodeClient(serverTelemetryManager, requestAuthority);\n this.logger.verbose(\"Auth code client created\");\n\n // Create logout string and navigate user window to logout.\n const logoutUri: string = authClient.getLogoutUri(validRequest);\n\n this.eventHandler.emitEvent(EventType.LOGOUT_SUCCESS, InteractionType.Popup, validRequest);\n\n const popupUtils = new PopupUtils(this.browserStorage, this.logger);\n // Open the popup window to requestUrl.\n const popupWindow = popupUtils.openPopup(logoutUri, {popupName, popupWindowAttributes, popup});\n this.eventHandler.emitEvent(EventType.POPUP_OPENED, InteractionType.Popup, {popupWindow}, null);\n\n try {\n // Don't care if this throws an error (User Cancelled)\n await popupUtils.monitorPopupForSameOrigin(popupWindow);\n this.logger.verbose(\"Popup successfully redirected to postLogoutRedirectUri\");\n } catch (e) {\n this.logger.verbose(`Error occurred while monitoring popup for same origin. Session on server may remain active. Error: ${e}`);\n }\n\n popupUtils.cleanPopup(popupWindow);\n\n if (mainWindowRedirectUri) {\n const navigationOptions: NavigationOptions = {\n apiId: ApiId.logoutPopup,\n timeout: this.config.system.redirectNavigationTimeout,\n noHistory: false\n };\n const absoluteUrl = UrlString.getAbsoluteUrl(mainWindowRedirectUri, BrowserUtils.getCurrentUri());\n\n this.logger.verbose(\"Redirecting main window to url specified in the request\");\n this.logger.verbosePii(`Redirecing main window to: ${absoluteUrl}`);\n this.navigationClient.navigateInternal(absoluteUrl, navigationOptions);\n } else {\n this.logger.verbose(\"No main window navigation requested\");\n }\n\n } catch (e) {\n if (popup) {\n // Close the synchronous popup if an error is thrown before the window unload event is registered\n popup.close();\n }\n\n if (e instanceof AuthError) {\n e.setCorrelationId(this.correlationId);\n }\n \n this.browserStorage.setInteractionInProgress(false);\n this.eventHandler.emitEvent(EventType.LOGOUT_FAILURE, InteractionType.Popup, null, e);\n this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Popup);\n serverTelemetryManager.cacheFailedRequest(e);\n throw e;\n }\n\n this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Popup);\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAAA;;;;;IAiBiC,+BAAyB;IAA1D;;KAuMC;;;;;IAlMS,kCAAY,GAAlB,UAAmB,OAAqB;;;;;;;wBAEX,qBAAM,IAAI,CAAC,2BAA2B,CAAC,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,EAAA;;wBAArF,YAAY,GAAG,SAAsE;wBACrF,SAAS,GAAG,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;wBAClF,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,IAAI,EAAE,CAAC;;wBAGlE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;4BAChC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC;;4BAEhE,sBAAO,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,SAAS,EAAE,qBAAqB,CAAC,EAAC;yBACtF;6BAAM;;4BAEH,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,+DAA+D,CAAC,CAAC;4BAC/E,KAAK,GAAG,UAAU,CAAC,cAAc,CAAC,aAAa,EAAE,SAAS,EAAE,qBAAqB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;4BACtG,sBAAO,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,SAAS,EAAE,qBAAqB,EAAE,KAAK,CAAC,EAAC;yBAC7F;;;wBAED,sBAAO,OAAO,CAAC,MAAM,CAAC,GAAC,CAAC,EAAC;;;;;KAEhC;;;;;IAMD,4BAAM,GAAN,UAAO,aAAsC;QACzC,IAAI;YACA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;YAC1C,IAAM,kBAAkB,GAAG,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC;YAEvE,IAAM,SAAS,GAAG,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;YACpG,IAAM,SAAS,GAAG,aAAa,IAAI,aAAa,CAAC,SAAS,CAAC;YAC3D,IAAM,qBAAqB,GAAG,aAAa,IAAI,aAAa,CAAC,qBAAqB,CAAC;YACnF,IAAM,qBAAqB,GAAG,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,qBAAqB,KAAI,EAAE,CAAC;;YAGzE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;gBAChC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;;gBAE/C,OAAO,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,SAAS,EAAE,qBAAqB,EAAE,SAAS,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC;aACnI;iBAAM;;gBAEH,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;gBAC9D,IAAM,KAAK,GAAG,UAAU,CAAC,cAAc,CAAC,aAAa,EAAE,SAAS,EAAE,qBAAqB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtG,OAAO,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,SAAS,EAAE,qBAAqB,EAAE,SAAS,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;aAC/H;SACJ;QAAC,OAAO,CAAC,EAAE;;YAER,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SAC5B;KACJ;;;;;;;;;;IAWa,4CAAsB,GAApC,UAAqC,YAAqC,EAAE,SAAiB,EAAE,qBAA4C,EAAE,KAAmB;;;;;;wBAC5J,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;wBAC/C,sBAAsB,GAAG,IAAI,CAAC,gCAAgC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;;;;wBAIlC,qBAAM,IAAI,CAAC,kCAAkC,CAAC,YAAY,CAAC,EAAA;;wBAA7G,eAAe,GAAmC,SAA2D;wBAGvE,qBAAM,IAAI,CAAC,oBAAoB,CAAC,sBAAsB,EAAE,YAAY,CAAC,SAAS,CAAC,EAAA;;wBAArH,UAAU,GAA4B,SAA+E;wBAC3H,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;wBAG5B,qBAAM,UAAU,CAAC,cAAc,CAAC,YAAY,CAAC,EAAA;;wBAA3D,WAAW,GAAG,SAA6C;wBAG3D,kBAAkB,GAAG,IAAI,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;wBAGrG,eAAe,GAAgB;4BACjC,KAAK,OAAA;4BACL,SAAS,WAAA;4BACT,qBAAqB,uBAAA;yBACxB,CAAC;wBACI,WAAW,GAAW,kBAAkB,CAAC,mBAAmB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;wBACjG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,CAAC,KAAK,EAAE,EAAC,WAAW,aAAA,EAAC,EAAE,IAAI,CAAC,CAAC;wBAGnF,qBAAM,kBAAkB,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAA;;wBAAhE,IAAI,GAAG,SAAyD;wBAChE,KAAK,GAAG,IAAI,CAAC,+BAA+B,CAAC,IAAI,EAAE,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC,aAAa,CAAC,CAAC;;wBAG5G,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;wBAGjF,qBAAM,kBAAkB,CAAC,0BAA0B,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,EAAA;;wBAAnH,MAAM,GAAG,SAA0G;wBAEzH,sBAAO,MAAM,EAAC;;;wBAEd,IAAI,KAAK,EAAE;;4BAEP,KAAK,CAAC,KAAK,EAAE,CAAC;yBACjB;wBAED,IAAI,GAAC,YAAY,SAAS,EAAE;4BACxB,GAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;yBAC1C;wBAED,sBAAsB,CAAC,kBAAkB,CAAC,GAAC,CAAC,CAAC;wBAC7C,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;wBAC5D,MAAM,GAAC,CAAC;;;;;KAEf;;;;;;;;;;IAWa,sCAAgB,GAA9B,UAA+B,YAAqC,EAAE,SAAiB,EAAE,qBAA4C,EAAE,gBAAyB,EAAE,KAAmB,EAAE,qBAA8B;;;;;;wBACjN,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;wBAC/C,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;wBAEnF,sBAAsB,GAAG,IAAI,CAAC,gCAAgC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;;;;;wBAIpF,qBAAM,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,EAAA;;;wBAAnD,SAAmD,CAAC;wBAEpD,IAAI,CAAC,cAAc,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;wBAEhC,qBAAM,IAAI,CAAC,oBAAoB,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,EAAA;;wBAAtF,UAAU,GAAG,SAAyE;wBAC5F,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;wBAG1C,SAAS,GAAW,UAAU,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;wBAEhE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;wBAErF,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;wBAE9D,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,SAAS,EAAE,EAAC,SAAS,WAAA,EAAE,qBAAqB,uBAAA,EAAE,KAAK,OAAA,EAAC,CAAC,CAAC;wBAC/F,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,CAAC,KAAK,EAAE,EAAC,WAAW,aAAA,EAAC,EAAE,IAAI,CAAC,CAAC;;;;;wBAI5F,qBAAM,UAAU,CAAC,yBAAyB,CAAC,WAAW,CAAC,EAAA;;;wBAAvD,SAAuD,CAAC;wBACxD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC;;;;wBAE9E,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,wGAAsG,GAAG,CAAC,CAAC;;;wBAGnI,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;wBAEnC,IAAI,qBAAqB,EAAE;4BACjB,iBAAiB,GAAsB;gCACzC,KAAK,EAAE,KAAK,CAAC,WAAW;gCACxB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,yBAAyB;gCACrD,SAAS,EAAE,KAAK;6BACnB,CAAC;4BACI,WAAW,GAAG,SAAS,CAAC,cAAc,CAAC,qBAAqB,EAAE,YAAY,CAAC,aAAa,EAAE,CAAC,CAAC;4BAElG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC;4BAC/E,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,gCAA8B,WAAa,CAAC,CAAC;4BACpE,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;yBAC1E;6BAAM;4BACH,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;yBAC9D;;;;wBAGD,IAAI,KAAK,EAAE;;4BAEP,KAAK,CAAC,KAAK,EAAE,CAAC;yBACjB;wBAED,IAAI,GAAC,YAAY,SAAS,EAAE;4BACxB,GAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;yBAC1C;wBAED,IAAI,CAAC,cAAc,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;wBACpD,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,GAAC,CAAC,CAAC;wBACtF,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;wBACzE,sBAAsB,CAAC,kBAAkB,CAAC,GAAC,CAAC,CAAC;wBAC7C,MAAM,GAAC,CAAC;;wBAGZ,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;;;;;KAC5E;IACL,kBAAC;AAAD,CAvMA,CAAiC,yBAAyB;;;;"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
/*! @azure/msal-browser v2.
|
|
1
|
+
/*! @azure/msal-browser v2.21.0 2022-01-04 */
|
|
2
2
|
'use strict';
|
|
3
3
|
import { __extends, __awaiter, __generator } from '../_virtual/_tslib.js';
|
|
4
4
|
import { AuthError, UrlString } from '@azure/msal-common';
|
|
5
5
|
import { StandardInteractionClient } from './StandardInteractionClient.js';
|
|
6
|
-
import {
|
|
6
|
+
import { ApiId, InteractionType, TemporaryCacheKeys } from '../utils/BrowserConstants.js';
|
|
7
7
|
import { RedirectHandler } from '../interaction_handler/RedirectHandler.js';
|
|
8
8
|
import { BrowserUtils } from '../utils/BrowserUtils.js';
|
|
9
9
|
import { EventType } from '../event/EventType.js';
|
|
@@ -27,22 +27,23 @@ var RedirectClient = /** @class */ (function (_super) {
|
|
|
27
27
|
var validRequest, serverTelemetryManager, authCodeRequest, authClient, interactionHandler, navigateUrl, redirectStartPage, e_1;
|
|
28
28
|
return __generator(this, function (_a) {
|
|
29
29
|
switch (_a.label) {
|
|
30
|
-
case 0:
|
|
31
|
-
validRequest = this.preflightInteractiveRequest(request, InteractionType.Redirect);
|
|
32
|
-
serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenRedirect);
|
|
33
|
-
_a.label = 1;
|
|
30
|
+
case 0: return [4 /*yield*/, this.preflightInteractiveRequest(request, InteractionType.Redirect)];
|
|
34
31
|
case 1:
|
|
35
|
-
_a.
|
|
36
|
-
|
|
32
|
+
validRequest = _a.sent();
|
|
33
|
+
serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenRedirect);
|
|
34
|
+
_a.label = 2;
|
|
37
35
|
case 2:
|
|
36
|
+
_a.trys.push([2, 7, , 8]);
|
|
37
|
+
return [4 /*yield*/, this.initializeAuthorizationCodeRequest(validRequest)];
|
|
38
|
+
case 3:
|
|
38
39
|
authCodeRequest = _a.sent();
|
|
39
40
|
return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, validRequest.authority)];
|
|
40
|
-
case
|
|
41
|
+
case 4:
|
|
41
42
|
authClient = _a.sent();
|
|
42
43
|
this.logger.verbose("Auth code client created");
|
|
43
44
|
interactionHandler = new RedirectHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.browserCrypto);
|
|
44
45
|
return [4 /*yield*/, authClient.getAuthCodeUrl(validRequest)];
|
|
45
|
-
case
|
|
46
|
+
case 5:
|
|
46
47
|
navigateUrl = _a.sent();
|
|
47
48
|
redirectStartPage = this.getRedirectStartPage(request.redirectStartPage);
|
|
48
49
|
this.logger.verbosePii("Redirect start page: " + redirectStartPage);
|
|
@@ -52,10 +53,10 @@ var RedirectClient = /** @class */ (function (_super) {
|
|
|
52
53
|
redirectStartPage: redirectStartPage,
|
|
53
54
|
onRedirectNavigate: request.onRedirectNavigate
|
|
54
55
|
})];
|
|
55
|
-
case
|
|
56
|
+
case 6:
|
|
56
57
|
// Show the UI once the url has been created. Response will come back in the hash, which will be handled in the handleRedirectCallback function.
|
|
57
58
|
return [2 /*return*/, _a.sent()];
|
|
58
|
-
case
|
|
59
|
+
case 7:
|
|
59
60
|
e_1 = _a.sent();
|
|
60
61
|
if (e_1 instanceof AuthError) {
|
|
61
62
|
e_1.setCorrelationId(this.correlationId);
|
|
@@ -63,7 +64,7 @@ var RedirectClient = /** @class */ (function (_super) {
|
|
|
63
64
|
serverTelemetryManager.cacheFailedRequest(e_1);
|
|
64
65
|
this.browserStorage.cleanRequestByState(validRequest.state);
|
|
65
66
|
throw e_1;
|
|
66
|
-
case
|
|
67
|
+
case 8: return [2 /*return*/];
|
|
67
68
|
}
|
|
68
69
|
});
|
|
69
70
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RedirectClient.js","sources":["../../src/interaction_client/RedirectClient.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { AuthenticationResult, CommonAuthorizationCodeRequest, AuthorizationCodeClient, UrlString, AuthError, ServerTelemetryManager } from \"@azure/msal-common\";\nimport { StandardInteractionClient } from \"./StandardInteractionClient\";\nimport { AuthorizationUrlRequest } from \"../request/AuthorizationUrlRequest\";\nimport { ApiId, InteractionType, TemporaryCacheKeys } from \"../utils/BrowserConstants\";\nimport { RedirectHandler } from \"../interaction_handler/RedirectHandler\";\nimport { BrowserUtils } from \"../utils/BrowserUtils\";\nimport { EndSessionRequest } from \"../request/EndSessionRequest\";\nimport { EventType } from \"../event/EventType\";\nimport { NavigationOptions } from \"../navigation/NavigationOptions\";\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\nimport { RedirectRequest } from \"../request/RedirectRequest\";\n\nexport class RedirectClient extends StandardInteractionClient { \n /**\n * Redirects the page to the /authorize endpoint of the IDP\n * @param request \n */\n async acquireToken(request: RedirectRequest): Promise<void> {\n const validRequest: AuthorizationUrlRequest = this.preflightInteractiveRequest(request, InteractionType.Redirect);\n const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenRedirect);\n\n try {\n // Create auth code request and generate PKCE params\n const authCodeRequest: CommonAuthorizationCodeRequest = await this.initializeAuthorizationCodeRequest(validRequest);\n\n // Initialize the client\n const authClient: AuthorizationCodeClient = await this.createAuthCodeClient(serverTelemetryManager, validRequest.authority);\n this.logger.verbose(\"Auth code client created\");\n\n // Create redirect interaction handler.\n const interactionHandler = new RedirectHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.browserCrypto);\n\n // Create acquire token url.\n const navigateUrl = await authClient.getAuthCodeUrl(validRequest);\n\n const redirectStartPage = this.getRedirectStartPage(request.redirectStartPage);\n this.logger.verbosePii(`Redirect start page: ${redirectStartPage}`);\n\n // Show the UI once the url has been created. Response will come back in the hash, which will be handled in the handleRedirectCallback function.\n return await interactionHandler.initiateAuthRequest(navigateUrl, {\n navigationClient: this.navigationClient,\n redirectTimeout: this.config.system.redirectNavigationTimeout,\n redirectStartPage: redirectStartPage,\n onRedirectNavigate: request.onRedirectNavigate\n });\n } catch (e) {\n if (e instanceof AuthError) {\n e.setCorrelationId(this.correlationId);\n }\n serverTelemetryManager.cacheFailedRequest(e);\n this.browserStorage.cleanRequestByState(validRequest.state);\n throw e;\n }\n }\n\n /**\n * Checks if navigateToLoginRequestUrl is set, and:\n * - if true, performs logic to cache and navigate\n * - if false, handles hash string and parses response\n * @param hash\n */\n async handleRedirectPromise(hash?: string): Promise<AuthenticationResult | null> {\n const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.handleRedirectPromise);\n try {\n if (!this.browserStorage.isInteractionInProgress(true)) {\n this.logger.info(\"handleRedirectPromise called but there is no interaction in progress, returning null.\");\n return null;\n }\n\n const responseHash = this.getRedirectResponseHash(hash || window.location.hash);\n if (!responseHash) {\n // Not a recognized server response hash or hash not associated with a redirect request\n this.logger.info(\"handleRedirectPromise did not detect a response hash as a result of a redirect. Cleaning temporary cache.\");\n this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);\n return null;\n }\n\n let state: string;\n try {\n state = this.validateAndExtractStateFromHash(responseHash, InteractionType.Redirect);\n BrowserUtils.clearHash(window);\n this.logger.verbose(\"State extracted from hash\");\n } catch (e) {\n this.logger.info(`handleRedirectPromise was unable to extract state due to: ${e}`);\n this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);\n return null;\n }\n\n // If navigateToLoginRequestUrl is true, get the url where the redirect request was initiated\n const loginRequestUrl = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, true) || \"\";\n const loginRequestUrlNormalized = UrlString.removeHashFromUrl(loginRequestUrl);\n const currentUrlNormalized = UrlString.removeHashFromUrl(window.location.href);\n\n if (loginRequestUrlNormalized === currentUrlNormalized && this.config.auth.navigateToLoginRequestUrl) {\n // We are on the page we need to navigate to - handle hash\n this.logger.verbose(\"Current page is loginRequestUrl, handling hash\");\n const handleHashResult = await this.handleHash(responseHash, state, serverTelemetryManager);\n\n if (loginRequestUrl.indexOf(\"#\") > -1) {\n // Replace current hash with non-msal hash, if present\n BrowserUtils.replaceHash(loginRequestUrl);\n }\n\n return handleHashResult;\n } else if (!this.config.auth.navigateToLoginRequestUrl) {\n this.logger.verbose(\"NavigateToLoginRequestUrl set to false, handling hash\");\n return this.handleHash(responseHash, state, serverTelemetryManager);\n } else if (!BrowserUtils.isInIframe() || this.config.system.allowRedirectInIframe) {\n /*\n * Returned from authority using redirect - need to perform navigation before processing response\n * Cache the hash to be retrieved after the next redirect\n */\n this.browserStorage.setTemporaryCache(TemporaryCacheKeys.URL_HASH, responseHash, true);\n const navigationOptions: NavigationOptions = {\n apiId: ApiId.handleRedirectPromise,\n timeout: this.config.system.redirectNavigationTimeout,\n noHistory: true\n };\n\n /**\n * Default behavior is to redirect to the start page and not process the hash now. \n * The start page is expected to also call handleRedirectPromise which will process the hash in one of the checks above.\n */ \n let processHashOnRedirect: boolean = true;\n if (!loginRequestUrl || loginRequestUrl === \"null\") {\n // Redirect to home page if login request url is null (real null or the string null)\n const homepage = BrowserUtils.getHomepage();\n // Cache the homepage under ORIGIN_URI to ensure cached hash is processed on homepage\n this.browserStorage.setTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, homepage, true);\n this.logger.warning(\"Unable to get valid login request url from cache, redirecting to home page\");\n processHashOnRedirect = await this.navigationClient.navigateInternal(homepage, navigationOptions);\n } else {\n // Navigate to page that initiated the redirect request\n this.logger.verbose(`Navigating to loginRequestUrl: ${loginRequestUrl}`);\n processHashOnRedirect = await this.navigationClient.navigateInternal(loginRequestUrl, navigationOptions);\n }\n\n // If navigateInternal implementation returns false, handle the hash now\n if (!processHashOnRedirect) {\n return this.handleHash(responseHash, state, serverTelemetryManager);\n }\n }\n\n return null;\n } catch (e) {\n if (e instanceof AuthError) {\n e.setCorrelationId(this.correlationId);\n }\n serverTelemetryManager.cacheFailedRequest(e);\n this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);\n throw e;\n }\n }\n\n /**\n * Gets the response hash for a redirect request\n * Returns null if interactionType in the state value is not \"redirect\" or the hash does not contain known properties\n * @param hash\n */\n private getRedirectResponseHash(hash: string): string | null {\n this.logger.verbose(\"getRedirectResponseHash called\");\n // Get current location hash from window or cache.\n const isResponseHash: boolean = UrlString.hashContainsKnownProperties(hash);\n const cachedHash = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.URL_HASH, true);\n this.browserStorage.removeItem(this.browserStorage.generateCacheKey(TemporaryCacheKeys.URL_HASH));\n\n if (isResponseHash) {\n this.logger.verbose(\"Hash contains known properties, returning response hash\");\n return hash;\n }\n\n this.logger.verbose(\"Hash does not contain known properties, returning cached hash\");\n return cachedHash;\n }\n\n /**\n * Checks if hash exists and handles in window.\n * @param hash\n * @param state\n */\n private async handleHash(hash: string, state: string, serverTelemetryManager: ServerTelemetryManager): Promise<AuthenticationResult> {\n const cachedRequest = this.browserStorage.getCachedRequest(state, this.browserCrypto);\n this.logger.verbose(\"handleHash called, retrieved cached request\");\n\n // Hash contains known properties - handle and return in callback\n const currentAuthority = this.browserStorage.getCachedAuthority(state);\n if (!currentAuthority) {\n throw BrowserAuthError.createNoCachedAuthorityError();\n }\n\n const authClient = await this.createAuthCodeClient(serverTelemetryManager, currentAuthority);\n this.logger.verbose(\"Auth code client created\");\n const interactionHandler = new RedirectHandler(authClient, this.browserStorage, cachedRequest, this.logger, this.browserCrypto);\n return await interactionHandler.handleCodeResponseFromHash(hash, state, authClient.authority, this.networkClient, this.config.auth.clientId);\n }\n\n /**\n * Use to log out the current user, and redirect the user to the postLogoutRedirectUri.\n * Default behaviour is to redirect the user to `window.location.href`.\n * @param logoutRequest\n */\n async logout(logoutRequest?: EndSessionRequest): Promise<void> {\n this.logger.verbose(\"logoutRedirect called\");\n const validLogoutRequest = this.initializeLogoutRequest(logoutRequest);\n const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.logout);\n\n try {\n this.eventHandler.emitEvent(EventType.LOGOUT_START, InteractionType.Redirect, logoutRequest);\n \n // Clear cache on logout\n await this.clearCacheOnLogout(validLogoutRequest.account);\n \n const navigationOptions: NavigationOptions = {\n apiId: ApiId.logout,\n timeout: this.config.system.redirectNavigationTimeout,\n noHistory: false\n };\n const authClient = await this.createAuthCodeClient(serverTelemetryManager, logoutRequest && logoutRequest.authority);\n this.logger.verbose(\"Auth code client created\");\n\n // Create logout string and navigate user window to logout.\n const logoutUri: string = authClient.getLogoutUri(validLogoutRequest);\n \n this.eventHandler.emitEvent(EventType.LOGOUT_SUCCESS, InteractionType.Redirect, validLogoutRequest);\n // Check if onRedirectNavigate is implemented, and invoke it if so\n if (logoutRequest && typeof logoutRequest.onRedirectNavigate === \"function\") {\n const navigate = logoutRequest.onRedirectNavigate(logoutUri);\n\n if (navigate !== false) {\n this.logger.verbose(\"Logout onRedirectNavigate did not return false, navigating\");\n await this.navigationClient.navigateExternal(logoutUri, navigationOptions);\n return;\n } else {\n this.logger.verbose(\"Logout onRedirectNavigate returned false, stopping navigation\");\n }\n } else {\n await this.navigationClient.navigateExternal(logoutUri, navigationOptions);\n return;\n }\n } catch(e) {\n if (e instanceof AuthError) {\n e.setCorrelationId(this.correlationId);\n }\n serverTelemetryManager.cacheFailedRequest(e);\n this.eventHandler.emitEvent(EventType.LOGOUT_FAILURE, InteractionType.Redirect, null, e);\n this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Redirect);\n throw e;\n }\n\n this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Redirect);\n }\n\n /**\n * Use to get the redirectStartPage either from request or use current window\n * @param requestStartPage\n */\n protected getRedirectStartPage(requestStartPage?: string): string {\n const redirectStartPage = requestStartPage || window.location.href;\n return UrlString.getAbsoluteUrl(redirectStartPage, BrowserUtils.getCurrentUri());\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RedirectClient.js","sources":["../../src/interaction_client/RedirectClient.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { AuthenticationResult, CommonAuthorizationCodeRequest, AuthorizationCodeClient, UrlString, AuthError, ServerTelemetryManager } from \"@azure/msal-common\";\nimport { StandardInteractionClient } from \"./StandardInteractionClient\";\nimport { AuthorizationUrlRequest } from \"../request/AuthorizationUrlRequest\";\nimport { ApiId, InteractionType, TemporaryCacheKeys } from \"../utils/BrowserConstants\";\nimport { RedirectHandler } from \"../interaction_handler/RedirectHandler\";\nimport { BrowserUtils } from \"../utils/BrowserUtils\";\nimport { EndSessionRequest } from \"../request/EndSessionRequest\";\nimport { EventType } from \"../event/EventType\";\nimport { NavigationOptions } from \"../navigation/NavigationOptions\";\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\nimport { RedirectRequest } from \"../request/RedirectRequest\";\n\nexport class RedirectClient extends StandardInteractionClient { \n /**\n * Redirects the page to the /authorize endpoint of the IDP\n * @param request \n */\n async acquireToken(request: RedirectRequest): Promise<void> {\n const validRequest: AuthorizationUrlRequest = await this.preflightInteractiveRequest(request, InteractionType.Redirect);\n const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenRedirect);\n\n try {\n // Create auth code request and generate PKCE params\n const authCodeRequest: CommonAuthorizationCodeRequest = await this.initializeAuthorizationCodeRequest(validRequest);\n\n // Initialize the client\n const authClient: AuthorizationCodeClient = await this.createAuthCodeClient(serverTelemetryManager, validRequest.authority);\n this.logger.verbose(\"Auth code client created\");\n\n // Create redirect interaction handler.\n const interactionHandler = new RedirectHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.browserCrypto);\n\n // Create acquire token url.\n const navigateUrl = await authClient.getAuthCodeUrl(validRequest);\n\n const redirectStartPage = this.getRedirectStartPage(request.redirectStartPage);\n this.logger.verbosePii(`Redirect start page: ${redirectStartPage}`);\n\n // Show the UI once the url has been created. Response will come back in the hash, which will be handled in the handleRedirectCallback function.\n return await interactionHandler.initiateAuthRequest(navigateUrl, {\n navigationClient: this.navigationClient,\n redirectTimeout: this.config.system.redirectNavigationTimeout,\n redirectStartPage: redirectStartPage,\n onRedirectNavigate: request.onRedirectNavigate\n });\n } catch (e) {\n if (e instanceof AuthError) {\n e.setCorrelationId(this.correlationId);\n }\n serverTelemetryManager.cacheFailedRequest(e);\n this.browserStorage.cleanRequestByState(validRequest.state);\n throw e;\n }\n }\n\n /**\n * Checks if navigateToLoginRequestUrl is set, and:\n * - if true, performs logic to cache and navigate\n * - if false, handles hash string and parses response\n * @param hash\n */\n async handleRedirectPromise(hash?: string): Promise<AuthenticationResult | null> {\n const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.handleRedirectPromise);\n try {\n if (!this.browserStorage.isInteractionInProgress(true)) {\n this.logger.info(\"handleRedirectPromise called but there is no interaction in progress, returning null.\");\n return null;\n }\n\n const responseHash = this.getRedirectResponseHash(hash || window.location.hash);\n if (!responseHash) {\n // Not a recognized server response hash or hash not associated with a redirect request\n this.logger.info(\"handleRedirectPromise did not detect a response hash as a result of a redirect. Cleaning temporary cache.\");\n this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);\n return null;\n }\n\n let state: string;\n try {\n state = this.validateAndExtractStateFromHash(responseHash, InteractionType.Redirect);\n BrowserUtils.clearHash(window);\n this.logger.verbose(\"State extracted from hash\");\n } catch (e) {\n this.logger.info(`handleRedirectPromise was unable to extract state due to: ${e}`);\n this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);\n return null;\n }\n\n // If navigateToLoginRequestUrl is true, get the url where the redirect request was initiated\n const loginRequestUrl = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, true) || \"\";\n const loginRequestUrlNormalized = UrlString.removeHashFromUrl(loginRequestUrl);\n const currentUrlNormalized = UrlString.removeHashFromUrl(window.location.href);\n\n if (loginRequestUrlNormalized === currentUrlNormalized && this.config.auth.navigateToLoginRequestUrl) {\n // We are on the page we need to navigate to - handle hash\n this.logger.verbose(\"Current page is loginRequestUrl, handling hash\");\n const handleHashResult = await this.handleHash(responseHash, state, serverTelemetryManager);\n\n if (loginRequestUrl.indexOf(\"#\") > -1) {\n // Replace current hash with non-msal hash, if present\n BrowserUtils.replaceHash(loginRequestUrl);\n }\n\n return handleHashResult;\n } else if (!this.config.auth.navigateToLoginRequestUrl) {\n this.logger.verbose(\"NavigateToLoginRequestUrl set to false, handling hash\");\n return this.handleHash(responseHash, state, serverTelemetryManager);\n } else if (!BrowserUtils.isInIframe() || this.config.system.allowRedirectInIframe) {\n /*\n * Returned from authority using redirect - need to perform navigation before processing response\n * Cache the hash to be retrieved after the next redirect\n */\n this.browserStorage.setTemporaryCache(TemporaryCacheKeys.URL_HASH, responseHash, true);\n const navigationOptions: NavigationOptions = {\n apiId: ApiId.handleRedirectPromise,\n timeout: this.config.system.redirectNavigationTimeout,\n noHistory: true\n };\n\n /**\n * Default behavior is to redirect to the start page and not process the hash now. \n * The start page is expected to also call handleRedirectPromise which will process the hash in one of the checks above.\n */ \n let processHashOnRedirect: boolean = true;\n if (!loginRequestUrl || loginRequestUrl === \"null\") {\n // Redirect to home page if login request url is null (real null or the string null)\n const homepage = BrowserUtils.getHomepage();\n // Cache the homepage under ORIGIN_URI to ensure cached hash is processed on homepage\n this.browserStorage.setTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, homepage, true);\n this.logger.warning(\"Unable to get valid login request url from cache, redirecting to home page\");\n processHashOnRedirect = await this.navigationClient.navigateInternal(homepage, navigationOptions);\n } else {\n // Navigate to page that initiated the redirect request\n this.logger.verbose(`Navigating to loginRequestUrl: ${loginRequestUrl}`);\n processHashOnRedirect = await this.navigationClient.navigateInternal(loginRequestUrl, navigationOptions);\n }\n\n // If navigateInternal implementation returns false, handle the hash now\n if (!processHashOnRedirect) {\n return this.handleHash(responseHash, state, serverTelemetryManager);\n }\n }\n\n return null;\n } catch (e) {\n if (e instanceof AuthError) {\n e.setCorrelationId(this.correlationId);\n }\n serverTelemetryManager.cacheFailedRequest(e);\n this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);\n throw e;\n }\n }\n\n /**\n * Gets the response hash for a redirect request\n * Returns null if interactionType in the state value is not \"redirect\" or the hash does not contain known properties\n * @param hash\n */\n private getRedirectResponseHash(hash: string): string | null {\n this.logger.verbose(\"getRedirectResponseHash called\");\n // Get current location hash from window or cache.\n const isResponseHash: boolean = UrlString.hashContainsKnownProperties(hash);\n const cachedHash = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.URL_HASH, true);\n this.browserStorage.removeItem(this.browserStorage.generateCacheKey(TemporaryCacheKeys.URL_HASH));\n\n if (isResponseHash) {\n this.logger.verbose(\"Hash contains known properties, returning response hash\");\n return hash;\n }\n\n this.logger.verbose(\"Hash does not contain known properties, returning cached hash\");\n return cachedHash;\n }\n\n /**\n * Checks if hash exists and handles in window.\n * @param hash\n * @param state\n */\n private async handleHash(hash: string, state: string, serverTelemetryManager: ServerTelemetryManager): Promise<AuthenticationResult> {\n const cachedRequest = this.browserStorage.getCachedRequest(state, this.browserCrypto);\n this.logger.verbose(\"handleHash called, retrieved cached request\");\n\n // Hash contains known properties - handle and return in callback\n const currentAuthority = this.browserStorage.getCachedAuthority(state);\n if (!currentAuthority) {\n throw BrowserAuthError.createNoCachedAuthorityError();\n }\n\n const authClient = await this.createAuthCodeClient(serverTelemetryManager, currentAuthority);\n this.logger.verbose(\"Auth code client created\");\n const interactionHandler = new RedirectHandler(authClient, this.browserStorage, cachedRequest, this.logger, this.browserCrypto);\n return await interactionHandler.handleCodeResponseFromHash(hash, state, authClient.authority, this.networkClient, this.config.auth.clientId);\n }\n\n /**\n * Use to log out the current user, and redirect the user to the postLogoutRedirectUri.\n * Default behaviour is to redirect the user to `window.location.href`.\n * @param logoutRequest\n */\n async logout(logoutRequest?: EndSessionRequest): Promise<void> {\n this.logger.verbose(\"logoutRedirect called\");\n const validLogoutRequest = this.initializeLogoutRequest(logoutRequest);\n const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.logout);\n\n try {\n this.eventHandler.emitEvent(EventType.LOGOUT_START, InteractionType.Redirect, logoutRequest);\n \n // Clear cache on logout\n await this.clearCacheOnLogout(validLogoutRequest.account);\n \n const navigationOptions: NavigationOptions = {\n apiId: ApiId.logout,\n timeout: this.config.system.redirectNavigationTimeout,\n noHistory: false\n };\n const authClient = await this.createAuthCodeClient(serverTelemetryManager, logoutRequest && logoutRequest.authority);\n this.logger.verbose(\"Auth code client created\");\n\n // Create logout string and navigate user window to logout.\n const logoutUri: string = authClient.getLogoutUri(validLogoutRequest);\n \n this.eventHandler.emitEvent(EventType.LOGOUT_SUCCESS, InteractionType.Redirect, validLogoutRequest);\n // Check if onRedirectNavigate is implemented, and invoke it if so\n if (logoutRequest && typeof logoutRequest.onRedirectNavigate === \"function\") {\n const navigate = logoutRequest.onRedirectNavigate(logoutUri);\n\n if (navigate !== false) {\n this.logger.verbose(\"Logout onRedirectNavigate did not return false, navigating\");\n await this.navigationClient.navigateExternal(logoutUri, navigationOptions);\n return;\n } else {\n this.logger.verbose(\"Logout onRedirectNavigate returned false, stopping navigation\");\n }\n } else {\n await this.navigationClient.navigateExternal(logoutUri, navigationOptions);\n return;\n }\n } catch(e) {\n if (e instanceof AuthError) {\n e.setCorrelationId(this.correlationId);\n }\n serverTelemetryManager.cacheFailedRequest(e);\n this.eventHandler.emitEvent(EventType.LOGOUT_FAILURE, InteractionType.Redirect, null, e);\n this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Redirect);\n throw e;\n }\n\n this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Redirect);\n }\n\n /**\n * Use to get the redirectStartPage either from request or use current window\n * @param requestStartPage\n */\n protected getRedirectStartPage(requestStartPage?: string): string {\n const redirectStartPage = requestStartPage || window.location.href;\n return UrlString.getAbsoluteUrl(redirectStartPage, BrowserUtils.getCurrentUri());\n }\n}\n"],"names":[],"mappings":"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"}
|