@azure/msal-browser 3.0.2 → 3.2.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 (280) hide show
  1. package/dist/app/IPublicClientApplication.d.ts +2 -0
  2. package/dist/app/IPublicClientApplication.d.ts.map +1 -1
  3. package/dist/app/IPublicClientApplication.mjs +22 -18
  4. package/dist/app/IPublicClientApplication.mjs.map +1 -1
  5. package/dist/app/PublicClientApplication.d.ts +20 -6
  6. package/dist/app/PublicClientApplication.d.ts.map +1 -1
  7. package/dist/app/PublicClientApplication.mjs +24 -7
  8. package/dist/app/PublicClientApplication.mjs.map +1 -1
  9. package/dist/broker/nativeBroker/NativeMessageHandler.d.ts +3 -4
  10. package/dist/broker/nativeBroker/NativeMessageHandler.d.ts.map +1 -1
  11. package/dist/broker/nativeBroker/NativeMessageHandler.mjs +17 -16
  12. package/dist/broker/nativeBroker/NativeMessageHandler.mjs.map +1 -1
  13. package/dist/broker/nativeBroker/NativeStatusCodes.d.ts +8 -0
  14. package/dist/broker/nativeBroker/NativeStatusCodes.d.ts.map +1 -0
  15. package/dist/broker/nativeBroker/NativeStatusCodes.mjs +16 -0
  16. package/dist/broker/nativeBroker/NativeStatusCodes.mjs.map +1 -0
  17. package/dist/cache/AsyncMemoryStorage.mjs +4 -3
  18. package/dist/cache/AsyncMemoryStorage.mjs.map +1 -1
  19. package/dist/cache/BrowserCacheManager.d.ts +10 -3
  20. package/dist/cache/BrowserCacheManager.d.ts.map +1 -1
  21. package/dist/cache/BrowserCacheManager.mjs +58 -29
  22. package/dist/cache/BrowserCacheManager.mjs.map +1 -1
  23. package/dist/cache/BrowserStorage.d.ts.map +1 -1
  24. package/dist/cache/BrowserStorage.mjs +7 -9
  25. package/dist/cache/BrowserStorage.mjs.map +1 -1
  26. package/dist/cache/CryptoKeyStore.mjs +1 -1
  27. package/dist/cache/CryptoKeyStore.mjs.map +1 -1
  28. package/dist/cache/DatabaseStorage.d.ts.map +1 -1
  29. package/dist/cache/DatabaseStorage.mjs +9 -8
  30. package/dist/cache/DatabaseStorage.mjs.map +1 -1
  31. package/dist/cache/MemoryStorage.mjs +1 -1
  32. package/dist/cache/MemoryStorage.mjs.map +1 -1
  33. package/dist/cache/TokenCache.d.ts.map +1 -1
  34. package/dist/cache/TokenCache.mjs +30 -30
  35. package/dist/cache/TokenCache.mjs.map +1 -1
  36. package/dist/config/Configuration.d.ts +1 -0
  37. package/dist/config/Configuration.d.ts.map +1 -1
  38. package/dist/config/Configuration.mjs +12 -16
  39. package/dist/config/Configuration.mjs.map +1 -1
  40. package/dist/controllers/ControllerFactory.mjs +1 -1
  41. package/dist/controllers/ControllerFactory.mjs.map +1 -1
  42. package/dist/controllers/IController.d.ts +5 -28
  43. package/dist/controllers/IController.d.ts.map +1 -1
  44. package/dist/controllers/StandardController.d.ts +17 -31
  45. package/dist/controllers/StandardController.d.ts.map +1 -1
  46. package/dist/controllers/StandardController.mjs +78 -83
  47. package/dist/controllers/StandardController.mjs.map +1 -1
  48. package/dist/crypto/BrowserCrypto.d.ts +44 -49
  49. package/dist/crypto/BrowserCrypto.d.ts.map +1 -1
  50. package/dist/crypto/BrowserCrypto.mjs +78 -77
  51. package/dist/crypto/BrowserCrypto.mjs.map +1 -1
  52. package/dist/crypto/CryptoOps.d.ts +1 -10
  53. package/dist/crypto/CryptoOps.d.ts.map +1 -1
  54. package/dist/crypto/CryptoOps.mjs +23 -34
  55. package/dist/crypto/CryptoOps.mjs.map +1 -1
  56. package/dist/crypto/PkceGenerator.d.ts +6 -22
  57. package/dist/crypto/PkceGenerator.d.ts.map +1 -1
  58. package/dist/crypto/PkceGenerator.mjs +48 -49
  59. package/dist/crypto/PkceGenerator.mjs.map +1 -1
  60. package/dist/crypto/SignedHttpRequest.mjs +1 -1
  61. package/dist/crypto/SignedHttpRequest.mjs.map +1 -1
  62. package/dist/encode/Base64Decode.d.ts +6 -19
  63. package/dist/encode/Base64Decode.d.ts.map +1 -1
  64. package/dist/encode/Base64Decode.mjs +31 -68
  65. package/dist/encode/Base64Decode.mjs.map +1 -1
  66. package/dist/encode/Base64Encode.d.ts +15 -27
  67. package/dist/encode/Base64Encode.d.ts.map +1 -1
  68. package/dist/encode/Base64Encode.mjs +36 -75
  69. package/dist/encode/Base64Encode.mjs.map +1 -1
  70. package/dist/error/BrowserAuthError.d.ts +63 -195
  71. package/dist/error/BrowserAuthError.d.ts.map +1 -1
  72. package/dist/error/BrowserAuthError.mjs +159 -381
  73. package/dist/error/BrowserAuthError.mjs.map +1 -1
  74. package/dist/error/BrowserAuthErrorCodes.d.ts +46 -0
  75. package/dist/error/BrowserAuthErrorCodes.d.ts.map +1 -0
  76. package/dist/error/BrowserAuthErrorCodes.mjs +54 -0
  77. package/dist/error/BrowserAuthErrorCodes.mjs.map +1 -0
  78. package/dist/error/BrowserConfigurationAuthError.d.ts +9 -46
  79. package/dist/error/BrowserConfigurationAuthError.d.ts.map +1 -1
  80. package/dist/error/BrowserConfigurationAuthError.mjs +20 -73
  81. package/dist/error/BrowserConfigurationAuthError.mjs.map +1 -1
  82. package/dist/error/BrowserConfigurationAuthErrorCodes.d.ts +4 -0
  83. package/dist/error/BrowserConfigurationAuthErrorCodes.d.ts.map +1 -0
  84. package/dist/error/BrowserConfigurationAuthErrorCodes.mjs +12 -0
  85. package/dist/error/BrowserConfigurationAuthErrorCodes.mjs.map +1 -0
  86. package/dist/error/NativeAuthError.d.ts +17 -45
  87. package/dist/error/NativeAuthError.d.ts.map +1 -1
  88. package/dist/error/NativeAuthError.mjs +49 -79
  89. package/dist/error/NativeAuthError.mjs.map +1 -1
  90. package/dist/error/NativeAuthErrorCodes.d.ts +3 -0
  91. package/dist/error/NativeAuthErrorCodes.d.ts.map +1 -0
  92. package/dist/error/NativeAuthErrorCodes.mjs +11 -0
  93. package/dist/error/NativeAuthErrorCodes.mjs.map +1 -0
  94. package/dist/event/EventHandler.d.ts.map +1 -1
  95. package/dist/event/EventHandler.mjs +3 -2
  96. package/dist/event/EventHandler.mjs.map +1 -1
  97. package/dist/event/EventMessage.mjs +1 -1
  98. package/dist/event/EventMessage.mjs.map +1 -1
  99. package/dist/event/EventType.mjs +1 -1
  100. package/dist/event/EventType.mjs.map +1 -1
  101. package/dist/index.d.ts +6 -6
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.mjs +8 -4
  104. package/dist/index.mjs.map +1 -1
  105. package/dist/interaction_client/BaseInteractionClient.d.ts +2 -1
  106. package/dist/interaction_client/BaseInteractionClient.d.ts.map +1 -1
  107. package/dist/interaction_client/BaseInteractionClient.mjs +7 -8
  108. package/dist/interaction_client/BaseInteractionClient.mjs.map +1 -1
  109. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.mjs +1 -1
  110. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.mjs.map +1 -1
  111. package/dist/interaction_client/NativeInteractionClient.d.ts +4 -10
  112. package/dist/interaction_client/NativeInteractionClient.d.ts.map +1 -1
  113. package/dist/interaction_client/NativeInteractionClient.mjs +32 -38
  114. package/dist/interaction_client/NativeInteractionClient.mjs.map +1 -1
  115. package/dist/interaction_client/PopupClient.d.ts.map +1 -1
  116. package/dist/interaction_client/PopupClient.mjs +16 -15
  117. package/dist/interaction_client/PopupClient.mjs.map +1 -1
  118. package/dist/interaction_client/RedirectClient.d.ts.map +1 -1
  119. package/dist/interaction_client/RedirectClient.mjs +7 -6
  120. package/dist/interaction_client/RedirectClient.mjs.map +1 -1
  121. package/dist/interaction_client/SilentAuthCodeClient.d.ts.map +1 -1
  122. package/dist/interaction_client/SilentAuthCodeClient.mjs +9 -11
  123. package/dist/interaction_client/SilentAuthCodeClient.mjs.map +1 -1
  124. package/dist/interaction_client/SilentCacheClient.d.ts +4 -2
  125. package/dist/interaction_client/SilentCacheClient.d.ts.map +1 -1
  126. package/dist/interaction_client/SilentCacheClient.mjs +19 -25
  127. package/dist/interaction_client/SilentCacheClient.mjs.map +1 -1
  128. package/dist/interaction_client/SilentIframeClient.d.ts.map +1 -1
  129. package/dist/interaction_client/SilentIframeClient.mjs +20 -47
  130. package/dist/interaction_client/SilentIframeClient.mjs.map +1 -1
  131. package/dist/interaction_client/SilentRefreshClient.d.ts.map +1 -1
  132. package/dist/interaction_client/SilentRefreshClient.mjs +11 -20
  133. package/dist/interaction_client/SilentRefreshClient.mjs.map +1 -1
  134. package/dist/interaction_client/StandardInteractionClient.d.ts.map +1 -1
  135. package/dist/interaction_client/StandardInteractionClient.mjs +18 -38
  136. package/dist/interaction_client/StandardInteractionClient.mjs.map +1 -1
  137. package/dist/interaction_handler/InteractionHandler.d.ts.map +1 -1
  138. package/dist/interaction_handler/InteractionHandler.mjs +13 -16
  139. package/dist/interaction_handler/InteractionHandler.mjs.map +1 -1
  140. package/dist/interaction_handler/RedirectHandler.d.ts.map +1 -1
  141. package/dist/interaction_handler/RedirectHandler.mjs +12 -11
  142. package/dist/interaction_handler/RedirectHandler.mjs.map +1 -1
  143. package/dist/interaction_handler/SilentHandler.d.ts.map +1 -1
  144. package/dist/interaction_handler/SilentHandler.mjs +11 -11
  145. package/dist/interaction_handler/SilentHandler.mjs.map +1 -1
  146. package/dist/navigation/NavigationClient.mjs +1 -1
  147. package/dist/navigation/NavigationClient.mjs.map +1 -1
  148. package/dist/network/FetchClient.d.ts.map +1 -1
  149. package/dist/network/FetchClient.mjs +9 -8
  150. package/dist/network/FetchClient.mjs.map +1 -1
  151. package/dist/operatingcontext/BaseOperatingContext.mjs +1 -1
  152. package/dist/operatingcontext/BaseOperatingContext.mjs.map +1 -1
  153. package/dist/operatingcontext/StandardOperatingContext.mjs +1 -1
  154. package/dist/operatingcontext/StandardOperatingContext.mjs.map +1 -1
  155. package/dist/operatingcontext/TeamsAppOperatingContext.mjs +1 -1
  156. package/dist/operatingcontext/TeamsAppOperatingContext.mjs.map +1 -1
  157. package/dist/packageMetadata.d.ts +1 -1
  158. package/dist/packageMetadata.mjs +2 -2
  159. package/dist/packageMetadata.mjs.map +1 -1
  160. package/dist/request/ClearCacheRequest.d.ts +11 -0
  161. package/dist/request/ClearCacheRequest.d.ts.map +1 -0
  162. package/dist/telemetry/BrowserPerformanceClient.d.ts +2 -4
  163. package/dist/telemetry/BrowserPerformanceClient.d.ts.map +1 -1
  164. package/dist/telemetry/BrowserPerformanceClient.mjs +2 -6
  165. package/dist/telemetry/BrowserPerformanceClient.mjs.map +1 -1
  166. package/dist/telemetry/BrowserPerformanceMeasurement.mjs +1 -1
  167. package/dist/telemetry/BrowserPerformanceMeasurement.mjs.map +1 -1
  168. package/dist/utils/BrowserConstants.mjs +1 -1
  169. package/dist/utils/BrowserConstants.mjs.map +1 -1
  170. package/dist/utils/BrowserProtocolUtils.d.ts.map +1 -1
  171. package/dist/utils/BrowserProtocolUtils.mjs +4 -4
  172. package/dist/utils/BrowserProtocolUtils.mjs.map +1 -1
  173. package/dist/utils/BrowserStringUtils.mjs +1 -1
  174. package/dist/utils/BrowserStringUtils.mjs.map +1 -1
  175. package/dist/utils/BrowserUtils.d.ts +0 -9
  176. package/dist/utils/BrowserUtils.d.ts.map +1 -1
  177. package/dist/utils/BrowserUtils.mjs +8 -33
  178. package/dist/utils/BrowserUtils.mjs.map +1 -1
  179. package/lib/msal-browser.cjs +8729 -9566
  180. package/lib/msal-browser.cjs.map +1 -1
  181. package/lib/msal-browser.js +8729 -9566
  182. package/lib/msal-browser.js.map +1 -1
  183. package/lib/msal-browser.min.js +68 -62
  184. package/package.json +7 -5
  185. package/src/app/IPublicClientApplication.ts +236 -0
  186. package/src/app/PublicClientApplication.ts +417 -0
  187. package/src/broker/nativeBroker/NativeMessageHandler.ts +416 -0
  188. package/src/broker/nativeBroker/NativeRequest.ts +52 -0
  189. package/src/broker/nativeBroker/NativeResponse.ts +56 -0
  190. package/src/broker/nativeBroker/NativeStatusCodes.ts +13 -0
  191. package/src/cache/AsyncMemoryStorage.ts +158 -0
  192. package/src/cache/BrowserCacheManager.ts +2009 -0
  193. package/src/cache/BrowserStorage.ts +52 -0
  194. package/src/cache/CryptoKeyStore.ts +63 -0
  195. package/src/cache/DatabaseStorage.ts +287 -0
  196. package/src/cache/IAsyncMemoryStorage.ts +36 -0
  197. package/src/cache/ITokenCache.ts +21 -0
  198. package/src/cache/IWindowStorage.ts +36 -0
  199. package/src/cache/MemoryStorage.ts +42 -0
  200. package/src/cache/TokenCache.ts +484 -0
  201. package/src/config/Configuration.ts +383 -0
  202. package/src/controllers/ControllerFactory.ts +55 -0
  203. package/src/controllers/IController.ts +134 -0
  204. package/src/controllers/StandardController.ts +2170 -0
  205. package/src/crypto/BrowserCrypto.ts +151 -0
  206. package/src/crypto/CryptoOps.ts +235 -0
  207. package/src/crypto/PkceGenerator.ts +115 -0
  208. package/src/crypto/SignedHttpRequest.ts +76 -0
  209. package/src/encode/Base64Decode.ts +46 -0
  210. package/src/encode/Base64Encode.ts +52 -0
  211. package/src/error/BrowserAuthError.ts +352 -0
  212. package/src/error/BrowserAuthErrorCodes.ts +57 -0
  213. package/src/error/BrowserConfigurationAuthError.ts +64 -0
  214. package/src/error/BrowserConfigurationAuthErrorCodes.ts +9 -0
  215. package/src/error/NativeAuthError.ts +113 -0
  216. package/src/error/NativeAuthErrorCodes.ts +7 -0
  217. package/src/event/EventHandler.ts +177 -0
  218. package/src/event/EventMessage.ts +125 -0
  219. package/src/event/EventType.ts +33 -0
  220. package/src/index.ts +157 -0
  221. package/src/interaction_client/BaseInteractionClient.ts +307 -0
  222. package/src/interaction_client/HybridSpaAuthorizationCodeClient.ts +16 -0
  223. package/src/interaction_client/NativeInteractionClient.ts +925 -0
  224. package/src/interaction_client/PopupClient.ts +926 -0
  225. package/src/interaction_client/RedirectClient.ts +616 -0
  226. package/src/interaction_client/SilentAuthCodeClient.ts +165 -0
  227. package/src/interaction_client/SilentCacheClient.ts +125 -0
  228. package/src/interaction_client/SilentIframeClient.ts +301 -0
  229. package/src/interaction_client/SilentRefreshClient.ts +118 -0
  230. package/src/interaction_client/StandardInteractionClient.ts +450 -0
  231. package/src/interaction_handler/InteractionHandler.ts +251 -0
  232. package/src/interaction_handler/RedirectHandler.ts +229 -0
  233. package/src/interaction_handler/SilentHandler.ts +269 -0
  234. package/src/navigation/INavigationClient.ts +23 -0
  235. package/src/navigation/NavigationClient.ts +55 -0
  236. package/src/navigation/NavigationOptions.ts +18 -0
  237. package/src/network/FetchClient.ts +130 -0
  238. package/src/operatingcontext/BaseOperatingContext.ts +82 -0
  239. package/src/operatingcontext/StandardOperatingContext.ts +49 -0
  240. package/src/operatingcontext/TeamsAppOperatingContext.ts +48 -0
  241. package/src/packageMetadata.ts +3 -0
  242. package/src/request/AuthorizationCodeRequest.ts +19 -0
  243. package/src/request/AuthorizationUrlRequest.ts +17 -0
  244. package/src/request/ClearCacheRequest.ts +16 -0
  245. package/src/request/EndSessionPopupRequest.ts +26 -0
  246. package/src/request/EndSessionRequest.ts +23 -0
  247. package/src/request/PopupRequest.ts +51 -0
  248. package/src/request/PopupWindowAttributes.ts +22 -0
  249. package/src/request/RedirectRequest.ts +51 -0
  250. package/src/request/SilentRequest.ts +49 -0
  251. package/src/request/SsoSilentRequest.ts +44 -0
  252. package/src/response/AuthenticationResult.ts +13 -0
  253. package/src/telemetry/BrowserPerformanceClient.ts +226 -0
  254. package/src/telemetry/BrowserPerformanceMeasurement.ts +144 -0
  255. package/src/utils/BrowserConstants.ts +241 -0
  256. package/src/utils/BrowserProtocolUtils.ts +58 -0
  257. package/src/utils/BrowserStringUtils.ts +143 -0
  258. package/src/utils/BrowserUtils.ts +156 -0
  259. package/dist/crypto/GuidGenerator.d.ts +0 -13
  260. package/dist/crypto/GuidGenerator.d.ts.map +0 -1
  261. package/dist/crypto/GuidGenerator.mjs +0 -104
  262. package/dist/crypto/GuidGenerator.mjs.map +0 -1
  263. package/dist/crypto/ISubtleCrypto.d.ts +0 -10
  264. package/dist/crypto/ISubtleCrypto.d.ts.map +0 -1
  265. package/dist/crypto/ModernBrowserCrypto.d.ts +0 -10
  266. package/dist/crypto/ModernBrowserCrypto.d.ts.map +0 -1
  267. package/dist/crypto/ModernBrowserCrypto.mjs +0 -31
  268. package/dist/crypto/ModernBrowserCrypto.mjs.map +0 -1
  269. package/dist/internals.d.ts +0 -23
  270. package/dist/internals.d.ts.map +0 -1
  271. package/dist/internals.mjs +0 -28
  272. package/dist/internals.mjs.map +0 -1
  273. package/dist/network/XhrClient.d.ts +0 -41
  274. package/dist/network/XhrClient.d.ts.map +0 -1
  275. package/dist/network/XhrClient.mjs +0 -125
  276. package/dist/network/XhrClient.mjs.map +0 -1
  277. package/dist/utils/MathUtils.d.ts +0 -12
  278. package/dist/utils/MathUtils.d.ts.map +0 -1
  279. package/dist/utils/MathUtils.mjs +0 -26
  280. package/dist/utils/MathUtils.mjs.map +0 -1
