@azure/msal-browser 3.5.1-beta.1 → 3.6.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 (258) hide show
  1. package/dist/app/IPublicClientApplication.d.ts +51 -51
  2. package/dist/app/IPublicClientApplication.mjs +102 -102
  3. package/dist/app/IPublicClientApplication.mjs.map +1 -1
  4. package/dist/app/PublicClientApplication.d.ts +269 -268
  5. package/dist/app/PublicClientApplication.d.ts.map +1 -1
  6. package/dist/app/PublicClientApplication.mjs +333 -333
  7. package/dist/app/PublicClientApplication.mjs.map +1 -1
  8. package/dist/app/PublicClientNext.d.ts +273 -273
  9. package/dist/app/PublicClientNext.mjs +351 -351
  10. package/dist/app/PublicClientNext.mjs.map +1 -1
  11. package/dist/broker/nativeBroker/NativeMessageHandler.d.ts +62 -62
  12. package/dist/broker/nativeBroker/NativeMessageHandler.mjs +254 -254
  13. package/dist/broker/nativeBroker/NativeMessageHandler.mjs.map +1 -1
  14. package/dist/broker/nativeBroker/NativeRequest.d.ts +44 -44
  15. package/dist/broker/nativeBroker/NativeResponse.d.ts +48 -48
  16. package/dist/broker/nativeBroker/NativeStatusCodes.d.ts +7 -7
  17. package/dist/broker/nativeBroker/NativeStatusCodes.mjs +11 -11
  18. package/dist/broker/nativeBroker/NativeStatusCodes.mjs.map +1 -1
  19. package/dist/cache/AsyncMemoryStorage.d.ts +51 -51
  20. package/dist/cache/AsyncMemoryStorage.mjs +132 -132
  21. package/dist/cache/AsyncMemoryStorage.mjs.map +1 -1
  22. package/dist/cache/BrowserCacheManager.d.ts +395 -383
  23. package/dist/cache/BrowserCacheManager.d.ts.map +1 -1
  24. package/dist/cache/BrowserCacheManager.mjs +1282 -1262
  25. package/dist/cache/BrowserCacheManager.mjs.map +1 -1
  26. package/dist/cache/BrowserStorage.d.ts +11 -11
  27. package/dist/cache/BrowserStorage.mjs +32 -32
  28. package/dist/cache/BrowserStorage.mjs.map +1 -1
  29. package/dist/cache/CryptoKeyStore.d.ts +18 -18
  30. package/dist/cache/CryptoKeyStore.mjs +40 -40
  31. package/dist/cache/CryptoKeyStore.mjs.map +1 -1
  32. package/dist/cache/DatabaseStorage.d.ts +56 -56
  33. package/dist/cache/DatabaseStorage.mjs +190 -190
  34. package/dist/cache/DatabaseStorage.mjs.map +1 -1
  35. package/dist/cache/IAsyncMemoryStorage.d.ts +27 -27
  36. package/dist/cache/ITokenCache.d.ts +11 -11
  37. package/dist/cache/IWindowStorage.d.ts +27 -27
  38. package/dist/cache/MemoryStorage.d.ts +11 -11
  39. package/dist/cache/MemoryStorage.mjs +31 -31
  40. package/dist/cache/MemoryStorage.mjs.map +1 -1
  41. package/dist/cache/TokenCache.d.ts +77 -77
  42. package/dist/cache/TokenCache.d.ts.map +1 -1
  43. package/dist/cache/TokenCache.mjs +221 -225
  44. package/dist/cache/TokenCache.mjs.map +1 -1
  45. package/dist/config/Configuration.d.ts +206 -206
  46. package/dist/config/Configuration.d.ts.map +1 -1
  47. package/dist/config/Configuration.mjs +128 -128
  48. package/dist/config/Configuration.mjs.map +1 -1
  49. package/dist/controllers/ControllerFactory.d.ts +4 -4
  50. package/dist/controllers/ControllerFactory.d.ts.map +1 -1
  51. package/dist/controllers/ControllerFactory.mjs +29 -29
  52. package/dist/controllers/ControllerFactory.mjs.map +1 -1
  53. package/dist/controllers/IController.d.ts +61 -61
  54. package/dist/controllers/NestedAppAuthController.d.ts +95 -95
  55. package/dist/controllers/NestedAppAuthController.mjs +334 -334
  56. package/dist/controllers/NestedAppAuthController.mjs.map +1 -1
  57. package/dist/controllers/StandardController.d.ts +407 -407
  58. package/dist/controllers/StandardController.d.ts.map +1 -1
  59. package/dist/controllers/StandardController.mjs +1291 -1293
  60. package/dist/controllers/StandardController.mjs.map +1 -1
  61. package/dist/controllers/UnknownOperatingContextController.d.ts +87 -87
  62. package/dist/controllers/UnknownOperatingContextController.mjs +264 -264
  63. package/dist/controllers/UnknownOperatingContextController.mjs.map +1 -1
  64. package/dist/crypto/BrowserCrypto.d.ts +44 -44
  65. package/dist/crypto/BrowserCrypto.mjs +93 -93
  66. package/dist/crypto/BrowserCrypto.mjs.map +1 -1
  67. package/dist/crypto/CryptoOps.d.ts +63 -63
  68. package/dist/crypto/CryptoOps.mjs +145 -145
  69. package/dist/crypto/CryptoOps.mjs.map +1 -1
  70. package/dist/crypto/PkceGenerator.d.ts +8 -8
  71. package/dist/crypto/PkceGenerator.mjs +54 -54
  72. package/dist/crypto/PkceGenerator.mjs.map +1 -1
  73. package/dist/crypto/SignedHttpRequest.d.ts +30 -30
  74. package/dist/crypto/SignedHttpRequest.mjs +39 -39
  75. package/dist/crypto/SignedHttpRequest.mjs.map +1 -1
  76. package/dist/encode/Base64Decode.d.ts +9 -9
  77. package/dist/encode/Base64Decode.mjs +36 -36
  78. package/dist/encode/Base64Decode.mjs.map +1 -1
  79. package/dist/encode/Base64Encode.d.ts +19 -19
  80. package/dist/encode/Base64Encode.mjs +43 -43
  81. package/dist/encode/Base64Encode.mjs.map +1 -1
  82. package/dist/error/BrowserAuthError.d.ts +250 -250
  83. package/dist/error/BrowserAuthError.mjs +258 -258
  84. package/dist/error/BrowserAuthError.mjs.map +1 -1
  85. package/dist/error/BrowserAuthErrorCodes.d.ts +45 -45
  86. package/dist/error/BrowserAuthErrorCodes.mjs +49 -49
  87. package/dist/error/BrowserAuthErrorCodes.mjs.map +1 -1
  88. package/dist/error/BrowserConfigurationAuthError.d.ts +33 -33
  89. package/dist/error/BrowserConfigurationAuthError.mjs +40 -40
  90. package/dist/error/BrowserConfigurationAuthError.mjs.map +1 -1
  91. package/dist/error/BrowserConfigurationAuthErrorCodes.d.ts +3 -3
  92. package/dist/error/BrowserConfigurationAuthErrorCodes.mjs +7 -7
  93. package/dist/error/BrowserConfigurationAuthErrorCodes.mjs.map +1 -1
  94. package/dist/error/NativeAuthError.d.ts +29 -29
  95. package/dist/error/NativeAuthError.mjs +60 -60
  96. package/dist/error/NativeAuthError.mjs.map +1 -1
  97. package/dist/error/NativeAuthErrorCodes.d.ts +2 -2
  98. package/dist/error/NativeAuthErrorCodes.mjs +6 -6
  99. package/dist/error/NativeAuthErrorCodes.mjs.map +1 -1
  100. package/dist/error/NestedAppAuthError.d.ts +14 -14
  101. package/dist/error/NestedAppAuthError.mjs +23 -23
  102. package/dist/error/NestedAppAuthError.mjs.map +1 -1
  103. package/dist/event/EventHandler.d.ts +41 -41
  104. package/dist/event/EventHandler.mjs +119 -119
  105. package/dist/event/EventHandler.mjs.map +1 -1
  106. package/dist/event/EventMessage.d.ts +25 -25
  107. package/dist/event/EventMessage.mjs +68 -68
  108. package/dist/event/EventMessage.mjs.map +1 -1
  109. package/dist/event/EventType.d.ts +28 -28
  110. package/dist/event/EventType.mjs +31 -31
  111. package/dist/event/EventType.mjs.map +1 -1
  112. package/dist/index.d.ts +39 -39
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.mjs +1 -1
  115. package/dist/interaction_client/BaseInteractionClient.d.ts +54 -54
  116. package/dist/interaction_client/BaseInteractionClient.mjs +152 -152
  117. package/dist/interaction_client/BaseInteractionClient.mjs.map +1 -1
  118. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.d.ts +4 -4
  119. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.mjs +10 -10
  120. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.mjs.map +1 -1
  121. package/dist/interaction_client/NativeInteractionClient.d.ts +140 -140
  122. package/dist/interaction_client/NativeInteractionClient.d.ts.map +1 -1
  123. package/dist/interaction_client/NativeInteractionClient.mjs +539 -549
  124. package/dist/interaction_client/NativeInteractionClient.mjs.map +1 -1
  125. package/dist/interaction_client/PopupClient.d.ts +105 -105
  126. package/dist/interaction_client/PopupClient.mjs +432 -432
  127. package/dist/interaction_client/PopupClient.mjs.map +1 -1
  128. package/dist/interaction_client/RedirectClient.d.ts +49 -49
  129. package/dist/interaction_client/RedirectClient.mjs +311 -311
  130. package/dist/interaction_client/RedirectClient.mjs.map +1 -1
  131. package/dist/interaction_client/SilentAuthCodeClient.d.ts +23 -23
  132. package/dist/interaction_client/SilentAuthCodeClient.mjs +57 -57
  133. package/dist/interaction_client/SilentAuthCodeClient.mjs.map +1 -1
  134. package/dist/interaction_client/SilentCacheClient.d.ts +24 -24
  135. package/dist/interaction_client/SilentCacheClient.mjs +61 -61
  136. package/dist/interaction_client/SilentCacheClient.mjs.map +1 -1
  137. package/dist/interaction_client/SilentIframeClient.d.ts +32 -32
  138. package/dist/interaction_client/SilentIframeClient.mjs +96 -96
  139. package/dist/interaction_client/SilentIframeClient.mjs.map +1 -1
  140. package/dist/interaction_client/SilentRefreshClient.d.ts +20 -20
  141. package/dist/interaction_client/SilentRefreshClient.mjs +43 -43
  142. package/dist/interaction_client/SilentRefreshClient.mjs.map +1 -1
  143. package/dist/interaction_client/StandardInteractionClient.d.ts +54 -54
  144. package/dist/interaction_client/StandardInteractionClient.mjs +222 -222
  145. package/dist/interaction_client/StandardInteractionClient.mjs.map +1 -1
  146. package/dist/interaction_handler/InteractionHandler.d.ts +33 -33
  147. package/dist/interaction_handler/InteractionHandler.mjs +93 -93
  148. package/dist/interaction_handler/InteractionHandler.mjs.map +1 -1
  149. package/dist/interaction_handler/RedirectHandler.d.ts +32 -32
  150. package/dist/interaction_handler/RedirectHandler.mjs +134 -134
  151. package/dist/interaction_handler/RedirectHandler.mjs.map +1 -1
  152. package/dist/interaction_handler/SilentHandler.d.ts +13 -13
  153. package/dist/interaction_handler/SilentHandler.mjs +133 -133
  154. package/dist/interaction_handler/SilentHandler.mjs.map +1 -1
  155. package/dist/naa/AccountInfo.d.ts +11 -11
  156. package/dist/naa/AccountRequests.d.ts +9 -9
  157. package/dist/naa/AuthBridge.d.ts +8 -5
  158. package/dist/naa/AuthBridge.d.ts.map +1 -1
  159. package/dist/naa/BridgeCapabilities.d.ts +3 -3
  160. package/dist/naa/BridgeError.d.ts +9 -9
  161. package/dist/naa/BridgeError.mjs +7 -7
  162. package/dist/naa/BridgeError.mjs.map +1 -1
  163. package/dist/naa/BridgeProxy.d.ts +72 -72
  164. package/dist/naa/BridgeProxy.d.ts.map +1 -1
  165. package/dist/naa/BridgeProxy.mjs +153 -152
  166. package/dist/naa/BridgeProxy.mjs.map +1 -1
  167. package/dist/naa/BridgeRequest.d.ts +6 -6
  168. package/dist/naa/BridgeRequestEnvelope.d.ts +13 -13
  169. package/dist/naa/BridgeResponseEnvelope.d.ts +10 -10
  170. package/dist/naa/BridgeStatusCode.d.ts +10 -10
  171. package/dist/naa/BridgeStatusCode.mjs +15 -15
  172. package/dist/naa/BridgeStatusCode.mjs.map +1 -1
  173. package/dist/naa/IBridgeProxy.d.ts +12 -12
  174. package/dist/naa/InitializeBridgeResponse.d.ts +6 -6
  175. package/dist/naa/TokenRequest.d.ts +19 -19
  176. package/dist/naa/TokenResponse.d.ts +15 -15
  177. package/dist/naa/mapping/NestedAppAuthAdapter.d.ts +23 -23
  178. package/dist/naa/mapping/NestedAppAuthAdapter.mjs +141 -141
  179. package/dist/naa/mapping/NestedAppAuthAdapter.mjs.map +1 -1
  180. package/dist/navigation/INavigationClient.d.ts +16 -16
  181. package/dist/navigation/NavigationClient.d.ts +22 -22
  182. package/dist/navigation/NavigationClient.mjs +40 -40
  183. package/dist/navigation/NavigationClient.mjs.map +1 -1
  184. package/dist/navigation/NavigationOptions.d.ts +12 -12
  185. package/dist/network/FetchClient.d.ts +26 -26
  186. package/dist/network/FetchClient.mjs +99 -99
  187. package/dist/network/FetchClient.mjs.map +1 -1
  188. package/dist/operatingcontext/BaseOperatingContext.d.ts +40 -40
  189. package/dist/operatingcontext/BaseOperatingContext.mjs +44 -44
  190. package/dist/operatingcontext/BaseOperatingContext.mjs.map +1 -1
  191. package/dist/operatingcontext/StandardOperatingContext.d.ts +25 -25
  192. package/dist/operatingcontext/StandardOperatingContext.mjs +43 -43
  193. package/dist/operatingcontext/StandardOperatingContext.mjs.map +1 -1
  194. package/dist/operatingcontext/TeamsAppOperatingContext.d.ts +32 -32
  195. package/dist/operatingcontext/TeamsAppOperatingContext.mjs +85 -85
  196. package/dist/operatingcontext/TeamsAppOperatingContext.mjs.map +1 -1
  197. package/dist/operatingcontext/UnknownOperatingContext.d.ts +25 -25
  198. package/dist/operatingcontext/UnknownOperatingContext.mjs +42 -42
  199. package/dist/operatingcontext/UnknownOperatingContext.mjs.map +1 -1
  200. package/dist/packageMetadata.d.ts +2 -2
  201. package/dist/packageMetadata.d.ts.map +1 -1
  202. package/dist/packageMetadata.mjs +4 -4
  203. package/dist/packageMetadata.mjs.map +1 -1
  204. package/dist/request/AuthorizationCodeRequest.d.ts +8 -8
  205. package/dist/request/AuthorizationUrlRequest.d.ts +8 -8
  206. package/dist/request/ClearCacheRequest.d.ts +10 -10
  207. package/dist/request/EndSessionPopupRequest.d.ts +18 -18
  208. package/dist/request/EndSessionRequest.d.ts +15 -15
  209. package/dist/request/PopupRequest.d.ts +34 -34
  210. package/dist/request/PopupWindowAttributes.d.ts +15 -15
  211. package/dist/request/RedirectRequest.d.ts +35 -35
  212. package/dist/request/SilentRequest.d.ts +32 -32
  213. package/dist/request/SsoSilentRequest.d.ts +29 -29
  214. package/dist/response/AuthenticationResult.d.ts +4 -4
  215. package/dist/response/ResponseHandler.d.ts +7 -7
  216. package/dist/response/ResponseHandler.mjs +36 -36
  217. package/dist/response/ResponseHandler.mjs.map +1 -1
  218. package/dist/telemetry/BrowserPerformanceClient.d.ts +36 -36
  219. package/dist/telemetry/BrowserPerformanceClient.mjs +125 -125
  220. package/dist/telemetry/BrowserPerformanceClient.mjs.map +1 -1
  221. package/dist/telemetry/BrowserPerformanceMeasurement.d.ts +21 -21
  222. package/dist/telemetry/BrowserPerformanceMeasurement.mjs +92 -92
  223. package/dist/telemetry/BrowserPerformanceMeasurement.mjs.map +1 -1
  224. package/dist/utils/BrowserConstants.d.ts +176 -176
  225. package/dist/utils/BrowserConstants.mjs +204 -204
  226. package/dist/utils/BrowserConstants.mjs.map +1 -1
  227. package/dist/utils/BrowserProtocolUtils.d.ts +11 -11
  228. package/dist/utils/BrowserProtocolUtils.mjs +21 -21
  229. package/dist/utils/BrowserProtocolUtils.mjs.map +1 -1
  230. package/dist/utils/BrowserUtils.d.ts +56 -56
  231. package/dist/utils/BrowserUtils.mjs +125 -125
  232. package/dist/utils/BrowserUtils.mjs.map +1 -1
  233. package/lib/msal-browser.cjs +18217 -17928
  234. package/lib/msal-browser.cjs.map +1 -1
  235. package/lib/msal-browser.js +18217 -17928
  236. package/lib/msal-browser.js.map +1 -1
  237. package/lib/msal-browser.min.js +71 -68
  238. package/package.json +103 -102
  239. package/src/app/PublicClientApplication.ts +2 -1
  240. package/src/cache/BrowserCacheManager.ts +31 -4
  241. package/src/cache/DatabaseStorage.ts +1 -1
  242. package/src/cache/TokenCache.ts +33 -29
  243. package/src/config/Configuration.ts +1 -1
  244. package/src/controllers/ControllerFactory.ts +3 -5
  245. package/src/controllers/StandardController.ts +4 -6
  246. package/src/crypto/CryptoOps.ts +1 -1
  247. package/src/crypto/SignedHttpRequest.ts +1 -1
  248. package/src/index.ts +1 -0
  249. package/src/interaction_client/BaseInteractionClient.ts +2 -2
  250. package/src/interaction_client/NativeInteractionClient.ts +23 -20
  251. package/src/interaction_client/PopupClient.ts +1 -1
  252. package/src/interaction_client/RedirectClient.ts +3 -3
  253. package/src/interaction_client/SilentAuthCodeClient.ts +1 -1
  254. package/src/interaction_client/StandardInteractionClient.ts +1 -1
  255. package/src/interaction_handler/SilentHandler.ts +2 -2
  256. package/src/naa/AuthBridge.ts +3 -2
  257. package/src/naa/BridgeProxy.ts +6 -4
  258. package/src/packageMetadata.ts +1 -1
