@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,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
  import { PerformanceEvents, Constants, UrlString, AuthorizationCodeClient, Authority, AuthorityFactory, ProtocolUtils, ResponseMode, StringUtils } from '@azure/msal-common';
4
4
  import { BaseInteractionClient } from './BaseInteractionClient.js';
@@ -8,264 +8,264 @@ import { BrowserAuthError } from '../error/BrowserAuthError.js';
8
8
  import { BrowserProtocolUtils } from '../utils/BrowserProtocolUtils.js';
9
9
  import { BrowserUtils } from '../utils/BrowserUtils.js';
10
10
 
11
- /*
12
- * Copyright (c) Microsoft Corporation. All rights reserved.
13
- * Licensed under the MIT License.
14
- */
15
- /**
16
- * Defines the class structure and helper functions used by the "standard", non-brokered auth flows (popup, redirect, silent (RT), silent (iframe))
17
- */
18
- class StandardInteractionClient extends BaseInteractionClient {
19
- /**
20
- * Generates an auth code request tied to the url request.
21
- * @param request
22
- */
23
- async initializeAuthorizationCodeRequest(request) {
24
- this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientInitializeAuthorizationCodeRequest, request.correlationId);
25
- this.logger.verbose("initializeAuthorizationRequest called", request.correlationId);
26
- const generatedPkceParams = await this.browserCrypto.generatePkceCodes();
27
- const authCodeRequest = {
28
- ...request,
29
- redirectUri: request.redirectUri,
30
- code: Constants.EMPTY_STRING,
31
- codeVerifier: generatedPkceParams.verifier,
32
- };
33
- request.codeChallenge = generatedPkceParams.challenge;
34
- request.codeChallengeMethod = Constants.S256_CODE_CHALLENGE_METHOD;
35
- return authCodeRequest;
36
- }
37
- /**
38
- * Initializer for the logout request.
39
- * @param logoutRequest
40
- */
41
- initializeLogoutRequest(logoutRequest) {
42
- this.logger.verbose("initializeLogoutRequest called", logoutRequest?.correlationId);
43
- const validLogoutRequest = {
44
- correlationId: this.correlationId || this.browserCrypto.createNewGuid(),
45
- ...logoutRequest,
46
- };
47
- /**
48
- * Set logout_hint to be login_hint from ID Token Claims if present
49
- * and logoutHint attribute wasn't manually set in logout request
50
- */
51
- if (logoutRequest) {
52
- // If logoutHint isn't set and an account was passed in, try to extract logoutHint from ID Token Claims
53
- if (!logoutRequest.logoutHint) {
54
- if (logoutRequest.account) {
55
- const logoutHint = this.getLogoutHintFromIdTokenClaims(logoutRequest.account);
56
- if (logoutHint) {
57
- this.logger.verbose("Setting logoutHint to login_hint ID Token Claim value for the account provided");
58
- validLogoutRequest.logoutHint = logoutHint;
59
- }
60
- }
61
- else {
62
- this.logger.verbose("logoutHint was not set and account was not passed into logout request, logoutHint will not be set");
63
- }
64
- }
65
- else {
66
- this.logger.verbose("logoutHint has already been set in logoutRequest");
67
- }
68
- }
69
- else {
70
- this.logger.verbose("logoutHint will not be set since no logout request was configured");
71
- }
72
- /*
73
- * Only set redirect uri if logout request isn't provided or the set uri isn't null.
74
- * Otherwise, use passed uri, config, or current page.
75
- */
76
- if (!logoutRequest || logoutRequest.postLogoutRedirectUri !== null) {
77
- if (logoutRequest && logoutRequest.postLogoutRedirectUri) {
78
- this.logger.verbose("Setting postLogoutRedirectUri to uri set on logout request", validLogoutRequest.correlationId);
79
- validLogoutRequest.postLogoutRedirectUri =
80
- UrlString.getAbsoluteUrl(logoutRequest.postLogoutRedirectUri, BrowserUtils.getCurrentUri());
81
- }
82
- else if (this.config.auth.postLogoutRedirectUri === null) {
83
- this.logger.verbose("postLogoutRedirectUri configured as null and no uri set on request, not passing post logout redirect", validLogoutRequest.correlationId);
84
- }
85
- else if (this.config.auth.postLogoutRedirectUri) {
86
- this.logger.verbose("Setting postLogoutRedirectUri to configured uri", validLogoutRequest.correlationId);
87
- validLogoutRequest.postLogoutRedirectUri =
88
- UrlString.getAbsoluteUrl(this.config.auth.postLogoutRedirectUri, BrowserUtils.getCurrentUri());
89
- }
90
- else {
91
- this.logger.verbose("Setting postLogoutRedirectUri to current page", validLogoutRequest.correlationId);
92
- validLogoutRequest.postLogoutRedirectUri =
93
- UrlString.getAbsoluteUrl(BrowserUtils.getCurrentUri(), BrowserUtils.getCurrentUri());
94
- }
95
- }
96
- else {
97
- this.logger.verbose("postLogoutRedirectUri passed as null, not setting post logout redirect uri", validLogoutRequest.correlationId);
98
- }
99
- return validLogoutRequest;
100
- }
101
- /**
102
- * Parses login_hint ID Token Claim out of AccountInfo object to be used as
103
- * logout_hint in end session request.
104
- * @param account
105
- */
106
- getLogoutHintFromIdTokenClaims(account) {
107
- const idTokenClaims = account.idTokenClaims;
108
- if (idTokenClaims) {
109
- if (idTokenClaims.login_hint) {
110
- return idTokenClaims.login_hint;
111
- }
112
- else {
113
- this.logger.verbose("The ID Token Claims tied to the provided account do not contain a login_hint claim, logoutHint will not be added to logout request");
114
- }
115
- }
116
- else {
117
- this.logger.verbose("The provided account does not contain ID Token Claims, logoutHint will not be added to logout request");
118
- }
119
- return null;
120
- }
121
- /**
122
- * Creates an Authorization Code Client with the given authority, or the default authority.
123
- * @param serverTelemetryManager
124
- * @param authorityUrl
125
- */
126
- async createAuthCodeClient(serverTelemetryManager, authorityUrl, requestAzureCloudOptions) {
127
- this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, this.correlationId);
128
- // Create auth module.
129
- this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientGetClientConfiguration, this.correlationId);
130
- const clientConfig = await this.getClientConfiguration(serverTelemetryManager, authorityUrl, requestAzureCloudOptions);
131
- return new AuthorizationCodeClient(clientConfig, this.performanceClient);
132
- }
133
- /**
134
- * Creates a Client Configuration object with the given request authority, or the default authority.
135
- * @param serverTelemetryManager
136
- * @param requestAuthority
137
- * @param requestCorrelationId
138
- */
139
- async getClientConfiguration(serverTelemetryManager, requestAuthority, requestAzureCloudOptions) {
140
- this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientGetClientConfiguration, this.correlationId);
141
- this.logger.verbose("getClientConfiguration called", this.correlationId);
142
- this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientGetDiscoveredAuthority, this.correlationId);
143
- const discoveredAuthority = await this.getDiscoveredAuthority(requestAuthority, requestAzureCloudOptions);
144
- const logger = this.config.system.loggerOptions;
145
- return {
146
- authOptions: {
147
- clientId: this.config.auth.clientId,
148
- authority: discoveredAuthority,
149
- clientCapabilities: this.config.auth.clientCapabilities,
150
- },
151
- systemOptions: {
152
- tokenRenewalOffsetSeconds: this.config.system.tokenRenewalOffsetSeconds,
153
- preventCorsPreflight: true,
154
- },
155
- loggerOptions: {
156
- loggerCallback: logger.loggerCallback,
157
- piiLoggingEnabled: logger.piiLoggingEnabled,
158
- logLevel: logger.logLevel,
159
- correlationId: this.correlationId,
160
- },
161
- cryptoInterface: this.browserCrypto,
162
- networkInterface: this.networkClient,
163
- storageInterface: this.browserStorage,
164
- serverTelemetryManager: serverTelemetryManager,
165
- libraryInfo: {
166
- sku: BrowserConstants.MSAL_SKU,
167
- version: version,
168
- cpu: Constants.EMPTY_STRING,
169
- os: Constants.EMPTY_STRING,
170
- },
171
- telemetry: this.config.telemetry,
172
- };
173
- }
174
- /**
175
- * @param hash
176
- * @param interactionType
177
- */
178
- validateAndExtractStateFromHash(serverParams, interactionType, requestCorrelationId) {
179
- this.logger.verbose("validateAndExtractStateFromHash called", requestCorrelationId);
180
- if (!serverParams.state) {
181
- throw BrowserAuthError.createHashDoesNotContainStateError();
182
- }
183
- const platformStateObj = BrowserProtocolUtils.extractBrowserRequestState(this.browserCrypto, serverParams.state);
184
- if (!platformStateObj) {
185
- throw BrowserAuthError.createUnableToParseStateError();
186
- }
187
- if (platformStateObj.interactionType !== interactionType) {
188
- throw BrowserAuthError.createStateInteractionTypeMismatchError();
189
- }
190
- this.logger.verbose("Returning state from hash", requestCorrelationId);
191
- return serverParams.state;
192
- }
193
- /**
194
- * Used to get a discovered version of the default authority.
195
- * @param requestAuthority
196
- * @param requestCorrelationId
197
- */
198
- async getDiscoveredAuthority(requestAuthority, requestAzureCloudOptions) {
199
- this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientGetDiscoveredAuthority, this.correlationId);
200
- this.logger.verbose("getDiscoveredAuthority called", this.correlationId);
201
- const getAuthorityMeasurement = this.performanceClient?.startMeasurement(PerformanceEvents.StandardInteractionClientGetDiscoveredAuthority, this.correlationId);
202
- const authorityOptions = {
203
- protocolMode: this.config.auth.protocolMode,
204
- knownAuthorities: this.config.auth.knownAuthorities,
205
- cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,
206
- authorityMetadata: this.config.auth.authorityMetadata,
207
- skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache,
208
- };
209
- // build authority string based on auth params, precedence - azureCloudInstance + tenant >> authority
210
- const userAuthority = requestAuthority
211
- ? requestAuthority
212
- : this.config.auth.authority;
213
- // fall back to the authority from config
214
- const builtAuthority = Authority.generateAuthority(userAuthority, requestAzureCloudOptions || this.config.auth.azureCloudOptions);
215
- this.logger.verbose("Creating discovered authority with configured authority", this.correlationId);
216
- this.performanceClient.setPreQueueTime(PerformanceEvents.AuthorityFactoryCreateDiscoveredInstance, this.correlationId);
217
- return await AuthorityFactory.createDiscoveredInstance(builtAuthority, this.config.system.networkClient, this.browserStorage, authorityOptions, this.logger, this.performanceClient, this.correlationId)
218
- .then((result) => {
219
- getAuthorityMeasurement.endMeasurement({
220
- success: true,
221
- });
222
- return result;
223
- })
224
- .catch((error) => {
225
- getAuthorityMeasurement.endMeasurement({
226
- errorCode: error.errorCode,
227
- subErrorCode: error.subError,
228
- success: false,
229
- });
230
- throw error;
231
- });
232
- }
233
- /**
234
- * Helper to initialize required request parameters for interactive APIs and ssoSilent()
235
- * @param request
236
- * @param interactionType
237
- */
238
- async initializeAuthorizationRequest(request, interactionType) {
239
- this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientInitializeAuthorizationRequest, this.correlationId);
240
- this.logger.verbose("initializeAuthorizationRequest called", this.correlationId);
241
- const redirectUri = this.getRedirectUri(request.redirectUri);
242
- const browserState = {
243
- interactionType: interactionType,
244
- };
245
- const state = ProtocolUtils.setRequestState(this.browserCrypto, (request && request.state) || Constants.EMPTY_STRING, browserState);
246
- this.performanceClient.setPreQueueTime(PerformanceEvents.InitializeBaseRequest, this.correlationId);
247
- const validatedRequest = {
248
- ...(await this.initializeBaseRequest(request)),
249
- redirectUri: redirectUri,
250
- state: state,
251
- nonce: request.nonce || this.browserCrypto.createNewGuid(),
252
- responseMode: ResponseMode.FRAGMENT,
253
- };
254
- const account = request.account || this.browserStorage.getActiveAccount();
255
- if (account) {
256
- this.logger.verbose("Setting validated request account", this.correlationId);
257
- this.logger.verbosePii(`Setting validated request account: ${account.homeAccountId}`, this.correlationId);
258
- validatedRequest.account = account;
259
- }
260
- // Check for ADAL/MSAL v1 SSO
261
- if (StringUtils.isEmpty(validatedRequest.loginHint) && !account) {
262
- const legacyLoginHint = this.browserStorage.getLegacyLoginHint();
263
- if (legacyLoginHint) {
264
- validatedRequest.loginHint = legacyLoginHint;
265
- }
266
- }
267
- return validatedRequest;
268
- }
11
+ /*
12
+ * Copyright (c) Microsoft Corporation. All rights reserved.
13
+ * Licensed under the MIT License.
14
+ */
15
+ /**
16
+ * Defines the class structure and helper functions used by the "standard", non-brokered auth flows (popup, redirect, silent (RT), silent (iframe))
17
+ */
18
+ class StandardInteractionClient extends BaseInteractionClient {
19
+ /**
20
+ * Generates an auth code request tied to the url request.
21
+ * @param request
22
+ */
23
+ async initializeAuthorizationCodeRequest(request) {
24
+ this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientInitializeAuthorizationCodeRequest, request.correlationId);
25
+ this.logger.verbose("initializeAuthorizationRequest called", request.correlationId);
26
+ const generatedPkceParams = await this.browserCrypto.generatePkceCodes();
27
+ const authCodeRequest = {
28
+ ...request,
29
+ redirectUri: request.redirectUri,
30
+ code: Constants.EMPTY_STRING,
31
+ codeVerifier: generatedPkceParams.verifier,
32
+ };
33
+ request.codeChallenge = generatedPkceParams.challenge;
34
+ request.codeChallengeMethod = Constants.S256_CODE_CHALLENGE_METHOD;
35
+ return authCodeRequest;
36
+ }
37
+ /**
38
+ * Initializer for the logout request.
39
+ * @param logoutRequest
40
+ */
41
+ initializeLogoutRequest(logoutRequest) {
42
+ this.logger.verbose("initializeLogoutRequest called", logoutRequest?.correlationId);
43
+ const validLogoutRequest = {
44
+ correlationId: this.correlationId || this.browserCrypto.createNewGuid(),
45
+ ...logoutRequest,
46
+ };
47
+ /**
48
+ * Set logout_hint to be login_hint from ID Token Claims if present
49
+ * and logoutHint attribute wasn't manually set in logout request
50
+ */
51
+ if (logoutRequest) {
52
+ // If logoutHint isn't set and an account was passed in, try to extract logoutHint from ID Token Claims
53
+ if (!logoutRequest.logoutHint) {
54
+ if (logoutRequest.account) {
55
+ const logoutHint = this.getLogoutHintFromIdTokenClaims(logoutRequest.account);
56
+ if (logoutHint) {
57
+ this.logger.verbose("Setting logoutHint to login_hint ID Token Claim value for the account provided");
58
+ validLogoutRequest.logoutHint = logoutHint;
59
+ }
60
+ }
61
+ else {
62
+ this.logger.verbose("logoutHint was not set and account was not passed into logout request, logoutHint will not be set");
63
+ }
64
+ }
65
+ else {
66
+ this.logger.verbose("logoutHint has already been set in logoutRequest");
67
+ }
68
+ }
69
+ else {
70
+ this.logger.verbose("logoutHint will not be set since no logout request was configured");
71
+ }
72
+ /*
73
+ * Only set redirect uri if logout request isn't provided or the set uri isn't null.
74
+ * Otherwise, use passed uri, config, or current page.
75
+ */
76
+ if (!logoutRequest || logoutRequest.postLogoutRedirectUri !== null) {
77
+ if (logoutRequest && logoutRequest.postLogoutRedirectUri) {
78
+ this.logger.verbose("Setting postLogoutRedirectUri to uri set on logout request", validLogoutRequest.correlationId);
79
+ validLogoutRequest.postLogoutRedirectUri =
80
+ UrlString.getAbsoluteUrl(logoutRequest.postLogoutRedirectUri, BrowserUtils.getCurrentUri());
81
+ }
82
+ else if (this.config.auth.postLogoutRedirectUri === null) {
83
+ this.logger.verbose("postLogoutRedirectUri configured as null and no uri set on request, not passing post logout redirect", validLogoutRequest.correlationId);
84
+ }
85
+ else if (this.config.auth.postLogoutRedirectUri) {
86
+ this.logger.verbose("Setting postLogoutRedirectUri to configured uri", validLogoutRequest.correlationId);
87
+ validLogoutRequest.postLogoutRedirectUri =
88
+ UrlString.getAbsoluteUrl(this.config.auth.postLogoutRedirectUri, BrowserUtils.getCurrentUri());
89
+ }
90
+ else {
91
+ this.logger.verbose("Setting postLogoutRedirectUri to current page", validLogoutRequest.correlationId);
92
+ validLogoutRequest.postLogoutRedirectUri =
93
+ UrlString.getAbsoluteUrl(BrowserUtils.getCurrentUri(), BrowserUtils.getCurrentUri());
94
+ }
95
+ }
96
+ else {
97
+ this.logger.verbose("postLogoutRedirectUri passed as null, not setting post logout redirect uri", validLogoutRequest.correlationId);
98
+ }
99
+ return validLogoutRequest;
100
+ }
101
+ /**
102
+ * Parses login_hint ID Token Claim out of AccountInfo object to be used as
103
+ * logout_hint in end session request.
104
+ * @param account
105
+ */
106
+ getLogoutHintFromIdTokenClaims(account) {
107
+ const idTokenClaims = account.idTokenClaims;
108
+ if (idTokenClaims) {
109
+ if (idTokenClaims.login_hint) {
110
+ return idTokenClaims.login_hint;
111
+ }
112
+ else {
113
+ this.logger.verbose("The ID Token Claims tied to the provided account do not contain a login_hint claim, logoutHint will not be added to logout request");
114
+ }
115
+ }
116
+ else {
117
+ this.logger.verbose("The provided account does not contain ID Token Claims, logoutHint will not be added to logout request");
118
+ }
119
+ return null;
120
+ }
121
+ /**
122
+ * Creates an Authorization Code Client with the given authority, or the default authority.
123
+ * @param serverTelemetryManager
124
+ * @param authorityUrl
125
+ */
126
+ async createAuthCodeClient(serverTelemetryManager, authorityUrl, requestAzureCloudOptions) {
127
+ this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, this.correlationId);
128
+ // Create auth module.
129
+ this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientGetClientConfiguration, this.correlationId);
130
+ const clientConfig = await this.getClientConfiguration(serverTelemetryManager, authorityUrl, requestAzureCloudOptions);
131
+ return new AuthorizationCodeClient(clientConfig, this.performanceClient);
132
+ }
133
+ /**
134
+ * Creates a Client Configuration object with the given request authority, or the default authority.
135
+ * @param serverTelemetryManager
136
+ * @param requestAuthority
137
+ * @param requestCorrelationId
138
+ */
139
+ async getClientConfiguration(serverTelemetryManager, requestAuthority, requestAzureCloudOptions) {
140
+ this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientGetClientConfiguration, this.correlationId);
141
+ this.logger.verbose("getClientConfiguration called", this.correlationId);
142
+ this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientGetDiscoveredAuthority, this.correlationId);
143
+ const discoveredAuthority = await this.getDiscoveredAuthority(requestAuthority, requestAzureCloudOptions);
144
+ const logger = this.config.system.loggerOptions;
145
+ return {
146
+ authOptions: {
147
+ clientId: this.config.auth.clientId,
148
+ authority: discoveredAuthority,
149
+ clientCapabilities: this.config.auth.clientCapabilities,
150
+ },
151
+ systemOptions: {
152
+ tokenRenewalOffsetSeconds: this.config.system.tokenRenewalOffsetSeconds,
153
+ preventCorsPreflight: true,
154
+ },
155
+ loggerOptions: {
156
+ loggerCallback: logger.loggerCallback,
157
+ piiLoggingEnabled: logger.piiLoggingEnabled,
158
+ logLevel: logger.logLevel,
159
+ correlationId: this.correlationId,
160
+ },
161
+ cryptoInterface: this.browserCrypto,
162
+ networkInterface: this.networkClient,
163
+ storageInterface: this.browserStorage,
164
+ serverTelemetryManager: serverTelemetryManager,
165
+ libraryInfo: {
166
+ sku: BrowserConstants.MSAL_SKU,
167
+ version: version,
168
+ cpu: Constants.EMPTY_STRING,
169
+ os: Constants.EMPTY_STRING,
170
+ },
171
+ telemetry: this.config.telemetry,
172
+ };
173
+ }
174
+ /**
175
+ * @param hash
176
+ * @param interactionType
177
+ */
178
+ validateAndExtractStateFromHash(serverParams, interactionType, requestCorrelationId) {
179
+ this.logger.verbose("validateAndExtractStateFromHash called", requestCorrelationId);
180
+ if (!serverParams.state) {
181
+ throw BrowserAuthError.createHashDoesNotContainStateError();
182
+ }
183
+ const platformStateObj = BrowserProtocolUtils.extractBrowserRequestState(this.browserCrypto, serverParams.state);
184
+ if (!platformStateObj) {
185
+ throw BrowserAuthError.createUnableToParseStateError();
186
+ }
187
+ if (platformStateObj.interactionType !== interactionType) {
188
+ throw BrowserAuthError.createStateInteractionTypeMismatchError();
189
+ }
190
+ this.logger.verbose("Returning state from hash", requestCorrelationId);
191
+ return serverParams.state;
192
+ }
193
+ /**
194
+ * Used to get a discovered version of the default authority.
195
+ * @param requestAuthority
196
+ * @param requestCorrelationId
197
+ */
198
+ async getDiscoveredAuthority(requestAuthority, requestAzureCloudOptions) {
199
+ this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientGetDiscoveredAuthority, this.correlationId);
200
+ this.logger.verbose("getDiscoveredAuthority called", this.correlationId);
201
+ const getAuthorityMeasurement = this.performanceClient?.startMeasurement(PerformanceEvents.StandardInteractionClientGetDiscoveredAuthority, this.correlationId);
202
+ const authorityOptions = {
203
+ protocolMode: this.config.auth.protocolMode,
204
+ knownAuthorities: this.config.auth.knownAuthorities,
205
+ cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,
206
+ authorityMetadata: this.config.auth.authorityMetadata,
207
+ skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache,
208
+ };
209
+ // build authority string based on auth params, precedence - azureCloudInstance + tenant >> authority
210
+ const userAuthority = requestAuthority
211
+ ? requestAuthority
212
+ : this.config.auth.authority;
213
+ // fall back to the authority from config
214
+ const builtAuthority = Authority.generateAuthority(userAuthority, requestAzureCloudOptions || this.config.auth.azureCloudOptions);
215
+ this.logger.verbose("Creating discovered authority with configured authority", this.correlationId);
216
+ this.performanceClient.setPreQueueTime(PerformanceEvents.AuthorityFactoryCreateDiscoveredInstance, this.correlationId);
217
+ return await AuthorityFactory.createDiscoveredInstance(builtAuthority, this.config.system.networkClient, this.browserStorage, authorityOptions, this.logger, this.performanceClient, this.correlationId)
218
+ .then((result) => {
219
+ getAuthorityMeasurement.endMeasurement({
220
+ success: true,
221
+ });
222
+ return result;
223
+ })
224
+ .catch((error) => {
225
+ getAuthorityMeasurement.endMeasurement({
226
+ errorCode: error.errorCode,
227
+ subErrorCode: error.subError,
228
+ success: false,
229
+ });
230
+ throw error;
231
+ });
232
+ }
233
+ /**
234
+ * Helper to initialize required request parameters for interactive APIs and ssoSilent()
235
+ * @param request
236
+ * @param interactionType
237
+ */
238
+ async initializeAuthorizationRequest(request, interactionType) {
239
+ this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientInitializeAuthorizationRequest, this.correlationId);
240
+ this.logger.verbose("initializeAuthorizationRequest called", this.correlationId);
241
+ const redirectUri = this.getRedirectUri(request.redirectUri);
242
+ const browserState = {
243
+ interactionType: interactionType,
244
+ };
245
+ const state = ProtocolUtils.setRequestState(this.browserCrypto, (request && request.state) || Constants.EMPTY_STRING, browserState);
246
+ this.performanceClient.setPreQueueTime(PerformanceEvents.InitializeBaseRequest, this.correlationId);
247
+ const validatedRequest = {
248
+ ...(await this.initializeBaseRequest(request)),
249
+ redirectUri: redirectUri,
250
+ state: state,
251
+ nonce: request.nonce || this.browserCrypto.createNewGuid(),
252
+ responseMode: ResponseMode.FRAGMENT,
253
+ };
254
+ const account = request.account || this.browserStorage.getActiveAccount();
255
+ if (account) {
256
+ this.logger.verbose("Setting validated request account", this.correlationId);
257
+ this.logger.verbosePii(`Setting validated request account: ${account.homeAccountId}`, this.correlationId);
258
+ validatedRequest.account = account;
259
+ }
260
+ // Check for ADAL/MSAL v1 SSO
261
+ if (StringUtils.isEmpty(validatedRequest.loginHint) && !account) {
262
+ const legacyLoginHint = this.browserStorage.getLegacyLoginHint();
263
+ if (legacyLoginHint) {
264
+ validatedRequest.loginHint = legacyLoginHint;
265
+ }
266
+ }
267
+ return validatedRequest;
268
+ }
269
269
  }
