@azure/msal-browser 3.0.0-alpha.1 → 3.0.0-alpha.2

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 (142) 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 +377 -377
  14. package/dist/cache/BrowserCacheManager.js +1276 -1276
  15. package/dist/cache/BrowserStorage.d.ts +11 -11
  16. package/dist/cache/BrowserStorage.js +35 -35
  17. package/dist/cache/CryptoKeyStore.d.ts +17 -17
  18. package/dist/cache/CryptoKeyStore.js +41 -41
  19. package/dist/cache/DatabaseStorage.d.ts +56 -56
  20. package/dist/cache/DatabaseStorage.js +190 -190
  21. package/dist/cache/IAsyncMemoryStorage.d.ts +27 -27
  22. package/dist/cache/ITokenCache.d.ts +10 -10
  23. package/dist/cache/IWindowStorage.d.ts +27 -27
  24. package/dist/cache/MemoryStorage.d.ts +11 -11
  25. package/dist/cache/MemoryStorage.js +31 -31
  26. package/dist/cache/TokenCache.d.ts +76 -76
  27. package/dist/cache/TokenCache.js +225 -225
  28. package/dist/config/Configuration.d.ts +203 -203
  29. package/dist/config/Configuration.js +101 -101
  30. package/dist/controllers/ControllerFactory.d.ts +9 -9
  31. package/dist/controllers/ControllerFactory.js +37 -37
  32. package/dist/controllers/IController.d.ts +66 -66
  33. package/dist/controllers/StandardController.d.ts +413 -413
  34. package/dist/controllers/StandardController.js +1272 -1272
  35. package/dist/crypto/BrowserCrypto.d.ts +61 -61
  36. package/dist/crypto/BrowserCrypto.js +131 -131
  37. package/dist/crypto/CryptoOps.d.ts +73 -73
  38. package/dist/crypto/CryptoOps.js +150 -150
  39. package/dist/crypto/GuidGenerator.d.ts +12 -12
  40. package/dist/crypto/GuidGenerator.js +96 -96
  41. package/dist/crypto/ISubtleCrypto.d.ts +9 -9
  42. package/dist/crypto/ModernBrowserCrypto.d.ts +9 -9
  43. package/dist/crypto/ModernBrowserCrypto.js +24 -24
  44. package/dist/crypto/MsBrowserCrypto.d.ts +9 -9
  45. package/dist/crypto/MsBrowserCrypto.js +79 -79
  46. package/dist/crypto/MsrBrowserCrypto.d.ts +17 -17
  47. package/dist/crypto/MsrBrowserCrypto.js +28 -28
  48. package/dist/crypto/PkceGenerator.d.ts +24 -24
  49. package/dist/crypto/PkceGenerator.js +58 -58
  50. package/dist/crypto/SignedHttpRequest.d.ts +30 -30
  51. package/dist/crypto/SignedHttpRequest.js +39 -39
  52. package/dist/encode/Base64Decode.d.ts +22 -22
  53. package/dist/encode/Base64Decode.js +73 -73
  54. package/dist/encode/Base64Encode.d.ts +31 -31
  55. package/dist/encode/Base64Encode.js +79 -79
  56. package/dist/error/BrowserAuthError.d.ts +382 -382
  57. package/dist/error/BrowserAuthError.js +483 -483
  58. package/dist/error/BrowserConfigurationAuthError.d.ts +70 -70
  59. package/dist/error/BrowserConfigurationAuthError.js +96 -96
  60. package/dist/error/NativeAuthError.d.ts +56 -56
  61. package/dist/error/NativeAuthError.js +88 -88
  62. package/dist/event/EventHandler.d.ts +41 -41
  63. package/dist/event/EventHandler.js +119 -119
  64. package/dist/event/EventMessage.d.ts +25 -25
  65. package/dist/event/EventMessage.js +67 -67
  66. package/dist/event/EventType.d.ts +26 -26
  67. package/dist/event/EventType.js +31 -31
  68. package/dist/index.d.ts +35 -35
  69. package/dist/index.js +1 -1
  70. package/dist/interaction_client/BaseInteractionClient.d.ts +52 -52
  71. package/dist/interaction_client/BaseInteractionClient.js +138 -138
  72. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.d.ts +4 -4
  73. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.js +10 -10
  74. package/dist/interaction_client/NativeInteractionClient.d.ts +148 -148
  75. package/dist/interaction_client/NativeInteractionClient.js +516 -516
  76. package/dist/interaction_client/PopupClient.d.ts +111 -111
  77. package/dist/interaction_client/PopupClient.js +476 -476
  78. package/dist/interaction_client/RedirectClient.d.ts +48 -48
  79. package/dist/interaction_client/RedirectClient.js +290 -290
  80. package/dist/interaction_client/SilentAuthCodeClient.d.ts +22 -22
  81. package/dist/interaction_client/SilentAuthCodeClient.js +62 -62
  82. package/dist/interaction_client/SilentCacheClient.d.ts +21 -21
  83. package/dist/interaction_client/SilentCacheClient.js +67 -67
  84. package/dist/interaction_client/SilentIframeClient.d.ts +31 -31
  85. package/dist/interaction_client/SilentIframeClient.js +127 -127
  86. package/dist/interaction_client/SilentRefreshClient.d.ts +19 -19
  87. package/dist/interaction_client/SilentRefreshClient.js +62 -62
  88. package/dist/interaction_client/StandardInteractionClient.d.ts +59 -59
  89. package/dist/interaction_client/StandardInteractionClient.js +259 -259
  90. package/dist/interaction_handler/InteractionHandler.d.ts +39 -39
  91. package/dist/interaction_handler/InteractionHandler.js +127 -127
  92. package/dist/interaction_handler/RedirectHandler.d.ts +24 -24
  93. package/dist/interaction_handler/RedirectHandler.js +118 -118
  94. package/dist/interaction_handler/SilentHandler.d.ts +47 -47
  95. package/dist/interaction_handler/SilentHandler.js +162 -162
  96. package/dist/internals.d.ts +23 -23
  97. package/dist/internals.js +4 -4
  98. package/dist/navigation/INavigationClient.d.ts +16 -16
  99. package/dist/navigation/NavigationClient.d.ts +22 -22
  100. package/dist/navigation/NavigationClient.js +40 -40
  101. package/dist/navigation/NavigationOptions.d.ts +12 -12
  102. package/dist/network/FetchClient.d.ts +26 -26
  103. package/dist/network/FetchClient.js +99 -99
  104. package/dist/network/XhrClient.d.ts +40 -40
  105. package/dist/network/XhrClient.js +117 -117
  106. package/dist/operatingcontext/BaseOperatingContext.d.ts +40 -40
  107. package/dist/operatingcontext/BaseOperatingContext.js +44 -44
  108. package/dist/operatingcontext/StandardOperatingContext.d.ts +25 -25
  109. package/dist/operatingcontext/StandardOperatingContext.js +43 -43
  110. package/dist/operatingcontext/TeamsAppOperatingContext.d.ts +25 -25
  111. package/dist/operatingcontext/TeamsAppOperatingContext.js +42 -42
  112. package/dist/packageMetadata.d.ts +2 -2
  113. package/dist/packageMetadata.js +4 -4
  114. package/dist/request/AuthorizationCodeRequest.d.ts +8 -8
  115. package/dist/request/AuthorizationUrlRequest.d.ts +8 -8
  116. package/dist/request/EndSessionPopupRequest.d.ts +18 -18
  117. package/dist/request/EndSessionRequest.d.ts +15 -15
  118. package/dist/request/PopupRequest.d.ts +32 -32
  119. package/dist/request/PopupWindowAttributes.d.ts +15 -15
  120. package/dist/request/RedirectRequest.d.ts +33 -33
  121. package/dist/request/SilentRequest.d.ts +30 -30
  122. package/dist/request/SsoSilentRequest.d.ts +26 -26
  123. package/dist/telemetry/BrowserPerformanceClient.d.ts +38 -38
  124. package/dist/telemetry/BrowserPerformanceClient.js +124 -124
  125. package/dist/telemetry/BrowserPerformanceMeasurement.d.ts +21 -21
  126. package/dist/telemetry/BrowserPerformanceMeasurement.js +92 -92
  127. package/dist/utils/BrowserConstants.d.ts +166 -166
  128. package/dist/utils/BrowserConstants.js +214 -214
  129. package/dist/utils/BrowserProtocolUtils.d.ts +18 -18
  130. package/dist/utils/BrowserProtocolUtils.js +34 -34
  131. package/dist/utils/BrowserStringUtils.d.ts +26 -26
  132. package/dist/utils/BrowserStringUtils.js +149 -149
  133. package/dist/utils/BrowserUtils.d.ts +65 -65
  134. package/dist/utils/BrowserUtils.js +138 -138
  135. package/dist/utils/MathUtils.d.ts +11 -11
  136. package/dist/utils/MathUtils.js +21 -21
  137. package/lib/msal-browser.cjs.js +18383 -0
  138. package/lib/msal-browser.cjs.js.map +1 -0
  139. package/lib/msal-browser.js +18389 -0
  140. package/lib/msal-browser.js.map +1 -0
  141. package/lib/msal-browser.min.js +74 -0
  142. package/package.json +97 -95
@@ -1,4 +1,4 @@
1
- /*! @azure/msal-browser v3.0.0-alpha.1 2023-05-08 */
1
+ /*! @azure/msal-browser v3.0.0-alpha.2 2023-05-17 */
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