@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.
Files changed (178) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +213 -213
  3. package/dist/app/IPublicClientApplication.d.ts +45 -45
  4. package/dist/app/IPublicClientApplication.js +96 -96
  5. package/dist/app/PublicClientApplication.d.ts +244 -244
  6. package/dist/app/PublicClientApplication.js +307 -307
  7. package/dist/broker/nativeBroker/NativeMessageHandler.d.ts +63 -63
  8. package/dist/broker/nativeBroker/NativeMessageHandler.js +255 -255
  9. package/dist/broker/nativeBroker/NativeRequest.d.ts +43 -43
  10. package/dist/broker/nativeBroker/NativeResponse.d.ts +48 -48
  11. package/dist/cache/AsyncMemoryStorage.d.ts +51 -51
  12. package/dist/cache/AsyncMemoryStorage.js +132 -132
  13. package/dist/cache/BrowserCacheManager.d.ts +376 -377
  14. package/dist/cache/BrowserCacheManager.d.ts.map +1 -1
  15. package/dist/cache/BrowserCacheManager.js +1275 -1276
  16. package/dist/cache/BrowserCacheManager.js.map +1 -1
  17. package/dist/cache/BrowserStorage.d.ts +11 -11
  18. package/dist/cache/BrowserStorage.js +35 -35
  19. package/dist/cache/CryptoKeyStore.d.ts +18 -17
  20. package/dist/cache/CryptoKeyStore.d.ts.map +1 -1
  21. package/dist/cache/CryptoKeyStore.js +40 -41
  22. package/dist/cache/CryptoKeyStore.js.map +1 -1
  23. package/dist/cache/DatabaseStorage.d.ts +56 -56
  24. package/dist/cache/DatabaseStorage.js +190 -190
  25. package/dist/cache/IAsyncMemoryStorage.d.ts +27 -27
  26. package/dist/cache/ITokenCache.d.ts +10 -10
  27. package/dist/cache/IWindowStorage.d.ts +27 -27
  28. package/dist/cache/MemoryStorage.d.ts +11 -11
  29. package/dist/cache/MemoryStorage.js +31 -31
  30. package/dist/cache/TokenCache.d.ts +76 -76
  31. package/dist/cache/TokenCache.js +225 -225
  32. package/dist/config/Configuration.d.ts +187 -203
  33. package/dist/config/Configuration.d.ts.map +1 -1
  34. package/dist/config/Configuration.js +97 -101
  35. package/dist/config/Configuration.js.map +1 -1
  36. package/dist/controllers/ControllerFactory.d.ts +9 -9
  37. package/dist/controllers/ControllerFactory.js +37 -37
  38. package/dist/controllers/IController.d.ts +66 -66
  39. package/dist/controllers/IController.d.ts.map +1 -1
  40. package/dist/controllers/StandardController.d.ts +413 -413
  41. package/dist/controllers/StandardController.d.ts.map +1 -1
  42. package/dist/controllers/StandardController.js +1277 -1272
  43. package/dist/controllers/StandardController.js.map +1 -1
  44. package/dist/crypto/BrowserCrypto.d.ts +49 -61
  45. package/dist/crypto/BrowserCrypto.d.ts.map +1 -1
  46. package/dist/crypto/BrowserCrypto.js +93 -134
  47. package/dist/crypto/BrowserCrypto.js.map +1 -1
  48. package/dist/crypto/CryptoOps.d.ts +72 -73
  49. package/dist/crypto/CryptoOps.d.ts.map +1 -1
  50. package/dist/crypto/CryptoOps.js +150 -150
  51. package/dist/crypto/CryptoOps.js.map +1 -1
  52. package/dist/crypto/GuidGenerator.d.ts +12 -12
  53. package/dist/crypto/GuidGenerator.js +96 -96
  54. package/dist/crypto/ISubtleCrypto.d.ts +9 -9
  55. package/dist/crypto/ModernBrowserCrypto.d.ts +9 -9
  56. package/dist/crypto/ModernBrowserCrypto.js +24 -24
  57. package/dist/crypto/PkceGenerator.d.ts +24 -24
  58. package/dist/crypto/PkceGenerator.js +58 -58
  59. package/dist/crypto/SignedHttpRequest.d.ts +30 -30
  60. package/dist/crypto/SignedHttpRequest.js +39 -39
  61. package/dist/encode/Base64Decode.d.ts +22 -22
  62. package/dist/encode/Base64Decode.js +73 -73
  63. package/dist/encode/Base64Encode.d.ts +31 -31
  64. package/dist/encode/Base64Encode.js +79 -79
  65. package/dist/error/BrowserAuthError.d.ts +382 -382
  66. package/dist/error/BrowserAuthError.js +483 -483
  67. package/dist/error/BrowserConfigurationAuthError.d.ts +70 -70
  68. package/dist/error/BrowserConfigurationAuthError.js +96 -96
  69. package/dist/error/NativeAuthError.d.ts +57 -56
  70. package/dist/error/NativeAuthError.d.ts.map +1 -1
  71. package/dist/error/NativeAuthError.js +93 -88
  72. package/dist/error/NativeAuthError.js.map +1 -1
  73. package/dist/event/EventHandler.d.ts +41 -41
  74. package/dist/event/EventHandler.js +119 -119
  75. package/dist/event/EventMessage.d.ts +25 -25
  76. package/dist/event/EventMessage.d.ts.map +1 -1
  77. package/dist/event/EventMessage.js +68 -67
  78. package/dist/event/EventMessage.js.map +1 -1
  79. package/dist/event/EventType.d.ts +28 -26
  80. package/dist/event/EventType.d.ts.map +1 -1
  81. package/dist/event/EventType.js +32 -32
  82. package/dist/event/EventType.js.map +1 -1
  83. package/dist/index.d.ts +35 -35
  84. package/dist/index.js +1 -1
  85. package/dist/interaction_client/BaseInteractionClient.d.ts +53 -52
  86. package/dist/interaction_client/BaseInteractionClient.d.ts.map +1 -1
  87. package/dist/interaction_client/BaseInteractionClient.js +151 -138
  88. package/dist/interaction_client/BaseInteractionClient.js.map +1 -1
  89. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.d.ts +4 -4
  90. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.js +10 -10
  91. package/dist/interaction_client/NativeInteractionClient.d.ts +148 -148
  92. package/dist/interaction_client/NativeInteractionClient.d.ts.map +1 -1
  93. package/dist/interaction_client/NativeInteractionClient.js +521 -517
  94. package/dist/interaction_client/NativeInteractionClient.js.map +1 -1
  95. package/dist/interaction_client/PopupClient.d.ts +111 -111
  96. package/dist/interaction_client/PopupClient.js +476 -476
  97. package/dist/interaction_client/RedirectClient.d.ts +48 -48
  98. package/dist/interaction_client/RedirectClient.d.ts.map +1 -1
  99. package/dist/interaction_client/RedirectClient.js +291 -290
  100. package/dist/interaction_client/RedirectClient.js.map +1 -1
  101. package/dist/interaction_client/SilentAuthCodeClient.d.ts +22 -22
  102. package/dist/interaction_client/SilentAuthCodeClient.js +62 -62
  103. package/dist/interaction_client/SilentCacheClient.d.ts +21 -21
  104. package/dist/interaction_client/SilentCacheClient.js +67 -67
  105. package/dist/interaction_client/SilentCacheClient.js.map +1 -1
  106. package/dist/interaction_client/SilentIframeClient.d.ts +31 -31
  107. package/dist/interaction_client/SilentIframeClient.js +127 -127
  108. package/dist/interaction_client/SilentRefreshClient.d.ts +19 -19
  109. package/dist/interaction_client/SilentRefreshClient.js +62 -62
  110. package/dist/interaction_client/SilentRefreshClient.js.map +1 -1
  111. package/dist/interaction_client/StandardInteractionClient.d.ts +59 -59
  112. package/dist/interaction_client/StandardInteractionClient.js +259 -259
  113. package/dist/interaction_handler/InteractionHandler.d.ts +39 -39
  114. package/dist/interaction_handler/InteractionHandler.js +127 -127
  115. package/dist/interaction_handler/RedirectHandler.d.ts +24 -24
  116. package/dist/interaction_handler/RedirectHandler.js +118 -118
  117. package/dist/interaction_handler/SilentHandler.d.ts +47 -47
  118. package/dist/interaction_handler/SilentHandler.js +162 -162
  119. package/dist/internals.d.ts +23 -23
  120. package/dist/internals.js +4 -4
  121. package/dist/navigation/INavigationClient.d.ts +16 -16
  122. package/dist/navigation/NavigationClient.d.ts +22 -22
  123. package/dist/navigation/NavigationClient.js +40 -40
  124. package/dist/navigation/NavigationOptions.d.ts +12 -12
  125. package/dist/network/FetchClient.d.ts +26 -26
  126. package/dist/network/FetchClient.js +99 -99
  127. package/dist/network/XhrClient.d.ts +40 -40
  128. package/dist/network/XhrClient.js +117 -117
  129. package/dist/operatingcontext/BaseOperatingContext.d.ts +40 -40
  130. package/dist/operatingcontext/BaseOperatingContext.js +44 -44
  131. package/dist/operatingcontext/StandardOperatingContext.d.ts +25 -25
  132. package/dist/operatingcontext/StandardOperatingContext.js +43 -43
  133. package/dist/operatingcontext/TeamsAppOperatingContext.d.ts +25 -25
  134. package/dist/operatingcontext/TeamsAppOperatingContext.js +42 -42
  135. package/dist/packageMetadata.d.ts +2 -2
  136. package/dist/packageMetadata.d.ts.map +1 -1
  137. package/dist/packageMetadata.js +4 -4
  138. package/dist/request/AuthorizationCodeRequest.d.ts +8 -8
  139. package/dist/request/AuthorizationUrlRequest.d.ts +8 -8
  140. package/dist/request/EndSessionPopupRequest.d.ts +18 -18
  141. package/dist/request/EndSessionRequest.d.ts +15 -15
  142. package/dist/request/PopupRequest.d.ts +32 -32
  143. package/dist/request/PopupWindowAttributes.d.ts +15 -15
  144. package/dist/request/RedirectRequest.d.ts +33 -33
  145. package/dist/request/SilentRequest.d.ts +30 -30
  146. package/dist/request/SsoSilentRequest.d.ts +26 -26
  147. package/dist/telemetry/BrowserPerformanceClient.d.ts +37 -38
  148. package/dist/telemetry/BrowserPerformanceClient.d.ts.map +1 -1
  149. package/dist/telemetry/BrowserPerformanceClient.js +124 -124
  150. package/dist/telemetry/BrowserPerformanceClient.js.map +1 -1
  151. package/dist/telemetry/BrowserPerformanceMeasurement.d.ts +21 -21
  152. package/dist/telemetry/BrowserPerformanceMeasurement.js +92 -92
  153. package/dist/utils/BrowserConstants.d.ts +176 -166
  154. package/dist/utils/BrowserConstants.d.ts.map +1 -1
  155. package/dist/utils/BrowserConstants.js +205 -215
  156. package/dist/utils/BrowserConstants.js.map +1 -1
  157. package/dist/utils/BrowserProtocolUtils.d.ts +18 -18
  158. package/dist/utils/BrowserProtocolUtils.js +34 -34
  159. package/dist/utils/BrowserStringUtils.d.ts +26 -26
  160. package/dist/utils/BrowserStringUtils.js +149 -149
  161. package/dist/utils/BrowserUtils.d.ts +65 -65
  162. package/dist/utils/BrowserUtils.js +138 -138
  163. package/dist/utils/MathUtils.d.ts +11 -11
  164. package/dist/utils/MathUtils.js +21 -21
  165. package/lib/msal-browser.cjs.js +18227 -0
  166. package/lib/msal-browser.cjs.js.map +1 -0
  167. package/lib/msal-browser.js +18233 -0
  168. package/lib/msal-browser.js.map +1 -0
  169. package/lib/msal-browser.min.js +63 -0
  170. package/package.json +101 -95
  171. package/dist/crypto/MsBrowserCrypto.d.ts +0 -10
  172. package/dist/crypto/MsBrowserCrypto.d.ts.map +0 -1
  173. package/dist/crypto/MsBrowserCrypto.js +0 -88
  174. package/dist/crypto/MsBrowserCrypto.js.map +0 -1
  175. package/dist/crypto/MsrBrowserCrypto.d.ts +0 -18
  176. package/dist/crypto/MsrBrowserCrypto.d.ts.map +0 -1
  177. package/dist/crypto/MsrBrowserCrypto.js +0 -35
  178. 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-alpha.1 2023-05-08 */
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 };
@@ -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-alpha.1 2023-05-08 */
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