270
270
 
271
271
  export { StandardInteractionClient };
@@ -1,40 +1,40 @@
1
- import { AuthorizationCodePayload, CommonAuthorizationCodeRequest, AuthenticationResult, AuthorizationCodeClient, Authority, INetworkModule, CcsCredential, Logger, IPerformanceClient } from "@azure/msal-common";
2
- import { BrowserCacheManager } from "../cache/BrowserCacheManager";
3
- export type InteractionParams = {};
4
- /**
5
- * Abstract class which defines operations for a browser interaction handling class.
6
- */
7
- export declare class InteractionHandler {
8
- protected authModule: AuthorizationCodeClient;
9
- protected browserStorage: BrowserCacheManager;
10
- protected authCodeRequest: CommonAuthorizationCodeRequest;
11
- protected logger: Logger;
12
- protected performanceClient: IPerformanceClient;
13
- constructor(authCodeModule: AuthorizationCodeClient, storageImpl: BrowserCacheManager, authCodeRequest: CommonAuthorizationCodeRequest, logger: Logger, performanceClient: IPerformanceClient);
14
- /**
15
- * Function to handle response parameters from hash.
16
- * @param locationHash
17
- */
18
- handleCodeResponseFromHash(locationHash: string, state: string, authority: Authority, networkModule: INetworkModule): Promise<AuthenticationResult>;
19
- /**
20
- * Process auth code response from AAD
21
- * @param authCodeResponse
22
- * @param state
23
- * @param authority
24
- * @param networkModule
25
- * @returns
26
- */
27
- handleCodeResponseFromServer(authCodeResponse: AuthorizationCodePayload, state: string, authority: Authority, networkModule: INetworkModule, validateNonce?: boolean): Promise<AuthenticationResult>;
28
- /**
29
- * Updates authority based on cloudInstanceHostname
30
- * @param cloudInstanceHostname
31
- * @param authority
32
- * @param networkModule
33
- */
34
- protected updateTokenEndpointAuthority(cloudInstanceHostname: string, authority: Authority, networkModule: INetworkModule): Promise<void>;
35
- /**
36
- * Looks up ccs creds in the cache
37
- */
38
- protected checkCcsCredentials(): CcsCredential | null;
39
- }
1
+ import { AuthorizationCodePayload, CommonAuthorizationCodeRequest, AuthenticationResult, AuthorizationCodeClient, Authority, INetworkModule, CcsCredential, Logger, IPerformanceClient } from "@azure/msal-common";
2
+ import { BrowserCacheManager } from "../cache/BrowserCacheManager";
3
+ export type InteractionParams = {};
4
+ /**
5
+ * Abstract class which defines operations for a browser interaction handling class.
6
+ */
7
+ export declare class InteractionHandler {
8
+ protected authModule: AuthorizationCodeClient;
9
+ protected browserStorage: BrowserCacheManager;
10
+ protected authCodeRequest: CommonAuthorizationCodeRequest;
11
+ protected logger: Logger;
12
+ protected performanceClient: IPerformanceClient;
13
+ constructor(authCodeModule: AuthorizationCodeClient, storageImpl: BrowserCacheManager, authCodeRequest: CommonAuthorizationCodeRequest, logger: Logger, performanceClient: IPerformanceClient);
14
+ /**
15
+ * Function to handle response parameters from hash.
16
+ * @param locationHash
17
+ */
18
+ handleCodeResponseFromHash(locationHash: string, state: string, authority: Authority, networkModule: INetworkModule): Promise<AuthenticationResult>;
19
+ /**
20
+ * Process auth code response from AAD
21
+ * @param authCodeResponse
22
+ * @param state
23
+ * @param authority
24
+ * @param networkModule
25
+ * @returns
26
+ */
27
+ handleCodeResponseFromServer(authCodeResponse: AuthorizationCodePayload, state: string, authority: Authority, networkModule: INetworkModule, validateNonce?: boolean): Promise<AuthenticationResult>;
28
+ /**
29
+ * Updates authority based on cloudInstanceHostname
30
+ * @param cloudInstanceHostname
31
+ * @param authority
32
+ * @param networkModule
33
+ */
34
+ protected updateTokenEndpointAuthority(cloudInstanceHostname: string, authority: Authority, networkModule: INetworkModule): Promise<void>;
35
+ /**
36
+ * Looks up ccs creds in the cache
37
+ */
38
+ protected checkCcsCredentials(): CcsCredential | null;
39
+ }
40
40
  //# sourceMappingURL=InteractionHandler.d.ts.map