@azure/msal-browser 3.0.0-alpha.1 → 3.0.0-beta.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/LICENSE +21 -21
- package/README.md +213 -213
- package/dist/app/IPublicClientApplication.d.ts +45 -45
- package/dist/app/IPublicClientApplication.js +96 -96
- package/dist/app/PublicClientApplication.d.ts +244 -244
- package/dist/app/PublicClientApplication.js +307 -307
- package/dist/broker/nativeBroker/NativeMessageHandler.d.ts +63 -63
- package/dist/broker/nativeBroker/NativeMessageHandler.js +255 -255
- package/dist/broker/nativeBroker/NativeRequest.d.ts +43 -43
- package/dist/broker/nativeBroker/NativeResponse.d.ts +48 -48
- package/dist/cache/AsyncMemoryStorage.d.ts +51 -51
- package/dist/cache/AsyncMemoryStorage.js +132 -132
- package/dist/cache/BrowserCacheManager.d.ts +376 -377
- package/dist/cache/BrowserCacheManager.d.ts.map +1 -1
- package/dist/cache/BrowserCacheManager.js +1275 -1276
- package/dist/cache/BrowserCacheManager.js.map +1 -1
- package/dist/cache/BrowserStorage.d.ts +11 -11
- package/dist/cache/BrowserStorage.js +35 -35
- package/dist/cache/CryptoKeyStore.d.ts +18 -17
- package/dist/cache/CryptoKeyStore.d.ts.map +1 -1
- package/dist/cache/CryptoKeyStore.js +40 -41
- package/dist/cache/CryptoKeyStore.js.map +1 -1
- package/dist/cache/DatabaseStorage.d.ts +56 -56
- package/dist/cache/DatabaseStorage.js +190 -190
- package/dist/cache/IAsyncMemoryStorage.d.ts +27 -27
- package/dist/cache/ITokenCache.d.ts +10 -10
- package/dist/cache/IWindowStorage.d.ts +27 -27
- package/dist/cache/MemoryStorage.d.ts +11 -11
- package/dist/cache/MemoryStorage.js +31 -31
- package/dist/cache/TokenCache.d.ts +76 -76
- package/dist/cache/TokenCache.js +225 -225
- package/dist/config/Configuration.d.ts +187 -203
- package/dist/config/Configuration.d.ts.map +1 -1
- package/dist/config/Configuration.js +97 -101
- package/dist/config/Configuration.js.map +1 -1
- package/dist/controllers/ControllerFactory.d.ts +9 -9
- package/dist/controllers/ControllerFactory.js +37 -37
- package/dist/controllers/IController.d.ts +66 -66
- package/dist/controllers/IController.d.ts.map +1 -1
- package/dist/controllers/StandardController.d.ts +413 -413
- package/dist/controllers/StandardController.d.ts.map +1 -1
- package/dist/controllers/StandardController.js +1277 -1272
- package/dist/controllers/StandardController.js.map +1 -1
- package/dist/crypto/BrowserCrypto.d.ts +49 -61
- package/dist/crypto/BrowserCrypto.d.ts.map +1 -1
- package/dist/crypto/BrowserCrypto.js +93 -134
- package/dist/crypto/BrowserCrypto.js.map +1 -1
- package/dist/crypto/CryptoOps.d.ts +72 -73
- package/dist/crypto/CryptoOps.d.ts.map +1 -1
- package/dist/crypto/CryptoOps.js +150 -150
- package/dist/crypto/CryptoOps.js.map +1 -1
- package/dist/crypto/GuidGenerator.d.ts +12 -12
- package/dist/crypto/GuidGenerator.js +96 -96
- package/dist/crypto/ISubtleCrypto.d.ts +9 -9
- package/dist/crypto/ModernBrowserCrypto.d.ts +9 -9
- package/dist/crypto/ModernBrowserCrypto.js +24 -24
- package/dist/crypto/PkceGenerator.d.ts +24 -24
- package/dist/crypto/PkceGenerator.js +58 -58
- package/dist/crypto/SignedHttpRequest.d.ts +30 -30
- package/dist/crypto/SignedHttpRequest.js +39 -39
- package/dist/encode/Base64Decode.d.ts +22 -22
- package/dist/encode/Base64Decode.js +73 -73
- package/dist/encode/Base64Encode.d.ts +31 -31
- package/dist/encode/Base64Encode.js +79 -79
- package/dist/error/BrowserAuthError.d.ts +382 -382
- package/dist/error/BrowserAuthError.js +483 -483
- package/dist/error/BrowserConfigurationAuthError.d.ts +70 -70
- package/dist/error/BrowserConfigurationAuthError.js +96 -96
- package/dist/error/NativeAuthError.d.ts +57 -56
- package/dist/error/NativeAuthError.d.ts.map +1 -1
- package/dist/error/NativeAuthError.js +93 -88
- package/dist/error/NativeAuthError.js.map +1 -1
- package/dist/event/EventHandler.d.ts +41 -41
- package/dist/event/EventHandler.js +119 -119
- package/dist/event/EventMessage.d.ts +25 -25
- package/dist/event/EventMessage.d.ts.map +1 -1
- package/dist/event/EventMessage.js +68 -67
- package/dist/event/EventMessage.js.map +1 -1
- package/dist/event/EventType.d.ts +28 -26
- package/dist/event/EventType.d.ts.map +1 -1
- package/dist/event/EventType.js +32 -32
- package/dist/event/EventType.js.map +1 -1
- package/dist/index.d.ts +35 -35
- package/dist/index.js +1 -1
- package/dist/interaction_client/BaseInteractionClient.d.ts +53 -52
- package/dist/interaction_client/BaseInteractionClient.d.ts.map +1 -1
- package/dist/interaction_client/BaseInteractionClient.js +151 -138
- package/dist/interaction_client/BaseInteractionClient.js.map +1 -1
- package/dist/interaction_client/HybridSpaAuthorizationCodeClient.d.ts +4 -4
- package/dist/interaction_client/HybridSpaAuthorizationCodeClient.js +10 -10
- package/dist/interaction_client/NativeInteractionClient.d.ts +148 -148
- package/dist/interaction_client/NativeInteractionClient.d.ts.map +1 -1
- package/dist/interaction_client/NativeInteractionClient.js +521 -517
- package/dist/interaction_client/NativeInteractionClient.js.map +1 -1
- package/dist/interaction_client/PopupClient.d.ts +111 -111
- package/dist/interaction_client/PopupClient.js +476 -476
- package/dist/interaction_client/RedirectClient.d.ts +48 -48
- package/dist/interaction_client/RedirectClient.d.ts.map +1 -1
- package/dist/interaction_client/RedirectClient.js +291 -290
- package/dist/interaction_client/RedirectClient.js.map +1 -1
- package/dist/interaction_client/SilentAuthCodeClient.d.ts +22 -22
- package/dist/interaction_client/SilentAuthCodeClient.js +62 -62
- package/dist/interaction_client/SilentCacheClient.d.ts +21 -21
- package/dist/interaction_client/SilentCacheClient.js +67 -67
- package/dist/interaction_client/SilentCacheClient.js.map +1 -1
- package/dist/interaction_client/SilentIframeClient.d.ts +31 -31
- package/dist/interaction_client/SilentIframeClient.js +127 -127
- package/dist/interaction_client/SilentRefreshClient.d.ts +19 -19
- package/dist/interaction_client/SilentRefreshClient.js +62 -62
- package/dist/interaction_client/SilentRefreshClient.js.map +1 -1
- package/dist/interaction_client/StandardInteractionClient.d.ts +59 -59
- package/dist/interaction_client/StandardInteractionClient.js +259 -259
- package/dist/interaction_handler/InteractionHandler.d.ts +39 -39
- package/dist/interaction_handler/InteractionHandler.js +127 -127
- package/dist/interaction_handler/RedirectHandler.d.ts +24 -24
- package/dist/interaction_handler/RedirectHandler.js +118 -118
- package/dist/interaction_handler/SilentHandler.d.ts +47 -47
- package/dist/interaction_handler/SilentHandler.js +162 -162
- package/dist/internals.d.ts +23 -23
- package/dist/internals.js +4 -4
- package/dist/navigation/INavigationClient.d.ts +16 -16
- package/dist/navigation/NavigationClient.d.ts +22 -22
- package/dist/navigation/NavigationClient.js +40 -40
- package/dist/navigation/NavigationOptions.d.ts +12 -12
- package/dist/network/FetchClient.d.ts +26 -26
- package/dist/network/FetchClient.js +99 -99
- package/dist/network/XhrClient.d.ts +40 -40
- package/dist/network/XhrClient.js +117 -117
- package/dist/operatingcontext/BaseOperatingContext.d.ts +40 -40
- package/dist/operatingcontext/BaseOperatingContext.js +44 -44
- package/dist/operatingcontext/StandardOperatingContext.d.ts +25 -25
- package/dist/operatingcontext/StandardOperatingContext.js +43 -43
- package/dist/operatingcontext/TeamsAppOperatingContext.d.ts +25 -25
- package/dist/operatingcontext/TeamsAppOperatingContext.js +42 -42
- package/dist/packageMetadata.d.ts +2 -2
- package/dist/packageMetadata.d.ts.map +1 -1
- package/dist/packageMetadata.js +4 -4
- package/dist/request/AuthorizationCodeRequest.d.ts +8 -8
- package/dist/request/AuthorizationUrlRequest.d.ts +8 -8
- package/dist/request/EndSessionPopupRequest.d.ts +18 -18
- package/dist/request/EndSessionRequest.d.ts +15 -15
- package/dist/request/PopupRequest.d.ts +32 -32
- package/dist/request/PopupWindowAttributes.d.ts +15 -15
- package/dist/request/RedirectRequest.d.ts +33 -33
- package/dist/request/SilentRequest.d.ts +30 -30
- package/dist/request/SsoSilentRequest.d.ts +26 -26
- package/dist/telemetry/BrowserPerformanceClient.d.ts +37 -38
- package/dist/telemetry/BrowserPerformanceClient.d.ts.map +1 -1
- package/dist/telemetry/BrowserPerformanceClient.js +124 -124
- package/dist/telemetry/BrowserPerformanceClient.js.map +1 -1
- package/dist/telemetry/BrowserPerformanceMeasurement.d.ts +21 -21
- package/dist/telemetry/BrowserPerformanceMeasurement.js +92 -92
- package/dist/utils/BrowserConstants.d.ts +176 -166
- package/dist/utils/BrowserConstants.d.ts.map +1 -1
- package/dist/utils/BrowserConstants.js +205 -215
- package/dist/utils/BrowserConstants.js.map +1 -1
- package/dist/utils/BrowserProtocolUtils.d.ts +18 -18
- package/dist/utils/BrowserProtocolUtils.js +34 -34
- package/dist/utils/BrowserStringUtils.d.ts +26 -26
- package/dist/utils/BrowserStringUtils.js +149 -149
- package/dist/utils/BrowserUtils.d.ts +65 -65
- package/dist/utils/BrowserUtils.js +138 -138
- package/dist/utils/MathUtils.d.ts +11 -11
- package/dist/utils/MathUtils.js +21 -21
- package/lib/msal-browser.cjs.js +18227 -0
- package/lib/msal-browser.cjs.js.map +1 -0
- package/lib/msal-browser.js +18233 -0
- package/lib/msal-browser.js.map +1 -0
- package/lib/msal-browser.min.js +63 -0
- package/package.json +101 -95
- package/dist/crypto/MsBrowserCrypto.d.ts +0 -10
- package/dist/crypto/MsBrowserCrypto.d.ts.map +0 -1
- package/dist/crypto/MsBrowserCrypto.js +0 -88
- package/dist/crypto/MsBrowserCrypto.js.map +0 -1
- package/dist/crypto/MsrBrowserCrypto.d.ts +0 -18
- package/dist/crypto/MsrBrowserCrypto.d.ts.map +0 -1
- package/dist/crypto/MsrBrowserCrypto.js +0 -35
- package/dist/crypto/MsrBrowserCrypto.js.map +0 -1
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
import { CommonAuthorizationCodeRequest, AuthorizationCodeClient, Logger, IPerformanceClient } from "@azure/msal-common";
|
|
2
|
-
import { InteractionHandler } from "./InteractionHandler";
|
|
3
|
-
import { BrowserCacheManager } from "../cache/BrowserCacheManager";
|
|
4
|
-
import { BrowserSystemOptions } from "../config/Configuration";
|
|
5
|
-
export declare class SilentHandler extends InteractionHandler {
|
|
6
|
-
private navigateFrameWait;
|
|
7
|
-
private pollIntervalMilliseconds;
|
|
8
|
-
constructor(authCodeModule: AuthorizationCodeClient, storageImpl: BrowserCacheManager, authCodeRequest: CommonAuthorizationCodeRequest, logger: Logger, systemOptions: Required<Pick<BrowserSystemOptions, "navigateFrameWait" | "pollIntervalMilliseconds">>, performanceClient: IPerformanceClient);
|
|
9
|
-
/**
|
|
10
|
-
* Creates a hidden iframe to given URL using user-requested scopes as an id.
|
|
11
|
-
* @param urlNavigate
|
|
12
|
-
* @param userRequestScopes
|
|
13
|
-
*/
|
|
14
|
-
initiateAuthRequest(requestUrl: string): Promise<HTMLIFrameElement>;
|
|
15
|
-
/**
|
|
16
|
-
* Monitors an iframe content window until it loads a url with a known hash, or hits a specified timeout.
|
|
17
|
-
* @param iframe
|
|
18
|
-
* @param timeout
|
|
19
|
-
*/
|
|
20
|
-
monitorIframeForHash(iframe: HTMLIFrameElement, timeout: number): Promise<string>;
|
|
21
|
-
/**
|
|
22
|
-
* @hidden
|
|
23
|
-
* Loads iframe with authorization endpoint URL
|
|
24
|
-
* @ignore
|
|
25
|
-
*/
|
|
26
|
-
private loadFrame;
|
|
27
|
-
/**
|
|
28
|
-
* @hidden
|
|
29
|
-
* Loads the iframe synchronously when the navigateTimeFrame is set to `0`
|
|
30
|
-
* @param urlNavigate
|
|
31
|
-
* @param frameName
|
|
32
|
-
* @param logger
|
|
33
|
-
*/
|
|
34
|
-
private loadFrameSync;
|
|
35
|
-
/**
|
|
36
|
-
* @hidden
|
|
37
|
-
* Creates a new hidden iframe or gets an existing one for silent token renewal.
|
|
38
|
-
* @ignore
|
|
39
|
-
*/
|
|
40
|
-
private createHiddenIframe;
|
|
41
|
-
/**
|
|
42
|
-
* @hidden
|
|
43
|
-
* Removes a hidden iframe from the page.
|
|
44
|
-
* @ignore
|
|
45
|
-
*/
|
|
46
|
-
private removeHiddenIframe;
|
|
47
|
-
}
|
|
1
|
+
import { CommonAuthorizationCodeRequest, AuthorizationCodeClient, Logger, IPerformanceClient } from "@azure/msal-common";
|
|
2
|
+
import { InteractionHandler } from "./InteractionHandler";
|
|
3
|
+
import { BrowserCacheManager } from "../cache/BrowserCacheManager";
|
|
4
|
+
import { BrowserSystemOptions } from "../config/Configuration";
|
|
5
|
+
export declare class SilentHandler extends InteractionHandler {
|
|
6
|
+
private navigateFrameWait;
|
|
7
|
+
private pollIntervalMilliseconds;
|
|
8
|
+
constructor(authCodeModule: AuthorizationCodeClient, storageImpl: BrowserCacheManager, authCodeRequest: CommonAuthorizationCodeRequest, logger: Logger, systemOptions: Required<Pick<BrowserSystemOptions, "navigateFrameWait" | "pollIntervalMilliseconds">>, performanceClient: IPerformanceClient);
|
|
9
|
+
/**
|
|
10
|
+
* Creates a hidden iframe to given URL using user-requested scopes as an id.
|
|
11
|
+
* @param urlNavigate
|
|
12
|
+
* @param userRequestScopes
|
|
13
|
+
*/
|
|
14
|
+
initiateAuthRequest(requestUrl: string): Promise<HTMLIFrameElement>;
|
|
15
|
+
/**
|
|
16
|
+
* Monitors an iframe content window until it loads a url with a known hash, or hits a specified timeout.
|
|
17
|
+
* @param iframe
|
|
18
|
+
* @param timeout
|
|
19
|
+
*/
|
|
20
|
+
monitorIframeForHash(iframe: HTMLIFrameElement, timeout: number): Promise<string>;
|
|
21
|
+
/**
|
|
22
|
+
* @hidden
|
|
23
|
+
* Loads iframe with authorization endpoint URL
|
|
24
|
+
* @ignore
|
|
25
|
+
*/
|
|
26
|
+
private loadFrame;
|
|
27
|
+
/**
|
|
28
|
+
* @hidden
|
|
29
|
+
* Loads the iframe synchronously when the navigateTimeFrame is set to `0`
|
|
30
|
+
* @param urlNavigate
|
|
31
|
+
* @param frameName
|
|
32
|
+
* @param logger
|
|
33
|
+
*/
|
|
34
|
+
private loadFrameSync;
|
|
35
|
+
/**
|
|
36
|
+
* @hidden
|
|
37
|
+
* Creates a new hidden iframe or gets an existing one for silent token renewal.
|
|
38
|
+
* @ignore
|
|
39
|
+
*/
|
|
40
|
+
private createHiddenIframe;
|
|
41
|
+
/**
|
|
42
|
+
* @hidden
|
|
43
|
+
* Removes a hidden iframe from the page.
|
|
44
|
+
* @ignore
|
|
45
|
+
*/
|
|
46
|
+
private removeHiddenIframe;
|
|
47
|
+
}
|
|
48
48
|
//# sourceMappingURL=SilentHandler.d.ts.map
|
|
@@ -1,171 +1,171 @@
|
|
|
1
|
-
/*! @azure/msal-browser v3.0.0-
|
|
1
|
+
/*! @azure/msal-browser v3.0.0-beta.0 2023-06-19 */
|
|
2
2
|
'use strict';
|
|
3
3
|
import { PerformanceEvents, StringUtils, Constants, UrlString } from '@azure/msal-common';
|
|
4
4
|
import { InteractionHandler } from './InteractionHandler.js';
|
|
5
5
|
import { BrowserAuthError } from '../error/BrowserAuthError.js';
|
|
6
6
|
import { DEFAULT_IFRAME_TIMEOUT_MS } from '../config/Configuration.js';
|
|
7
7
|
|
|
8
|
-
/*
|
|
9
|
-
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
10
|
-
* Licensed under the MIT License.
|
|
11
|
-
*/
|
|
12
|
-
class SilentHandler extends InteractionHandler {
|
|
13
|
-
constructor(authCodeModule, storageImpl, authCodeRequest, logger, systemOptions, performanceClient) {
|
|
14
|
-
super(authCodeModule, storageImpl, authCodeRequest, logger, performanceClient);
|
|
15
|
-
this.navigateFrameWait = systemOptions.navigateFrameWait;
|
|
16
|
-
this.pollIntervalMilliseconds = systemOptions.pollIntervalMilliseconds;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Creates a hidden iframe to given URL using user-requested scopes as an id.
|
|
20
|
-
* @param urlNavigate
|
|
21
|
-
* @param userRequestScopes
|
|
22
|
-
*/
|
|
23
|
-
async initiateAuthRequest(requestUrl) {
|
|
24
|
-
this.performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerInitiateAuthRequest, this.authCodeRequest.correlationId);
|
|
25
|
-
if (StringUtils.isEmpty(requestUrl)) {
|
|
26
|
-
// Throw error if request URL is empty.
|
|
27
|
-
this.logger.info("Navigate url is empty");
|
|
28
|
-
throw BrowserAuthError.createEmptyNavigationUriError();
|
|
29
|
-
}
|
|
30
|
-
if (this.navigateFrameWait) {
|
|
31
|
-
this.performanceClient.setPreQueueTime(PerformanceEvents.SilentHandlerLoadFrame, this.authCodeRequest.correlationId);
|
|
32
|
-
return await this.loadFrame(requestUrl);
|
|
33
|
-
}
|
|
34
|
-
return this.loadFrameSync(requestUrl);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Monitors an iframe content window until it loads a url with a known hash, or hits a specified timeout.
|
|
38
|
-
* @param iframe
|
|
39
|
-
* @param timeout
|
|
40
|
-
*/
|
|
41
|
-
monitorIframeForHash(iframe, timeout) {
|
|
42
|
-
this.performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerMonitorIframeForHash, this.authCodeRequest.correlationId);
|
|
43
|
-
return new Promise((resolve, reject) => {
|
|
44
|
-
if (timeout < DEFAULT_IFRAME_TIMEOUT_MS) {
|
|
45
|
-
this.logger.warning(`system.loadFrameTimeout or system.iframeHashTimeout set to lower (${timeout}ms) than the default (${DEFAULT_IFRAME_TIMEOUT_MS}ms). This may result in timeouts.`);
|
|
46
|
-
}
|
|
47
|
-
/*
|
|
48
|
-
* Polling for iframes can be purely timing based,
|
|
49
|
-
* since we don't need to account for interaction.
|
|
50
|
-
*/
|
|
51
|
-
const nowMark = window.performance.now();
|
|
52
|
-
const timeoutMark = nowMark + timeout;
|
|
53
|
-
const intervalId = setInterval(() => {
|
|
54
|
-
if (window.performance.now() > timeoutMark) {
|
|
55
|
-
this.removeHiddenIframe(iframe);
|
|
56
|
-
clearInterval(intervalId);
|
|
57
|
-
reject(BrowserAuthError.createMonitorIframeTimeoutError());
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
let href = Constants.EMPTY_STRING;
|
|
61
|
-
const contentWindow = iframe.contentWindow;
|
|
62
|
-
try {
|
|
63
|
-
/*
|
|
64
|
-
* Will throw if cross origin,
|
|
65
|
-
* which should be caught and ignored
|
|
66
|
-
* since we need the interval to keep running while on STS UI.
|
|
67
|
-
*/
|
|
68
|
-
href = contentWindow
|
|
69
|
-
? contentWindow.location.href
|
|
70
|
-
: Constants.EMPTY_STRING;
|
|
71
|
-
}
|
|
72
|
-
catch (e) { }
|
|
73
|
-
if (StringUtils.isEmpty(href) || href === "about:blank") {
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
const contentHash = contentWindow
|
|
77
|
-
? contentWindow.location.hash
|
|
78
|
-
: Constants.EMPTY_STRING;
|
|
79
|
-
if (contentHash) {
|
|
80
|
-
if (UrlString.hashContainsKnownProperties(contentHash)) {
|
|
81
|
-
// Success case
|
|
82
|
-
this.removeHiddenIframe(iframe);
|
|
83
|
-
clearInterval(intervalId);
|
|
84
|
-
resolve(contentHash);
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
// Hash is present but incorrect
|
|
89
|
-
this.logger.error("SilentHandler:monitorIFrameForHash - a hash is present in the iframe but it does not contain known properties. It's likely that the hash has been replaced by code running on the redirectUri page.");
|
|
90
|
-
this.logger.errorPii(`SilentHandler:monitorIFrameForHash - the url detected in the iframe is: ${href}`);
|
|
91
|
-
this.removeHiddenIframe(iframe);
|
|
92
|
-
clearInterval(intervalId);
|
|
93
|
-
reject(BrowserAuthError.createHashDoesNotContainKnownPropertiesError());
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
// No hash is present
|
|
99
|
-
this.logger.error("SilentHandler:monitorIFrameForHash - the request has returned to the redirectUri but a hash is not present in the iframe. It's likely that the hash has been removed or the page has been redirected by code running on the redirectUri page.");
|
|
100
|
-
this.logger.errorPii(`SilentHandler:monitorIFrameForHash - the url detected in the iframe is: ${href}`);
|
|
101
|
-
this.removeHiddenIframe(iframe);
|
|
102
|
-
clearInterval(intervalId);
|
|
103
|
-
reject(BrowserAuthError.createEmptyHashError());
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
}, this.pollIntervalMilliseconds);
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* @hidden
|
|
111
|
-
* Loads iframe with authorization endpoint URL
|
|
112
|
-
* @ignore
|
|
113
|
-
*/
|
|
114
|
-
loadFrame(urlNavigate) {
|
|
115
|
-
this.performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerLoadFrame, this.authCodeRequest.correlationId);
|
|
116
|
-
/*
|
|
117
|
-
* This trick overcomes iframe navigation in IE
|
|
118
|
-
* IE does not load the page consistently in iframe
|
|
119
|
-
*/
|
|
120
|
-
return new Promise((resolve, reject) => {
|
|
121
|
-
const frameHandle = this.createHiddenIframe();
|
|
122
|
-
setTimeout(() => {
|
|
123
|
-
if (!frameHandle) {
|
|
124
|
-
reject("Unable to load iframe");
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
frameHandle.src = urlNavigate;
|
|
128
|
-
resolve(frameHandle);
|
|
129
|
-
}, this.navigateFrameWait);
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* @hidden
|
|
134
|
-
* Loads the iframe synchronously when the navigateTimeFrame is set to `0`
|
|
135
|
-
* @param urlNavigate
|
|
136
|
-
* @param frameName
|
|
137
|
-
* @param logger
|
|
138
|
-
*/
|
|
139
|
-
loadFrameSync(urlNavigate) {
|
|
140
|
-
const frameHandle = this.createHiddenIframe();
|
|
141
|
-
frameHandle.src = urlNavigate;
|
|
142
|
-
return frameHandle;
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* @hidden
|
|
146
|
-
* Creates a new hidden iframe or gets an existing one for silent token renewal.
|
|
147
|
-
* @ignore
|
|
148
|
-
*/
|
|
149
|
-
createHiddenIframe() {
|
|
150
|
-
const authFrame = document.createElement("iframe");
|
|
151
|
-
authFrame.style.visibility = "hidden";
|
|
152
|
-
authFrame.style.position = "absolute";
|
|
153
|
-
authFrame.style.width = authFrame.style.height = "0";
|
|
154
|
-
authFrame.style.border = "0";
|
|
155
|
-
authFrame.setAttribute("sandbox", "allow-scripts allow-same-origin allow-forms");
|
|
156
|
-
document.getElementsByTagName("body")[0].appendChild(authFrame);
|
|
157
|
-
return authFrame;
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* @hidden
|
|
161
|
-
* Removes a hidden iframe from the page.
|
|
162
|
-
* @ignore
|
|
163
|
-
*/
|
|
164
|
-
removeHiddenIframe(iframe) {
|
|
165
|
-
if (document.body === iframe.parentNode) {
|
|
166
|
-
document.body.removeChild(iframe);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
8
|
+
/*
|
|
9
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
10
|
+
* Licensed under the MIT License.
|
|
11
|
+
*/
|
|
12
|
+
class SilentHandler extends InteractionHandler {
|
|
13
|
+
constructor(authCodeModule, storageImpl, authCodeRequest, logger, systemOptions, performanceClient) {
|
|
14
|
+
super(authCodeModule, storageImpl, authCodeRequest, logger, performanceClient);
|
|
15
|
+
this.navigateFrameWait = systemOptions.navigateFrameWait;
|
|
16
|
+
this.pollIntervalMilliseconds = systemOptions.pollIntervalMilliseconds;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Creates a hidden iframe to given URL using user-requested scopes as an id.
|
|
20
|
+
* @param urlNavigate
|
|
21
|
+
* @param userRequestScopes
|
|
22
|
+
*/
|
|
23
|
+
async initiateAuthRequest(requestUrl) {
|
|
24
|
+
this.performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerInitiateAuthRequest, this.authCodeRequest.correlationId);
|
|
25
|
+
if (StringUtils.isEmpty(requestUrl)) {
|
|
26
|
+
// Throw error if request URL is empty.
|
|
27
|
+
this.logger.info("Navigate url is empty");
|
|
28
|
+
throw BrowserAuthError.createEmptyNavigationUriError();
|
|
29
|
+
}
|
|
30
|
+
if (this.navigateFrameWait) {
|
|
31
|
+
this.performanceClient.setPreQueueTime(PerformanceEvents.SilentHandlerLoadFrame, this.authCodeRequest.correlationId);
|
|
32
|
+
return await this.loadFrame(requestUrl);
|
|
33
|
+
}
|
|
34
|
+
return this.loadFrameSync(requestUrl);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Monitors an iframe content window until it loads a url with a known hash, or hits a specified timeout.
|
|
38
|
+
* @param iframe
|
|
39
|
+
* @param timeout
|
|
40
|
+
*/
|
|
41
|
+
monitorIframeForHash(iframe, timeout) {
|
|
42
|
+
this.performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerMonitorIframeForHash, this.authCodeRequest.correlationId);
|
|
43
|
+
return new Promise((resolve, reject) => {
|
|
44
|
+
if (timeout < DEFAULT_IFRAME_TIMEOUT_MS) {
|
|
45
|
+
this.logger.warning(`system.loadFrameTimeout or system.iframeHashTimeout set to lower (${timeout}ms) than the default (${DEFAULT_IFRAME_TIMEOUT_MS}ms). This may result in timeouts.`);
|
|
46
|
+
}
|
|
47
|
+
/*
|
|
48
|
+
* Polling for iframes can be purely timing based,
|
|
49
|
+
* since we don't need to account for interaction.
|
|
50
|
+
*/
|
|
51
|
+
const nowMark = window.performance.now();
|
|
52
|
+
const timeoutMark = nowMark + timeout;
|
|
53
|
+
const intervalId = setInterval(() => {
|
|
54
|
+
if (window.performance.now() > timeoutMark) {
|
|
55
|
+
this.removeHiddenIframe(iframe);
|
|
56
|
+
clearInterval(intervalId);
|
|
57
|
+
reject(BrowserAuthError.createMonitorIframeTimeoutError());
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
let href = Constants.EMPTY_STRING;
|
|
61
|
+
const contentWindow = iframe.contentWindow;
|
|
62
|
+
try {
|
|
63
|
+
/*
|
|
64
|
+
* Will throw if cross origin,
|
|
65
|
+
* which should be caught and ignored
|
|
66
|
+
* since we need the interval to keep running while on STS UI.
|
|
67
|
+
*/
|
|
68
|
+
href = contentWindow
|
|
69
|
+
? contentWindow.location.href
|
|
70
|
+
: Constants.EMPTY_STRING;
|
|
71
|
+
}
|
|
72
|
+
catch (e) { }
|
|
73
|
+
if (StringUtils.isEmpty(href) || href === "about:blank") {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const contentHash = contentWindow
|
|
77
|
+
? contentWindow.location.hash
|
|
78
|
+
: Constants.EMPTY_STRING;
|
|
79
|
+
if (contentHash) {
|
|
80
|
+
if (UrlString.hashContainsKnownProperties(contentHash)) {
|
|
81
|
+
// Success case
|
|
82
|
+
this.removeHiddenIframe(iframe);
|
|
83
|
+
clearInterval(intervalId);
|
|
84
|
+
resolve(contentHash);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// Hash is present but incorrect
|
|
89
|
+
this.logger.error("SilentHandler:monitorIFrameForHash - a hash is present in the iframe but it does not contain known properties. It's likely that the hash has been replaced by code running on the redirectUri page.");
|
|
90
|
+
this.logger.errorPii(`SilentHandler:monitorIFrameForHash - the url detected in the iframe is: ${href}`);
|
|
91
|
+
this.removeHiddenIframe(iframe);
|
|
92
|
+
clearInterval(intervalId);
|
|
93
|
+
reject(BrowserAuthError.createHashDoesNotContainKnownPropertiesError());
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
// No hash is present
|
|
99
|
+
this.logger.error("SilentHandler:monitorIFrameForHash - the request has returned to the redirectUri but a hash is not present in the iframe. It's likely that the hash has been removed or the page has been redirected by code running on the redirectUri page.");
|
|
100
|
+
this.logger.errorPii(`SilentHandler:monitorIFrameForHash - the url detected in the iframe is: ${href}`);
|
|
101
|
+
this.removeHiddenIframe(iframe);
|
|
102
|
+
clearInterval(intervalId);
|
|
103
|
+
reject(BrowserAuthError.createEmptyHashError());
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
}, this.pollIntervalMilliseconds);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* @hidden
|
|
111
|
+
* Loads iframe with authorization endpoint URL
|
|
112
|
+
* @ignore
|
|
113
|
+
*/
|
|
114
|
+
loadFrame(urlNavigate) {
|
|
115
|
+
this.performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerLoadFrame, this.authCodeRequest.correlationId);
|
|
116
|
+
/*
|
|
117
|
+
* This trick overcomes iframe navigation in IE
|
|
118
|
+
* IE does not load the page consistently in iframe
|
|
119
|
+
*/
|
|
120
|
+
return new Promise((resolve, reject) => {
|
|
121
|
+
const frameHandle = this.createHiddenIframe();
|
|
122
|
+
setTimeout(() => {
|
|
123
|
+
if (!frameHandle) {
|
|
124
|
+
reject("Unable to load iframe");
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
frameHandle.src = urlNavigate;
|
|
128
|
+
resolve(frameHandle);
|
|
129
|
+
}, this.navigateFrameWait);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* @hidden
|
|
134
|
+
* Loads the iframe synchronously when the navigateTimeFrame is set to `0`
|
|
135
|
+
* @param urlNavigate
|
|
136
|
+
* @param frameName
|
|
137
|
+
* @param logger
|
|
138
|
+
*/
|
|
139
|
+
loadFrameSync(urlNavigate) {
|
|
140
|
+
const frameHandle = this.createHiddenIframe();
|
|
141
|
+
frameHandle.src = urlNavigate;
|
|
142
|
+
return frameHandle;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* @hidden
|
|
146
|
+
* Creates a new hidden iframe or gets an existing one for silent token renewal.
|
|
147
|
+
* @ignore
|
|
148
|
+
*/
|
|
149
|
+
createHiddenIframe() {
|
|
150
|
+
const authFrame = document.createElement("iframe");
|
|
151
|
+
authFrame.style.visibility = "hidden";
|
|
152
|
+
authFrame.style.position = "absolute";
|
|
153
|
+
authFrame.style.width = authFrame.style.height = "0";
|
|
154
|
+
authFrame.style.border = "0";
|
|
155
|
+
authFrame.setAttribute("sandbox", "allow-scripts allow-same-origin allow-forms");
|
|
156
|
+
document.getElementsByTagName("body")[0].appendChild(authFrame);
|
|
157
|
+
return authFrame;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* @hidden
|
|
161
|
+
* Removes a hidden iframe from the page.
|
|
162
|
+
* @ignore
|
|
163
|
+
*/
|
|
164
|
+
removeHiddenIframe(iframe) {
|
|
165
|
+
if (document.body === iframe.parentNode) {
|
|
166
|
+
document.body.removeChild(iframe);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
169
|
}
|
|
170
170
|
|
|
171
171
|
export { SilentHandler };
|
package/dist/internals.d.ts
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Warning: This set of exports is purely intended to be used by other MSAL libraries, and should be considered potentially unstable. We strongly discourage using them directly, you do so at your own risk.
|
|
3
|
-
* Breaking changes to these APIs will be shipped under a minor version, instead of a major version.
|
|
4
|
-
*/
|
|
5
|
-
export { BrowserCacheManager } from "./cache/BrowserCacheManager";
|
|
6
|
-
export { StandardInteractionClient } from "./interaction_client/StandardInteractionClient";
|
|
7
|
-
export { RedirectClient } from "./interaction_client/RedirectClient";
|
|
8
|
-
export { PopupClient } from "./interaction_client/PopupClient";
|
|
9
|
-
export { SilentIframeClient } from "./interaction_client/SilentIframeClient";
|
|
10
|
-
export { SilentCacheClient } from "./interaction_client/SilentCacheClient";
|
|
11
|
-
export { SilentRefreshClient } from "./interaction_client/SilentRefreshClient";
|
|
12
|
-
export { NativeInteractionClient } from "./interaction_client/NativeInteractionClient";
|
|
13
|
-
export { RedirectHandler } from "./interaction_handler/RedirectHandler";
|
|
14
|
-
export { EventHandler } from "./event/EventHandler";
|
|
15
|
-
export { NativeMessageHandler } from "./broker/nativeBroker/NativeMessageHandler";
|
|
16
|
-
export { BrowserStateObject } from "./utils/BrowserProtocolUtils";
|
|
17
|
-
export { BrowserConstants, TemporaryCacheKeys } from "./utils/BrowserConstants";
|
|
18
|
-
export { CryptoOps } from "./crypto/CryptoOps";
|
|
19
|
-
export { NativeAuthError } from "./error/NativeAuthError";
|
|
20
|
-
export { BrowserPerformanceClient } from "./telemetry/BrowserPerformanceClient";
|
|
21
|
-
export { BrowserPerformanceMeasurement } from "./telemetry/BrowserPerformanceMeasurement";
|
|
22
|
-
export { NativeTokenRequest } from "./broker/nativeBroker/NativeRequest";
|
|
23
|
-
export { NativeResponse, MATS } from "./broker/nativeBroker/NativeResponse";
|
|
1
|
+
/**
|
|
2
|
+
* Warning: This set of exports is purely intended to be used by other MSAL libraries, and should be considered potentially unstable. We strongly discourage using them directly, you do so at your own risk.
|
|
3
|
+
* Breaking changes to these APIs will be shipped under a minor version, instead of a major version.
|
|
4
|
+
*/
|
|
5
|
+
export { BrowserCacheManager } from "./cache/BrowserCacheManager";
|
|
6
|
+
export { StandardInteractionClient } from "./interaction_client/StandardInteractionClient";
|
|
7
|
+
export { RedirectClient } from "./interaction_client/RedirectClient";
|
|
8
|
+
export { PopupClient } from "./interaction_client/PopupClient";
|
|
9
|
+
export { SilentIframeClient } from "./interaction_client/SilentIframeClient";
|
|
10
|
+
export { SilentCacheClient } from "./interaction_client/SilentCacheClient";
|
|
11
|
+
export { SilentRefreshClient } from "./interaction_client/SilentRefreshClient";
|
|
12
|
+
export { NativeInteractionClient } from "./interaction_client/NativeInteractionClient";
|
|
13
|
+
export { RedirectHandler } from "./interaction_handler/RedirectHandler";
|
|
14
|
+
export { EventHandler } from "./event/EventHandler";
|
|
15
|
+
export { NativeMessageHandler } from "./broker/nativeBroker/NativeMessageHandler";
|
|
16
|
+
export { BrowserStateObject } from "./utils/BrowserProtocolUtils";
|
|
17
|
+
export { BrowserConstants, TemporaryCacheKeys } from "./utils/BrowserConstants";
|
|
18
|
+
export { CryptoOps } from "./crypto/CryptoOps";
|
|
19
|
+
export { NativeAuthError } from "./error/NativeAuthError";
|
|
20
|
+
export { BrowserPerformanceClient } from "./telemetry/BrowserPerformanceClient";
|
|
21
|
+
export { BrowserPerformanceMeasurement } from "./telemetry/BrowserPerformanceMeasurement";
|
|
22
|
+
export { NativeTokenRequest } from "./broker/nativeBroker/NativeRequest";
|
|
23
|
+
export { NativeResponse, MATS } from "./broker/nativeBroker/NativeResponse";
|
|
24
24
|
//# sourceMappingURL=internals.d.ts.map
|
package/dist/internals.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @azure/msal-browser v3.0.0-
|
|
1
|
+
/*! @azure/msal-browser v3.0.0-beta.0 2023-06-19 */
|
|
2
2
|
'use strict';
|
|
3
3
|
export { BrowserCacheManager } from './cache/BrowserCacheManager.js';
|
|
4
4
|
export { StandardInteractionClient } from './interaction_client/StandardInteractionClient.js';
|
|
@@ -17,8 +17,8 @@ export { NativeAuthError } from './error/NativeAuthError.js';
|
|
|
17
17
|
export { BrowserPerformanceClient } from './telemetry/BrowserPerformanceClient.js';
|
|
18
18
|
export { BrowserPerformanceMeasurement } from './telemetry/BrowserPerformanceMeasurement.js';
|
|
19
19
|
|
|
20
|
-
/*
|
|
21
|
-
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
22
|
-
* Licensed under the MIT License.
|
|
20
|
+
/*
|
|
21
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
22
|
+
* Licensed under the MIT License.
|
|
23
23
|
*/
|
|
24
24
|
//# sourceMappingURL=internals.js.map
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { NavigationOptions } from "./NavigationOptions";
|
|
2
|
-
export interface INavigationClient {
|
|
3
|
-
/**
|
|
4
|
-
* Navigates to other pages within the same web application
|
|
5
|
-
* Return false if this doesn't cause the page to reload i.e. Client-side navigation
|
|
6
|
-
* @param url
|
|
7
|
-
* @param options
|
|
8
|
-
*/
|
|
9
|
-
navigateInternal(url: string, options: NavigationOptions): Promise<boolean>;
|
|
10
|
-
/**
|
|
11
|
-
* Navigates to other pages outside the web application i.e. the Identity Provider
|
|
12
|
-
* @param url
|
|
13
|
-
* @param options
|
|
14
|
-
*/
|
|
15
|
-
navigateExternal(url: string, options: NavigationOptions): Promise<boolean>;
|
|
16
|
-
}
|
|
1
|
+
import { NavigationOptions } from "./NavigationOptions";
|
|
2
|
+
export interface INavigationClient {
|
|
3
|
+
/**
|
|
4
|
+
* Navigates to other pages within the same web application
|
|
5
|
+
* Return false if this doesn't cause the page to reload i.e. Client-side navigation
|
|
6
|
+
* @param url
|
|
7
|
+
* @param options
|
|
8
|
+
*/
|
|
9
|
+
navigateInternal(url: string, options: NavigationOptions): Promise<boolean>;
|
|
10
|
+
/**
|
|
11
|
+
* Navigates to other pages outside the web application i.e. the Identity Provider
|
|
12
|
+
* @param url
|
|
13
|
+
* @param options
|
|
14
|
+
*/
|
|
15
|
+
navigateExternal(url: string, options: NavigationOptions): Promise<boolean>;
|
|
16
|
+
}
|
|
17
17
|
//# sourceMappingURL=INavigationClient.d.ts.map
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import { INavigationClient } from "./INavigationClient";
|
|
2
|
-
import { NavigationOptions } from "./NavigationOptions";
|
|
3
|
-
export declare class NavigationClient implements INavigationClient {
|
|
4
|
-
/**
|
|
5
|
-
* Navigates to other pages within the same web application
|
|
6
|
-
* @param url
|
|
7
|
-
* @param options
|
|
8
|
-
*/
|
|
9
|
-
navigateInternal(url: string, options: NavigationOptions): Promise<boolean>;
|
|
10
|
-
/**
|
|
11
|
-
* Navigates to other pages outside the web application i.e. the Identity Provider
|
|
12
|
-
* @param url
|
|
13
|
-
* @param options
|
|
14
|
-
*/
|
|
15
|
-
navigateExternal(url: string, options: NavigationOptions): Promise<boolean>;
|
|
16
|
-
/**
|
|
17
|
-
* Default navigation implementation invoked by the internal and external functions
|
|
18
|
-
* @param url
|
|
19
|
-
* @param options
|
|
20
|
-
*/
|
|
21
|
-
private static defaultNavigateWindow;
|
|
22
|
-
}
|
|
1
|
+
import { INavigationClient } from "./INavigationClient";
|
|
2
|
+
import { NavigationOptions } from "./NavigationOptions";
|
|
3
|
+
export declare class NavigationClient implements INavigationClient {
|
|
4
|
+
/**
|
|
5
|
+
* Navigates to other pages within the same web application
|
|
6
|
+
* @param url
|
|
7
|
+
* @param options
|
|
8
|
+
*/
|
|
9
|
+
navigateInternal(url: string, options: NavigationOptions): Promise<boolean>;
|
|
10
|
+
/**
|
|
11
|
+
* Navigates to other pages outside the web application i.e. the Identity Provider
|
|
12
|
+
* @param url
|
|
13
|
+
* @param options
|
|
14
|
+
*/
|
|
15
|
+
navigateExternal(url: string, options: NavigationOptions): Promise<boolean>;
|
|
16
|
+
/**
|
|
17
|
+
* Default navigation implementation invoked by the internal and external functions
|
|
18
|
+
* @param url
|
|
19
|
+
* @param options
|
|
20
|
+
*/
|
|
21
|
+
private static defaultNavigateWindow;
|
|
22
|
+
}
|
|
23
23
|
//# sourceMappingURL=NavigationClient.d.ts.map
|