@@ -1,4 +1,4 @@
1
- /*! @azure/msal-browser v3.5.1-beta.1 2023-11-14 */
1
+ /*! @azure/msal-browser v3.6.0 2023-12-01 */
2
2
  'use strict';
3
3
  import { invokeAsync, PerformanceEvents, AuthError, Constants, UrlString, UrlUtils, ProtocolUtils, ThrottlingUtils, ProtocolMode, ServerResponseType } from '@azure/msal-common';
4
4
  import { StandardInteractionClient } from './StandardInteractionClient.mjs';
@@ -12,316 +12,316 @@ import { NativeMessageHandler } from '../broker/nativeBroker/NativeMessageHandle
12
12
  import { validateInteractionType } from '../response/ResponseHandler.mjs';
13
13
  import { noStateInHash, nativeConnectionNotEstablished, noCachedAuthorityError } from '../error/BrowserAuthErrorCodes.mjs';
14
14
 
15
- /*
16
- * Copyright (c) Microsoft Corporation. All rights reserved.
17
- * Licensed under the MIT License.
18
- */
19
- class RedirectClient extends StandardInteractionClient {
20
- constructor(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeStorageImpl, nativeMessageHandler, correlationId) {
21
- super(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId);
22
- this.nativeStorage = nativeStorageImpl;
23
- }
24
- /**
25
- * Redirects the page to the /authorize endpoint of the IDP
26
- * @param request
27
- */
28
- async acquireToken(request) {
29
- const validRequest = await invokeAsync(this.initializeAuthorizationRequest.bind(this), PerformanceEvents.StandardInteractionClientInitializeAuthorizationRequest, this.logger, this.performanceClient, this.correlationId)(request, InteractionType.Redirect);
30
- this.browserStorage.updateCacheEntries(validRequest.state, validRequest.nonce, validRequest.authority, validRequest.loginHint || "", validRequest.account || null);
31
- const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenRedirect);
32
- const handleBackButton = (event) => {
33
- // Clear temporary cache if the back button is clicked during the redirect flow.
34
- if (event.persisted) {
35
- this.logger.verbose("Page was restored from back/forward cache. Clearing temporary cache.");
36
- this.browserStorage.cleanRequestByState(validRequest.state);
37
- this.eventHandler.emitEvent(EventType.RESTORE_FROM_BFCACHE, InteractionType.Redirect);
38
- }
39
- };
40
- try {
41
- // Create auth code request and generate PKCE params
42
- const authCodeRequest = await invokeAsync(this.initializeAuthorizationCodeRequest.bind(this), PerformanceEvents.StandardInteractionClientInitializeAuthorizationCodeRequest, this.logger, this.performanceClient, this.correlationId)(validRequest);
43
- // Initialize the client
44
- const authClient = await invokeAsync(this.createAuthCodeClient.bind(this), PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, this.logger, this.performanceClient, this.correlationId)(serverTelemetryManager, validRequest.authority, validRequest.azureCloudOptions);
45
- // Create redirect interaction handler.
46
- const interactionHandler = new RedirectHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.performanceClient);
47
- // Create acquire token url.
48
- const navigateUrl = await authClient.getAuthCodeUrl({
49
- ...validRequest,
50
- nativeBroker: NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeMessageHandler, request.authenticationScheme),
51
- });
52
- const redirectStartPage = this.getRedirectStartPage(request.redirectStartPage);
53
- this.logger.verbosePii(`Redirect start page: ${redirectStartPage}`);
54
- // Clear temporary cache if the back button is clicked during the redirect flow.
55
- window.addEventListener("pageshow", handleBackButton);
56
- // 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
- return await interactionHandler.initiateAuthRequest(navigateUrl, {
58
- navigationClient: this.navigationClient,
59
- redirectTimeout: this.config.system.redirectNavigationTimeout,
60
- redirectStartPage: redirectStartPage,
61
- onRedirectNavigate: request.onRedirectNavigate,
62
- });
63
- }
64
- catch (e) {
65
- if (e instanceof AuthError) {
66
- e.setCorrelationId(this.correlationId);
67
- serverTelemetryManager.cacheFailedRequest(e);
68
- }
69
- window.removeEventListener("pageshow", handleBackButton);
70
- this.browserStorage.cleanRequestByState(validRequest.state);
71
- throw e;
72
- }
73
- }
74
- /**
75
- * Checks if navigateToLoginRequestUrl is set, and:
76
- * - if true, performs logic to cache and navigate
77
- * - if false, handles hash string and parses response
78
- * @param hash
79
- */
80
- async handleRedirectPromise(hash) {
81
- const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.handleRedirectPromise);
82
- try {
83
- if (!this.browserStorage.isInteractionInProgress(true)) {
84
- this.logger.info("handleRedirectPromise called but there is no interaction in progress, returning null.");
85
- return null;
86
- }
87
- const [serverParams, responseString] = this.getRedirectResponse(hash || "");
88
- if (!serverParams) {
89
- // Not a recognized server response hash or hash not associated with a redirect request
90
- this.logger.info("handleRedirectPromise did not detect a response as a result of a redirect. Cleaning temporary cache.");
91
- this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);
92
- return null;
93
- }
94
- // If navigateToLoginRequestUrl is true, get the url where the redirect request was initiated
95
- const loginRequestUrl = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, true) || Constants.EMPTY_STRING;
96
- const loginRequestUrlNormalized = UrlString.removeHashFromUrl(loginRequestUrl);
97
- const currentUrlNormalized = UrlString.removeHashFromUrl(window.location.href);
98
- if (loginRequestUrlNormalized === currentUrlNormalized &&
99
- this.config.auth.navigateToLoginRequestUrl) {
100
- // We are on the page we need to navigate to - handle hash
101
- this.logger.verbose("Current page is loginRequestUrl, handling response");
102
- if (loginRequestUrl.indexOf("#") > -1) {
103
- // Replace current hash with non-msal hash, if present
104
- replaceHash(loginRequestUrl);
105
- }
106
- const handleHashResult = await this.handleResponse(serverParams, serverTelemetryManager);
107
- return handleHashResult;
108
- }
109
- else if (!this.config.auth.navigateToLoginRequestUrl) {
110
- this.logger.verbose("NavigateToLoginRequestUrl set to false, handling response");
111
- return this.handleResponse(serverParams, serverTelemetryManager);
112
- }
113
- else if (!isInIframe() ||
114
- this.config.system.allowRedirectInIframe) {
115
- /*
116
- * Returned from authority using redirect - need to perform navigation before processing response
117
- * Cache the hash to be retrieved after the next redirect
118
- */
119
- this.browserStorage.setTemporaryCache(TemporaryCacheKeys.URL_HASH, responseString, true);
120
- const navigationOptions = {
121
- apiId: ApiId.handleRedirectPromise,
122
- timeout: this.config.system.redirectNavigationTimeout,
123
- noHistory: true,
124
- };
125
- /**
126
- * Default behavior is to redirect to the start page and not process the hash now.
127
- * The start page is expected to also call handleRedirectPromise which will process the hash in one of the checks above.
128
- */
129
- let processHashOnRedirect = true;
130
- if (!loginRequestUrl || loginRequestUrl === "null") {
131
- // Redirect to home page if login request url is null (real null or the string null)
132
- const homepage = getHomepage();
133
- // Cache the homepage under ORIGIN_URI to ensure cached hash is processed on homepage
134
- this.browserStorage.setTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, homepage, true);
135
- this.logger.warning("Unable to get valid login request url from cache, redirecting to home page");
136
- processHashOnRedirect =
137
- await this.navigationClient.navigateInternal(homepage, navigationOptions);
138
- }
139
- else {
140
- // Navigate to page that initiated the redirect request
141
- this.logger.verbose(`Navigating to loginRequestUrl: ${loginRequestUrl}`);
142
- processHashOnRedirect =
143
- await this.navigationClient.navigateInternal(loginRequestUrl, navigationOptions);
144
- }
145
- // If navigateInternal implementation returns false, handle the hash now
146
- if (!processHashOnRedirect) {
147
- return this.handleResponse(serverParams, serverTelemetryManager);
148
- }
149
- }
150
- return null;
151
- }
152
- catch (e) {
153
- if (e instanceof AuthError) {
154
- e.setCorrelationId(this.correlationId);
155
- serverTelemetryManager.cacheFailedRequest(e);
156
- }
157
- this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);
158
- throw e;
159
- }
160
- }
161
- /**
162
- * Gets the response hash for a redirect request
163
- * Returns null if interactionType in the state value is not "redirect" or the hash does not contain known properties
164
- * @param hash
165
- */
166
- getRedirectResponse(userProvidedResponse) {
167
- this.logger.verbose("getRedirectResponseHash called");
168
- // Get current location hash from window or cache.
169
- let responseString = userProvidedResponse;
170
- if (!responseString) {
171
- if (this.config.auth.OIDCOptions.serverResponseType ===
172
- ServerResponseType.QUERY) {
173
- responseString = window.location.search;
174
- }
175
- else {
176
- responseString = window.location.hash;
177
- }
178
- }
179
- let response = UrlUtils.getDeserializedResponse(responseString);
180
- if (response) {
181
- try {
182
- validateInteractionType(response, this.browserCrypto, InteractionType.Redirect);
183
- }
184
- catch (e) {
185
- if (e instanceof AuthError) {
186
- this.logger.error(`Interaction type validation failed due to ${e.errorCode}: ${e.errorMessage}`);
187
- }
188
- return [null, ""];
189
- }
190
- clearHash(window);
191
- this.logger.verbose("Hash contains known properties, returning response hash");
192
- return [response, responseString];
193
- }
194
- const cachedHash = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.URL_HASH, true);
195
- this.browserStorage.removeItem(this.browserStorage.generateCacheKey(TemporaryCacheKeys.URL_HASH));
196
- if (cachedHash) {
197
- response = UrlUtils.getDeserializedResponse(cachedHash);
198
- if (response) {
199
- this.logger.verbose("Hash does not contain known properties, returning cached hash");
200
- return [response, cachedHash];
201
- }
202
- }
203
- return [null, ""];
204
- }
205
- /**
206
- * Checks if hash exists and handles in window.
207
- * @param hash
208
- * @param state
209
- */
210
- async handleResponse(serverParams, serverTelemetryManager) {
211
- const state = serverParams.state;
212
- if (!state) {
213
- throw createBrowserAuthError(noStateInHash);
214
- }
215
- const cachedRequest = this.browserStorage.getCachedRequest(state);
216
- this.logger.verbose("handleResponse called, retrieved cached request");
217
- if (serverParams.accountId) {
218
- this.logger.verbose("Account id found in hash, calling WAM for token");
219
- if (!this.nativeMessageHandler) {
220
- throw createBrowserAuthError(nativeConnectionNotEstablished);
221
- }
222
- const nativeInteractionClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.acquireTokenPopup, this.performanceClient, this.nativeMessageHandler, serverParams.accountId, this.nativeStorage, cachedRequest.correlationId);
223
- const { userRequestState } = ProtocolUtils.parseRequestState(this.browserCrypto, state);
224
- return nativeInteractionClient
225
- .acquireToken({
226
- ...cachedRequest,
227
- state: userRequestState,
228
- prompt: undefined, // Server should handle the prompt, ideally native broker can do this part silently
229
- })
230
- .finally(() => {
231
- this.browserStorage.cleanRequestByState(state);
232
- });
233
- }
234
- // Hash contains known properties - handle and return in callback
235
- const currentAuthority = this.browserStorage.getCachedAuthority(state);
236
- if (!currentAuthority) {
237
- throw createBrowserAuthError(noCachedAuthorityError);
238
- }
239
- const authClient = await invokeAsync(this.createAuthCodeClient.bind(this), PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, this.logger, this.performanceClient, this.correlationId)(serverTelemetryManager, currentAuthority);
240
- ThrottlingUtils.removeThrottle(this.browserStorage, this.config.auth.clientId, cachedRequest);
241
- const interactionHandler = new RedirectHandler(authClient, this.browserStorage, cachedRequest, this.logger, this.performanceClient);
242
- return await interactionHandler.handleCodeResponse(serverParams, state);
243
- }
244
- /**
245
- * Use to log out the current user, and redirect the user to the postLogoutRedirectUri.
246
- * Default behaviour is to redirect the user to `window.location.href`.
247
- * @param logoutRequest
248
- */
249
- async logout(logoutRequest) {
250
- this.logger.verbose("logoutRedirect called");
251
- const validLogoutRequest = this.initializeLogoutRequest(logoutRequest);
252
- const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.logout);
253
- try {
254
- this.eventHandler.emitEvent(EventType.LOGOUT_START, InteractionType.Redirect, logoutRequest);
255
- // Clear cache on logout
256
- await this.clearCacheOnLogout(validLogoutRequest.account);
257
- const navigationOptions = {
258
- apiId: ApiId.logout,
259
- timeout: this.config.system.redirectNavigationTimeout,
260
- noHistory: false,
261
- };
262
- const authClient = await invokeAsync(this.createAuthCodeClient.bind(this), PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, this.logger, this.performanceClient, this.correlationId)(serverTelemetryManager, logoutRequest && logoutRequest.authority);
263
- if (authClient.authority.protocolMode === ProtocolMode.OIDC) {
264
- try {
265
- authClient.authority.endSessionEndpoint;
266
- }
267
- catch {
268
- if (validLogoutRequest.account?.homeAccountId) {
269
- void this.browserStorage.removeAccount(validLogoutRequest.account?.homeAccountId);
270
- this.eventHandler.emitEvent(EventType.LOGOUT_SUCCESS, InteractionType.Redirect, validLogoutRequest);
271
- return;
272
- }
273
- }
274
- }
275
- // Create logout string and navigate user window to logout.
276
- const logoutUri = authClient.getLogoutUri(validLogoutRequest);
277
- this.eventHandler.emitEvent(EventType.LOGOUT_SUCCESS, InteractionType.Redirect, validLogoutRequest);
278
- // Check if onRedirectNavigate is implemented, and invoke it if so
279
- if (logoutRequest &&
280
- typeof logoutRequest.onRedirectNavigate === "function") {
281
- const navigate = logoutRequest.onRedirectNavigate(logoutUri);
282
- if (navigate !== false) {
283
- this.logger.verbose("Logout onRedirectNavigate did not return false, navigating");
284
- // Ensure interaction is in progress
285
- if (!this.browserStorage.getInteractionInProgress()) {
286
- this.browserStorage.setInteractionInProgress(true);
287
- }
288
- await this.navigationClient.navigateExternal(logoutUri, navigationOptions);
289
- return;
290
- }
291
- else {
292
- // Ensure interaction is not in progress
293
- this.browserStorage.setInteractionInProgress(false);
294
- this.logger.verbose("Logout onRedirectNavigate returned false, stopping navigation");
295
- }
296
- }
297
- else {
298
- // Ensure interaction is in progress
299
- if (!this.browserStorage.getInteractionInProgress()) {
300
- this.browserStorage.setInteractionInProgress(true);
301
- }
302
- await this.navigationClient.navigateExternal(logoutUri, navigationOptions);
303
- return;
304
- }
305
- }
306
- catch (e) {
307
- if (e instanceof AuthError) {
308
- e.setCorrelationId(this.correlationId);
309
- serverTelemetryManager.cacheFailedRequest(e);
310
- }
311
- this.eventHandler.emitEvent(EventType.LOGOUT_FAILURE, InteractionType.Redirect, null, e);
312
- this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Redirect);
313
- throw e;
314
- }
315
- this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Redirect);
316
- }
317
- /**
318
- * Use to get the redirectStartPage either from request or use current window
319
- * @param requestStartPage
320
- */
321
- getRedirectStartPage(requestStartPage) {
322
- const redirectStartPage = requestStartPage || window.location.href;
323
- return UrlString.getAbsoluteUrl(redirectStartPage, getCurrentUri());
324
- }
15
+ /*
16
+ * Copyright (c) Microsoft Corporation. All rights reserved.
17
+ * Licensed under the MIT License.
18
+ */
19
+ class RedirectClient extends StandardInteractionClient {
20
+ constructor(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeStorageImpl, nativeMessageHandler, correlationId) {
21
+ super(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId);
22
+ this.nativeStorage = nativeStorageImpl;
23
+ }
24
+ /**
25
+ * Redirects the page to the /authorize endpoint of the IDP
26
+ * @param request
27
+ */
28
+ async acquireToken(request) {
29
+ const validRequest = await invokeAsync(this.initializeAuthorizationRequest.bind(this), PerformanceEvents.StandardInteractionClientInitializeAuthorizationRequest, this.logger, this.performanceClient, this.correlationId)(request, InteractionType.Redirect);
30
+ this.browserStorage.updateCacheEntries(validRequest.state, validRequest.nonce, validRequest.authority, validRequest.loginHint || "", validRequest.account || null);
31
+ const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenRedirect);
32
+ const handleBackButton = (event) => {
33
+ // Clear temporary cache if the back button is clicked during the redirect flow.
34
+ if (event.persisted) {
35
+ this.logger.verbose("Page was restored from back/forward cache. Clearing temporary cache.");
36
+ this.browserStorage.cleanRequestByState(validRequest.state);
37
+ this.eventHandler.emitEvent(EventType.RESTORE_FROM_BFCACHE, InteractionType.Redirect);
38
+ }
39
+ };
40
+ try {
41
+ // Create auth code request and generate PKCE params
42
+ const authCodeRequest = await invokeAsync(this.initializeAuthorizationCodeRequest.bind(this), PerformanceEvents.StandardInteractionClientInitializeAuthorizationCodeRequest, this.logger, this.performanceClient, this.correlationId)(validRequest);
43
+ // Initialize the client
44
+ const authClient = await invokeAsync(this.createAuthCodeClient.bind(this), PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, this.logger, this.performanceClient, this.correlationId)(serverTelemetryManager, validRequest.authority, validRequest.azureCloudOptions);
45
+ // Create redirect interaction handler.
46
+ const interactionHandler = new RedirectHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.performanceClient);
47
+ // Create acquire token url.
48
+ const navigateUrl = await authClient.getAuthCodeUrl({
49
+ ...validRequest,
50
+ nativeBroker: NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeMessageHandler, request.authenticationScheme),
51
+ });
52
+ const redirectStartPage = this.getRedirectStartPage(request.redirectStartPage);
53
+ this.logger.verbosePii(`Redirect start page: ${redirectStartPage}`);
54
+ // Clear temporary cache if the back button is clicked during the redirect flow.
55
+ window.addEventListener("pageshow", handleBackButton);
56
+ // 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
+ return await interactionHandler.initiateAuthRequest(navigateUrl, {
58
+ navigationClient: this.navigationClient,
59
+ redirectTimeout: this.config.system.redirectNavigationTimeout,
60
+ redirectStartPage: redirectStartPage,
61
+ onRedirectNavigate: request.onRedirectNavigate,
62
+ });
63
+ }
64
+ catch (e) {
65
+ if (e instanceof AuthError) {
66
+ e.setCorrelationId(this.correlationId);
67
+ serverTelemetryManager.cacheFailedRequest(e);
68
+ }
69
+ window.removeEventListener("pageshow", handleBackButton);
70
+ this.browserStorage.cleanRequestByState(validRequest.state);
71
+ throw e;
72
+ }
73
+ }
74
+ /**
75
+ * Checks if navigateToLoginRequestUrl is set, and:
76
+ * - if true, performs logic to cache and navigate
77
+ * - if false, handles hash string and parses response
78
+ * @param hash
79
+ */
80
+ async handleRedirectPromise(hash) {
81
+ const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.handleRedirectPromise);
82
+ try {
83
+ if (!this.browserStorage.isInteractionInProgress(true)) {
84
+ this.logger.info("handleRedirectPromise called but there is no interaction in progress, returning null.");
85
+ return null;
86
+ }
87
+ const [serverParams, responseString] = this.getRedirectResponse(hash || "");
88
+ if (!serverParams) {
89
+ // Not a recognized server response hash or hash not associated with a redirect request
90
+ this.logger.info("handleRedirectPromise did not detect a response as a result of a redirect. Cleaning temporary cache.");
91
+ this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);
92
+ return null;
93
+ }
94
+ // If navigateToLoginRequestUrl is true, get the url where the redirect request was initiated
95
+ const loginRequestUrl = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, true) || Constants.EMPTY_STRING;
96
+ const loginRequestUrlNormalized = UrlString.removeHashFromUrl(loginRequestUrl);
97
+ const currentUrlNormalized = UrlString.removeHashFromUrl(window.location.href);
98
+ if (loginRequestUrlNormalized === currentUrlNormalized &&
99
+ this.config.auth.navigateToLoginRequestUrl) {
100
+ // We are on the page we need to navigate to - handle hash
101
+ this.logger.verbose("Current page is loginRequestUrl, handling response");
102
+ if (loginRequestUrl.indexOf("#") > -1) {
103
+ // Replace current hash with non-msal hash, if present
104
+ replaceHash(loginRequestUrl);
105
+ }
106
+ const handleHashResult = await this.handleResponse(serverParams, serverTelemetryManager);
107
+ return handleHashResult;
108
+ }
109
+ else if (!this.config.auth.navigateToLoginRequestUrl) {
110
+ this.logger.verbose("NavigateToLoginRequestUrl set to false, handling response");
111
+ return await this.handleResponse(serverParams, serverTelemetryManager);
112
+ }
113
+ else if (!isInIframe() ||
114
+ this.config.system.allowRedirectInIframe) {
115
+ /*
116
+ * Returned from authority using redirect - need to perform navigation before processing response
117
+ * Cache the hash to be retrieved after the next redirect
118
+ */
119
+ this.browserStorage.setTemporaryCache(TemporaryCacheKeys.URL_HASH, responseString, true);
120
+ const navigationOptions = {
121
+ apiId: ApiId.handleRedirectPromise,
122
+ timeout: this.config.system.redirectNavigationTimeout,
123
+ noHistory: true,
124
+ };
125
+ /**
126
+ * Default behavior is to redirect to the start page and not process the hash now.
127
+ * The start page is expected to also call handleRedirectPromise which will process the hash in one of the checks above.
128
+ */
129
+ let processHashOnRedirect = true;
130
+ if (!loginRequestUrl || loginRequestUrl === "null") {
131
+ // Redirect to home page if login request url is null (real null or the string null)
132
+ const homepage = getHomepage();
133
+ // Cache the homepage under ORIGIN_URI to ensure cached hash is processed on homepage
134
+ this.browserStorage.setTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, homepage, true);
135
+ this.logger.warning("Unable to get valid login request url from cache, redirecting to home page");
136
+ processHashOnRedirect =
137
+ await this.navigationClient.navigateInternal(homepage, navigationOptions);
138
+ }
139
+ else {
140
+ // Navigate to page that initiated the redirect request
141
+ this.logger.verbose(`Navigating to loginRequestUrl: ${loginRequestUrl}`);
142
+ processHashOnRedirect =
143
+ await this.navigationClient.navigateInternal(loginRequestUrl, navigationOptions);
144
+ }
145
+ // If navigateInternal implementation returns false, handle the hash now
146
+ if (!processHashOnRedirect) {
147
+ return await this.handleResponse(serverParams, serverTelemetryManager);
148
+ }
149
+ }
150
+ return null;
151
+ }
152
+ catch (e) {
153
+ if (e instanceof AuthError) {
154
+ e.setCorrelationId(this.correlationId);
155
+ serverTelemetryManager.cacheFailedRequest(e);
156
+ }
157
+ this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);
158
+ throw e;
159
+ }
160
+ }
161
+ /**
162
+ * Gets the response hash for a redirect request
163
+ * Returns null if interactionType in the state value is not "redirect" or the hash does not contain known properties
164
+ * @param hash
165
+ */
166
+ getRedirectResponse(userProvidedResponse) {
167
+ this.logger.verbose("getRedirectResponseHash called");
168
+ // Get current location hash from window or cache.
169
+ let responseString = userProvidedResponse;
170
+ if (!responseString) {
171
+ if (this.config.auth.OIDCOptions.serverResponseType ===
172
+ ServerResponseType.QUERY) {
173
+ responseString = window.location.search;
174
+ }
175
+ else {
176
+ responseString = window.location.hash;
177
+ }
178
+ }
179
+ let response = UrlUtils.getDeserializedResponse(responseString);
180
+ if (response) {
181
+ try {
182
+ validateInteractionType(response, this.browserCrypto, InteractionType.Redirect);
183
+ }
184
+ catch (e) {
185
+ if (e instanceof AuthError) {
186
+ this.logger.error(`Interaction type validation failed due to ${e.errorCode}: ${e.errorMessage}`);
187
+ }
188
+ return [null, ""];
189
+ }
190
+ clearHash(window);
191
+ this.logger.verbose("Hash contains known properties, returning response hash");
192
+ return [response, responseString];
193
+ }
194
+ const cachedHash = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.URL_HASH, true);
195
+ this.browserStorage.removeItem(this.browserStorage.generateCacheKey(TemporaryCacheKeys.URL_HASH));
196
+ if (cachedHash) {
197
+ response = UrlUtils.getDeserializedResponse(cachedHash);
198
+ if (response) {
199
+ this.logger.verbose("Hash does not contain known properties, returning cached hash");
200
+ return [response, cachedHash];
201
+ }
202
+ }
203
+ return [null, ""];
204
+ }
205
+ /**
206
+ * Checks if hash exists and handles in window.
207
+ * @param hash
208
+ * @param state
209
+ */
210
+ async handleResponse(serverParams, serverTelemetryManager) {
211
+ const state = serverParams.state;
212
+ if (!state) {
213
+ throw createBrowserAuthError(noStateInHash);
214
+ }
215
+ const cachedRequest = this.browserStorage.getCachedRequest(state);
216
+ this.logger.verbose("handleResponse called, retrieved cached request");
217
+ if (serverParams.accountId) {
218
+ this.logger.verbose("Account id found in hash, calling WAM for token");
219
+ if (!this.nativeMessageHandler) {
220
+ throw createBrowserAuthError(nativeConnectionNotEstablished);
221
+ }
222
+ const nativeInteractionClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.acquireTokenPopup, this.performanceClient, this.nativeMessageHandler, serverParams.accountId, this.nativeStorage, cachedRequest.correlationId);
223
+ const { userRequestState } = ProtocolUtils.parseRequestState(this.browserCrypto, state);
224
+ return nativeInteractionClient
225
+ .acquireToken({
226
+ ...cachedRequest,
227
+ state: userRequestState,
228
+ prompt: undefined, // Server should handle the prompt, ideally native broker can do this part silently
229
+ })
230
+ .finally(() => {
231
+ this.browserStorage.cleanRequestByState(state);
232
+ });
233
+ }
234
+ // Hash contains known properties - handle and return in callback
235
+ const currentAuthority = this.browserStorage.getCachedAuthority(state);
236
+ if (!currentAuthority) {
237
+ throw createBrowserAuthError(noCachedAuthorityError);
238
+ }
239
+ const authClient = await invokeAsync(this.createAuthCodeClient.bind(this), PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, this.logger, this.performanceClient, this.correlationId)(serverTelemetryManager, currentAuthority);
240
+ ThrottlingUtils.removeThrottle(this.browserStorage, this.config.auth.clientId, cachedRequest);
241
+ const interactionHandler = new RedirectHandler(authClient, this.browserStorage, cachedRequest, this.logger, this.performanceClient);
242
+ return interactionHandler.handleCodeResponse(serverParams, state);
243
+ }
244
+ /**
245
+ * Use to log out the current user, and redirect the user to the postLogoutRedirectUri.
246
+ * Default behaviour is to redirect the user to `window.location.href`.
247
+ * @param logoutRequest
248
+ */
249
+ async logout(logoutRequest) {
250
+ this.logger.verbose("logoutRedirect called");
251
+ const validLogoutRequest = this.initializeLogoutRequest(logoutRequest);
252
+ const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.logout);
253
+ try {
254
+ this.eventHandler.emitEvent(EventType.LOGOUT_START, InteractionType.Redirect, logoutRequest);
255
+ // Clear cache on logout
256
+ await this.clearCacheOnLogout(validLogoutRequest.account);
257
+ const navigationOptions = {
258
+ apiId: ApiId.logout,
259
+ timeout: this.config.system.redirectNavigationTimeout,
260
+ noHistory: false,
261
+ };
262
+ const authClient = await invokeAsync(this.createAuthCodeClient.bind(this), PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, this.logger, this.performanceClient, this.correlationId)(serverTelemetryManager, logoutRequest && logoutRequest.authority);
263
+ if (authClient.authority.protocolMode === ProtocolMode.OIDC) {
264
+ try {
265
+ authClient.authority.endSessionEndpoint;
266
+ }
267
+ catch {
268
+ if (validLogoutRequest.account?.homeAccountId) {
269
+ void this.browserStorage.removeAccount(validLogoutRequest.account?.homeAccountId);
270
+ this.eventHandler.emitEvent(EventType.LOGOUT_SUCCESS, InteractionType.Redirect, validLogoutRequest);
271
+ return;
272
+ }
273
+ }
274
+ }
275
+ // Create logout string and navigate user window to logout.
276
+ const logoutUri = authClient.getLogoutUri(validLogoutRequest);
277
+ this.eventHandler.emitEvent(EventType.LOGOUT_SUCCESS, InteractionType.Redirect, validLogoutRequest);
278
+ // Check if onRedirectNavigate is implemented, and invoke it if so
279
+ if (logoutRequest &&
280
+ typeof logoutRequest.onRedirectNavigate === "function") {
281
+ const navigate = logoutRequest.onRedirectNavigate(logoutUri);
282
+ if (navigate !== false) {
283
+ this.logger.verbose("Logout onRedirectNavigate did not return false, navigating");
284
+ // Ensure interaction is in progress
285
+ if (!this.browserStorage.getInteractionInProgress()) {
286
+ this.browserStorage.setInteractionInProgress(true);
287
+ }
288
+ await this.navigationClient.navigateExternal(logoutUri, navigationOptions);
289
+ return;
290
+ }
291
+ else {
292
+ // Ensure interaction is not in progress
293
+ this.browserStorage.setInteractionInProgress(false);
294
+ this.logger.verbose("Logout onRedirectNavigate returned false, stopping navigation");
295
+ }
296
+ }
297
+ else {
298
+ // Ensure interaction is in progress
299
+ if (!this.browserStorage.getInteractionInProgress()) {
300
+ this.browserStorage.setInteractionInProgress(true);
301
+ }
302
+ await this.navigationClient.navigateExternal(logoutUri, navigationOptions);
303
+ return;
304
+ }
305
+ }
306
+ catch (e) {
307
+ if (e instanceof AuthError) {
308
+ e.setCorrelationId(this.correlationId);
309
+ serverTelemetryManager.cacheFailedRequest(e);
310
+ }
311
+ this.eventHandler.emitEvent(EventType.LOGOUT_FAILURE, InteractionType.Redirect, null, e);
312
+ this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Redirect);
313
+ throw e;
314
+ }
315
+ this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Redirect);
316
+ }
317
+ /**
318
+ * Use to get the redirectStartPage either from request or use current window
319
+ * @param requestStartPage
320
+ */
321
+ getRedirectStartPage(requestStartPage) {
322
+ const redirectStartPage = requestStartPage || window.location.href;
323
+ return UrlString.getAbsoluteUrl(redirectStartPage, getCurrentUri());
324
+ }
325
325
  }
326
326
 
327
327
  export { RedirectClient };