@@ -0,0 +1,251 @@
1
+ /*
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import {
7
+ AuthorizationCodePayload,
8
+ CommonAuthorizationCodeRequest,
9
+ AuthorizationCodeClient,
10
+ AuthorityFactory,
11
+ Authority,
12
+ INetworkModule,
13
+ CcsCredential,
14
+ Logger,
15
+ ServerError,
16
+ IPerformanceClient,
17
+ PerformanceEvents,
18
+ invokeAsync,
19
+ createClientAuthError,
20
+ ClientAuthErrorCodes,
21
+ } from "@azure/msal-common";
22
+
23
+ import { BrowserCacheManager } from "../cache/BrowserCacheManager";
24
+ import {
25
+ createBrowserAuthError,
26
+ BrowserAuthErrorCodes,
27
+ } from "../error/BrowserAuthError";
28
+ import { TemporaryCacheKeys } from "../utils/BrowserConstants";
29
+ import { AuthenticationResult } from "../response/AuthenticationResult";
30
+
31
+ export type InteractionParams = {};
32
+
33
+ /**
34
+ * Abstract class which defines operations for a browser interaction handling class.
35
+ */
36
+ export class InteractionHandler {
37
+ protected authModule: AuthorizationCodeClient;
38
+ protected browserStorage: BrowserCacheManager;
39
+ protected authCodeRequest: CommonAuthorizationCodeRequest;
40
+ protected logger: Logger;
41
+ protected performanceClient: IPerformanceClient;
42
+
43
+ constructor(
44
+ authCodeModule: AuthorizationCodeClient,
45
+ storageImpl: BrowserCacheManager,
46
+ authCodeRequest: CommonAuthorizationCodeRequest,
47
+ logger: Logger,
48
+ performanceClient: IPerformanceClient
49
+ ) {
50
+ this.authModule = authCodeModule;
51
+ this.browserStorage = storageImpl;
52
+ this.authCodeRequest = authCodeRequest;
53
+ this.logger = logger;
54
+ this.performanceClient = performanceClient;
55
+ }
56
+
57
+ /**
58
+ * Function to handle response parameters from hash.
59
+ * @param locationHash
60
+ */
61
+ async handleCodeResponseFromHash(
62
+ locationHash: string,
63
+ state: string,
64
+ authority: Authority,
65
+ networkModule: INetworkModule
66
+ ): Promise<AuthenticationResult> {
67
+ this.performanceClient.addQueueMeasurement(
68
+ PerformanceEvents.HandleCodeResponseFromHash,
69
+ this.authCodeRequest.correlationId
70
+ );
71
+ // Check that location hash isn't empty.
72
+ if (!locationHash) {
73
+ throw createBrowserAuthError(BrowserAuthErrorCodes.hashEmptyError);
74
+ }
75
+
76
+ // Handle code response.
77
+ const stateKey = this.browserStorage.generateStateKey(state);
78
+ const requestState = this.browserStorage.getTemporaryCache(stateKey);
79
+ if (!requestState) {
80
+ throw createClientAuthError(
81
+ ClientAuthErrorCodes.stateNotFound,
82
+ "Cached State"
83
+ );
84
+ }
85
+
86
+ let authCodeResponse;
87
+ try {
88
+ authCodeResponse = this.authModule.handleFragmentResponse(
89
+ locationHash,
90
+ requestState
91
+ );
92
+ } catch (e) {
93
+ if (
94
+ e instanceof ServerError &&
95
+ e.subError === BrowserAuthErrorCodes.userCancelled
96
+ ) {
97
+ // Translate server error caused by user closing native prompt to corresponding first class MSAL error
98
+ throw createBrowserAuthError(
99
+ BrowserAuthErrorCodes.userCancelled
100
+ );
101
+ } else {
102
+ throw e;
103
+ }
104
+ }
105
+
106
+ return invokeAsync(
107
+ this.handleCodeResponseFromServer.bind(this),
108
+ PerformanceEvents.HandleCodeResponseFromServer,
109
+ this.logger,
110
+ this.performanceClient,
111
+ this.authCodeRequest.correlationId
112
+ )(authCodeResponse, state, authority, networkModule);
113
+ }
114
+
115
+ /**
116
+ * Process auth code response from AAD
117
+ * @param authCodeResponse
118
+ * @param state
119
+ * @param authority
120
+ * @param networkModule
121
+ * @returns
122
+ */
123
+ async handleCodeResponseFromServer(
124
+ authCodeResponse: AuthorizationCodePayload,
125
+ state: string,
126
+ authority: Authority,
127
+ networkModule: INetworkModule,
128
+ validateNonce: boolean = true
129
+ ): Promise<AuthenticationResult> {
130
+ this.performanceClient.addQueueMeasurement(
131
+ PerformanceEvents.HandleCodeResponseFromServer,
132
+ this.authCodeRequest.correlationId
133
+ );
134
+ this.logger.trace(
135
+ "InteractionHandler.handleCodeResponseFromServer called"
136
+ );
137
+
138
+ // Handle code response.
139
+ const stateKey = this.browserStorage.generateStateKey(state);
140
+ const requestState = this.browserStorage.getTemporaryCache(stateKey);
141
+ if (!requestState) {
142
+ throw createClientAuthError(
143
+ ClientAuthErrorCodes.stateNotFound,
144
+ "Cached State"
145
+ );
146
+ }
147
+
148
+ // Get cached items
149
+ const nonceKey = this.browserStorage.generateNonceKey(requestState);
150
+ const cachedNonce = this.browserStorage.getTemporaryCache(nonceKey);
151
+
152
+ // Assign code to request
153
+ this.authCodeRequest.code = authCodeResponse.code;
154
+
155
+ // Check for new cloud instance
156
+ if (authCodeResponse.cloud_instance_host_name) {
157
+ await invokeAsync(
158
+ this.updateTokenEndpointAuthority.bind(this),
159
+ PerformanceEvents.UpdateTokenEndpointAuthority,
160
+ this.logger,
161
+ this.performanceClient,
162
+ this.authCodeRequest.correlationId
163
+ )(
164
+ authCodeResponse.cloud_instance_host_name,
165
+ authority,
166
+ networkModule
167
+ );
168
+ }
169
+
170
+ // Nonce validation not needed when redirect not involved (e.g. hybrid spa, renewing token via rt)
171
+ if (validateNonce) {
172
+ authCodeResponse.nonce = cachedNonce || undefined;
173
+ }
174
+
175
+ authCodeResponse.state = requestState;
176
+
177
+ // Add CCS parameters if available
178
+ if (authCodeResponse.client_info) {
179
+ this.authCodeRequest.clientInfo = authCodeResponse.client_info;
180
+ } else {
181
+ const cachedCcsCred = this.checkCcsCredentials();
182
+ if (cachedCcsCred) {
183
+ this.authCodeRequest.ccsCredential = cachedCcsCred;
184
+ }
185
+ }
186
+
187
+ // Acquire token with retrieved code.
188
+ const tokenResponse = (await invokeAsync(
189
+ this.authModule.acquireToken.bind(this.authModule),
190
+ PerformanceEvents.AuthClientAcquireToken,
191
+ this.logger,
192
+ this.performanceClient,
193
+ this.authCodeRequest.correlationId
194
+ )(this.authCodeRequest, authCodeResponse)) as AuthenticationResult;
195
+ this.browserStorage.cleanRequestByState(state);
196
+ return tokenResponse;
197
+ }
198
+
199
+ /**
200
+ * Updates authority based on cloudInstanceHostname
201
+ * @param cloudInstanceHostname
202
+ * @param authority
203
+ * @param networkModule
204
+ */
205
+ protected async updateTokenEndpointAuthority(
206
+ cloudInstanceHostname: string,
207
+ authority: Authority,
208
+ networkModule: INetworkModule
209
+ ): Promise<void> {
210
+ this.performanceClient.addQueueMeasurement(
211
+ PerformanceEvents.UpdateTokenEndpointAuthority,
212
+ this.authCodeRequest.correlationId
213
+ );
214
+ const cloudInstanceAuthorityUri = `https://${cloudInstanceHostname}/${authority.tenant}/`;
215
+ const cloudInstanceAuthority =
216
+ await AuthorityFactory.createDiscoveredInstance(
217
+ cloudInstanceAuthorityUri,
218
+ networkModule,
219
+ this.browserStorage,
220
+ authority.options,
221
+ this.logger,
222
+ this.performanceClient,
223
+ this.authCodeRequest.correlationId
224
+ );
225
+ this.authModule.updateAuthority(cloudInstanceAuthority);
226
+ }
227
+
228
+ /**
229
+ * Looks up ccs creds in the cache
230
+ */
231
+ protected checkCcsCredentials(): CcsCredential | null {
232
+ // Look up ccs credential in temp cache
233
+ const cachedCcsCred = this.browserStorage.getTemporaryCache(
234
+ TemporaryCacheKeys.CCS_CREDENTIAL,
235
+ true
236
+ );
237
+ if (cachedCcsCred) {
238
+ try {
239
+ return JSON.parse(cachedCcsCred) as CcsCredential;
240
+ } catch (e) {
241
+ this.authModule.logger.error(
242
+ "Cache credential could not be parsed"
243
+ );
244
+ this.authModule.logger.errorPii(
245
+ `Cache credential could not be parsed: ${cachedCcsCred}`
246
+ );
247
+ }
248
+ }
249
+ return null;
250
+ }
251
+ }
@@ -0,0 +1,229 @@
1
+ /*
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import {
7
+ AuthorizationCodeClient,
8
+ CommonAuthorizationCodeRequest,
9
+ ICrypto,
10
+ Authority,
11
+ INetworkModule,
12
+ Logger,
13
+ ServerError,
14
+ IPerformanceClient,
15
+ createClientAuthError,
16
+ ClientAuthErrorCodes,
17
+ } from "@azure/msal-common";
18
+ import {
19
+ createBrowserAuthError,
20
+ BrowserAuthErrorCodes,
21
+ } from "../error/BrowserAuthError";
22
+ import { ApiId, TemporaryCacheKeys } from "../utils/BrowserConstants";
23
+ import { BrowserCacheManager } from "../cache/BrowserCacheManager";
24
+ import { InteractionHandler, InteractionParams } from "./InteractionHandler";
25
+ import { INavigationClient } from "../navigation/INavigationClient";
26
+ import { NavigationOptions } from "../navigation/NavigationOptions";
27
+ import { AuthenticationResult } from "../response/AuthenticationResult";
28
+
29
+ export type RedirectParams = InteractionParams & {
30
+ navigationClient: INavigationClient;
31
+ redirectTimeout: number;
32
+ redirectStartPage: string;
33
+ onRedirectNavigate?: (url: string) => void | boolean;
34
+ };
35
+
36
+ export class RedirectHandler extends InteractionHandler {
37
+ private browserCrypto: ICrypto;
38
+
39
+ constructor(
40
+ authCodeModule: AuthorizationCodeClient,
41
+ storageImpl: BrowserCacheManager,
42
+ authCodeRequest: CommonAuthorizationCodeRequest,
43
+ logger: Logger,
44
+ browserCrypto: ICrypto,
45
+ performanceClient: IPerformanceClient
46
+ ) {
47
+ super(
48
+ authCodeModule,
49
+ storageImpl,
50
+ authCodeRequest,
51
+ logger,
52
+ performanceClient
53
+ );
54
+ this.browserCrypto = browserCrypto;
55
+ }
56
+
57
+ /**
58
+ * Redirects window to given URL.
59
+ * @param urlNavigate
60
+ */
61
+ async initiateAuthRequest(
62
+ requestUrl: string,
63
+ params: RedirectParams
64
+ ): Promise<void> {
65
+ this.logger.verbose("RedirectHandler.initiateAuthRequest called");
66
+ // Navigate if valid URL
67
+ if (requestUrl) {
68
+ // Cache start page, returns to this page after redirectUri if navigateToLoginRequestUrl is true
69
+ if (params.redirectStartPage) {
70
+ this.logger.verbose(
71
+ "RedirectHandler.initiateAuthRequest: redirectStartPage set, caching start page"
72
+ );
73
+ this.browserStorage.setTemporaryCache(
74
+ TemporaryCacheKeys.ORIGIN_URI,
75
+ params.redirectStartPage,
76
+ true
77
+ );
78
+ }
79
+
80
+ // Set interaction status in the library.
81
+ this.browserStorage.setTemporaryCache(
82
+ TemporaryCacheKeys.CORRELATION_ID,
83
+ this.authCodeRequest.correlationId,
84
+ true
85
+ );
86
+ this.browserStorage.cacheCodeRequest(this.authCodeRequest);
87
+ this.logger.infoPii(
88
+ `RedirectHandler.initiateAuthRequest: Navigate to: ${requestUrl}`
89
+ );
90
+ const navigationOptions: NavigationOptions = {
91
+ apiId: ApiId.acquireTokenRedirect,
92
+ timeout: params.redirectTimeout,
93
+ noHistory: false,
94
+ };
95
+
96
+ // If onRedirectNavigate is implemented, invoke it and provide requestUrl
97
+ if (typeof params.onRedirectNavigate === "function") {
98
+ this.logger.verbose(
99
+ "RedirectHandler.initiateAuthRequest: Invoking onRedirectNavigate callback"
100
+ );
101
+ const navigate = params.onRedirectNavigate(requestUrl);
102
+
103
+ // Returning false from onRedirectNavigate will stop navigation
104
+ if (navigate !== false) {
105
+ this.logger.verbose(
106
+ "RedirectHandler.initiateAuthRequest: onRedirectNavigate did not return false, navigating"
107
+ );
108
+ await params.navigationClient.navigateExternal(
109
+ requestUrl,
110
+ navigationOptions
111
+ );
112
+ return;
113
+ } else {
114
+ this.logger.verbose(
115
+ "RedirectHandler.initiateAuthRequest: onRedirectNavigate returned false, stopping navigation"
116
+ );
117
+ return;
118
+ }
119
+ } else {
120
+ // Navigate window to request URL
121
+ this.logger.verbose(
122
+ "RedirectHandler.initiateAuthRequest: Navigating window to navigate url"
123
+ );
124
+ await params.navigationClient.navigateExternal(
125
+ requestUrl,
126
+ navigationOptions
127
+ );
128
+ return;
129
+ }
130
+ } else {
131
+ // Throw error if request URL is empty.
132
+ this.logger.info(
133
+ "RedirectHandler.initiateAuthRequest: Navigate url is empty"
134
+ );
135
+ throw createBrowserAuthError(
136
+ BrowserAuthErrorCodes.emptyNavigateUri
137
+ );
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Handle authorization code response in the window.
143
+ * @param hash
144
+ */
145
+ async handleCodeResponseFromHash(
146
+ locationHash: string,
147
+ state: string,
148
+ authority: Authority,
149
+ networkModule: INetworkModule
150
+ ): Promise<AuthenticationResult> {
151
+ this.logger.verbose("RedirectHandler.handleCodeResponse called");
152
+
153
+ // Check that location hash isn't empty.
154
+ if (!locationHash) {
155
+ throw createBrowserAuthError(BrowserAuthErrorCodes.hashEmptyError);
156
+ }
157
+
158
+ // Interaction is completed - remove interaction status.
159
+ this.browserStorage.setInteractionInProgress(false);
160
+
161
+ // Handle code response.
162
+ const stateKey = this.browserStorage.generateStateKey(state);
163
+ const requestState = this.browserStorage.getTemporaryCache(stateKey);
164
+ if (!requestState) {
165
+ throw createClientAuthError(
166
+ ClientAuthErrorCodes.stateNotFound,
167
+ "Cached State"
168
+ );
169
+ }
170
+
171
+ let authCodeResponse;
172
+ try {
173
+ authCodeResponse = this.authModule.handleFragmentResponse(
174
+ locationHash,
175
+ requestState
176
+ );
177
+ } catch (e) {
178
+ if (
179
+ e instanceof ServerError &&
180
+ e.subError === BrowserAuthErrorCodes.userCancelled
181
+ ) {
182
+ // Translate server error caused by user closing native prompt to corresponding first class MSAL error
183
+ throw createBrowserAuthError(
184
+ BrowserAuthErrorCodes.userCancelled
185
+ );
186
+ } else {
187
+ throw e;
188
+ }
189
+ }
190
+
191
+ // Get cached items
192
+ const nonceKey = this.browserStorage.generateNonceKey(requestState);
193
+ const cachedNonce = this.browserStorage.getTemporaryCache(nonceKey);
194
+
195
+ // Assign code to request
196
+ this.authCodeRequest.code = authCodeResponse.code;
197
+
198
+ // Check for new cloud instance
199
+ if (authCodeResponse.cloud_instance_host_name) {
200
+ await this.updateTokenEndpointAuthority(
201
+ authCodeResponse.cloud_instance_host_name,
202
+ authority,
203
+ networkModule
204
+ );
205
+ }
206
+
207
+ authCodeResponse.nonce = cachedNonce || undefined;
208
+ authCodeResponse.state = requestState;
209
+
210
+ // Add CCS parameters if available
211
+ if (authCodeResponse.client_info) {
212
+ this.authCodeRequest.clientInfo = authCodeResponse.client_info;
213
+ } else {
214
+ const cachedCcsCred = this.checkCcsCredentials();
215
+ if (cachedCcsCred) {
216
+ this.authCodeRequest.ccsCredential = cachedCcsCred;
217
+ }
218
+ }
219
+
220
+ // Acquire token with retrieved code.
221
+ const tokenResponse = (await this.authModule.acquireToken(
222
+ this.authCodeRequest,
223
+ authCodeResponse
224
+ )) as AuthenticationResult;
225
+
226
+ this.browserStorage.cleanRequestByState(state);
227
+ return tokenResponse;
228
+ }
229
+ }