@azure/msal-common 14.4.1-beta.0 → 14.5.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 (287) hide show
  1. package/dist/account/AccountInfo.d.ts +58 -31
  2. package/dist/account/AccountInfo.d.ts.map +1 -1
  3. package/dist/account/AccountInfo.mjs +64 -0
  4. package/dist/account/AccountInfo.mjs.map +1 -0
  5. package/dist/account/AuthToken.d.ts +17 -17
  6. package/dist/account/AuthToken.mjs +58 -58
  7. package/dist/account/AuthToken.mjs.map +1 -1
  8. package/dist/account/CcsCredential.d.ts +9 -9
  9. package/dist/account/CcsCredential.mjs +8 -8
  10. package/dist/account/CcsCredential.mjs.map +1 -1
  11. package/dist/account/ClientCredentials.d.ts +14 -14
  12. package/dist/account/ClientInfo.d.ts +18 -19
  13. package/dist/account/ClientInfo.d.ts.map +1 -1
  14. package/dist/account/ClientInfo.mjs +37 -37
  15. package/dist/account/ClientInfo.mjs.map +1 -1
  16. package/dist/account/TokenClaims.d.ts +83 -65
  17. package/dist/account/TokenClaims.d.ts.map +1 -1
  18. package/dist/account/TokenClaims.mjs +25 -0
  19. package/dist/account/TokenClaims.mjs.map +1 -0
  20. package/dist/authority/Authority.d.ts +253 -249
  21. package/dist/authority/Authority.d.ts.map +1 -1
  22. package/dist/authority/Authority.mjs +812 -789
  23. package/dist/authority/Authority.mjs.map +1 -1
  24. package/dist/authority/AuthorityFactory.d.ts +31 -31
  25. package/dist/authority/AuthorityFactory.mjs +47 -47
  26. package/dist/authority/AuthorityFactory.mjs.map +1 -1
  27. package/dist/authority/AuthorityMetadata.d.ts +503 -503
  28. package/dist/authority/AuthorityMetadata.mjs +603 -603
  29. package/dist/authority/AuthorityMetadata.mjs.map +1 -1
  30. package/dist/authority/AuthorityOptions.d.ts +27 -27
  31. package/dist/authority/AuthorityOptions.mjs +18 -18
  32. package/dist/authority/AuthorityOptions.mjs.map +1 -1
  33. package/dist/authority/AuthorityType.d.ts +10 -10
  34. package/dist/authority/AuthorityType.mjs +13 -13
  35. package/dist/authority/AuthorityType.mjs.map +1 -1
  36. package/dist/authority/AzureRegion.d.ts +1 -1
  37. package/dist/authority/AzureRegionConfiguration.d.ts +5 -5
  38. package/dist/authority/CloudDiscoveryMetadata.d.ts +5 -5
  39. package/dist/authority/CloudInstanceDiscoveryErrorResponse.d.ts +13 -13
  40. package/dist/authority/CloudInstanceDiscoveryErrorResponse.mjs +8 -8
  41. package/dist/authority/CloudInstanceDiscoveryErrorResponse.mjs.map +1 -1
  42. package/dist/authority/CloudInstanceDiscoveryResponse.d.ts +9 -9
  43. package/dist/authority/CloudInstanceDiscoveryResponse.mjs +8 -8
  44. package/dist/authority/CloudInstanceDiscoveryResponse.mjs.map +1 -1
  45. package/dist/authority/ImdsOptions.d.ts +5 -5
  46. package/dist/authority/OIDCOptions.d.ts +8 -8
  47. package/dist/authority/OpenIdConfigResponse.d.ts +11 -11
  48. package/dist/authority/OpenIdConfigResponse.mjs +10 -10
  49. package/dist/authority/OpenIdConfigResponse.mjs.map +1 -1
  50. package/dist/authority/ProtocolMode.d.ts +8 -8
  51. package/dist/authority/ProtocolMode.mjs +11 -11
  52. package/dist/authority/ProtocolMode.mjs.map +1 -1
  53. package/dist/authority/RegionDiscovery.d.ts +32 -32
  54. package/dist/authority/RegionDiscovery.mjs +106 -106
  55. package/dist/authority/RegionDiscovery.mjs.map +1 -1
  56. package/dist/authority/RegionDiscoveryMetadata.d.ts +6 -6
  57. package/dist/broker/nativeBroker/INativeBrokerPlugin.d.ts +15 -15
  58. package/dist/cache/CacheManager.d.ts +517 -485
  59. package/dist/cache/CacheManager.d.ts.map +1 -1
  60. package/dist/cache/CacheManager.mjs +1264 -1102
  61. package/dist/cache/CacheManager.mjs.map +1 -1
  62. package/dist/cache/entities/AccessTokenEntity.d.ts +25 -25
  63. package/dist/cache/entities/AccountEntity.d.ts +106 -101
  64. package/dist/cache/entities/AccountEntity.d.ts.map +1 -1
  65. package/dist/cache/entities/AccountEntity.mjs +247 -219
  66. package/dist/cache/entities/AccountEntity.mjs.map +1 -1
  67. package/dist/cache/entities/AppMetadataEntity.d.ts +39 -39
  68. package/dist/cache/entities/AppMetadataEntity.mjs +66 -66
  69. package/dist/cache/entities/AppMetadataEntity.mjs.map +1 -1
  70. package/dist/cache/entities/AuthorityMetadataEntity.d.ts +48 -48
  71. package/dist/cache/entities/AuthorityMetadataEntity.mjs +78 -78
  72. package/dist/cache/entities/AuthorityMetadataEntity.mjs.map +1 -1
  73. package/dist/cache/entities/CacheRecord.d.ts +14 -14
  74. package/dist/cache/entities/CacheRecord.mjs +14 -14
  75. package/dist/cache/entities/CacheRecord.mjs.map +1 -1
  76. package/dist/cache/entities/CredentialEntity.d.ts +30 -30
  77. package/dist/cache/entities/IdTokenEntity.d.ts +8 -8
  78. package/dist/cache/entities/RefreshTokenEntity.d.ts +5 -7
  79. package/dist/cache/entities/RefreshTokenEntity.d.ts.map +1 -1
  80. package/dist/cache/entities/ServerTelemetryEntity.d.ts +5 -5
  81. package/dist/cache/entities/ThrottlingEntity.d.ts +13 -13
  82. package/dist/cache/entities/ThrottlingEntity.mjs +23 -23
  83. package/dist/cache/entities/ThrottlingEntity.mjs.map +1 -1
  84. package/dist/cache/interface/ICacheManager.d.ts +166 -166
  85. package/dist/cache/interface/ICachePlugin.d.ts +5 -5
  86. package/dist/cache/interface/ISerializableTokenCache.d.ts +4 -4
  87. package/dist/cache/persistence/TokenCacheContext.d.ts +23 -23
  88. package/dist/cache/persistence/TokenCacheContext.mjs +25 -25
  89. package/dist/cache/persistence/TokenCacheContext.mjs.map +1 -1
  90. package/dist/cache/utils/CacheHelpers.d.ts +64 -64
  91. package/dist/cache/utils/CacheHelpers.d.ts.map +1 -1
  92. package/dist/cache/utils/CacheHelpers.mjs +231 -234
  93. package/dist/cache/utils/CacheHelpers.mjs.map +1 -1
  94. package/dist/cache/utils/CacheTypes.d.ts +69 -67
  95. package/dist/cache/utils/CacheTypes.d.ts.map +1 -1
  96. package/dist/client/AuthorizationCodeClient.d.ts +74 -74
  97. package/dist/client/AuthorizationCodeClient.d.ts.map +1 -1
  98. package/dist/client/AuthorizationCodeClient.mjs +404 -403
  99. package/dist/client/AuthorizationCodeClient.mjs.map +1 -1
  100. package/dist/client/BaseClient.d.ts +51 -51
  101. package/dist/client/BaseClient.mjs +100 -100
  102. package/dist/client/BaseClient.mjs.map +1 -1
  103. package/dist/client/RefreshTokenClient.d.ts +35 -35
  104. package/dist/client/RefreshTokenClient.d.ts.map +1 -1
  105. package/dist/client/RefreshTokenClient.mjs +189 -194
  106. package/dist/client/RefreshTokenClient.mjs.map +1 -1
  107. package/dist/client/SilentFlowClient.d.ts +27 -27
  108. package/dist/client/SilentFlowClient.mjs +118 -118
  109. package/dist/client/SilentFlowClient.mjs.map +1 -1
  110. package/dist/config/AppTokenProvider.d.ts +38 -38
  111. package/dist/config/ClientConfiguration.d.ts +150 -150
  112. package/dist/config/ClientConfiguration.mjs +97 -97
  113. package/dist/config/ClientConfiguration.mjs.map +1 -1
  114. package/dist/constants/AADServerParamKeys.d.ts +52 -0
  115. package/dist/constants/AADServerParamKeys.d.ts.map +1 -0
  116. package/dist/constants/AADServerParamKeys.mjs +60 -0
  117. package/dist/constants/AADServerParamKeys.mjs.map +1 -0
  118. package/dist/crypto/ICrypto.d.ts +58 -58
  119. package/dist/crypto/ICrypto.mjs +30 -30
  120. package/dist/crypto/ICrypto.mjs.map +1 -1
  121. package/dist/crypto/IGuidGenerator.d.ts +4 -4
  122. package/dist/crypto/JoseHeader.d.ts +22 -22
  123. package/dist/crypto/JoseHeader.mjs +37 -37
  124. package/dist/crypto/JoseHeader.mjs.map +1 -1
  125. package/dist/crypto/PopTokenGenerator.d.ts +60 -60
  126. package/dist/crypto/PopTokenGenerator.mjs +82 -82
  127. package/dist/crypto/PopTokenGenerator.mjs.map +1 -1
  128. package/dist/crypto/SignedHttpRequest.d.ts +15 -15
  129. package/dist/error/AuthError.d.ts +44 -44
  130. package/dist/error/AuthError.mjs +46 -46
  131. package/dist/error/AuthError.mjs.map +1 -1
  132. package/dist/error/AuthErrorCodes.d.ts +5 -5
  133. package/dist/error/AuthErrorCodes.mjs +9 -9
  134. package/dist/error/AuthErrorCodes.mjs.map +1 -1
  135. package/dist/error/ClientAuthError.d.ts +237 -237
  136. package/dist/error/ClientAuthError.mjs +249 -249
  137. package/dist/error/ClientAuthError.mjs.map +1 -1
  138. package/dist/error/ClientAuthErrorCodes.d.ts +44 -44
  139. package/dist/error/ClientAuthErrorCodes.mjs +48 -48
  140. package/dist/error/ClientAuthErrorCodes.mjs.map +1 -1
  141. package/dist/error/ClientConfigurationError.d.ts +128 -128
  142. package/dist/error/ClientConfigurationError.mjs +135 -135
  143. package/dist/error/ClientConfigurationError.mjs.map +1 -1
  144. package/dist/error/ClientConfigurationErrorCodes.d.ts +22 -22
  145. package/dist/error/ClientConfigurationErrorCodes.mjs +26 -26
  146. package/dist/error/ClientConfigurationErrorCodes.mjs.map +1 -1
  147. package/dist/error/InteractionRequiredAuthError.d.ts +57 -57
  148. package/dist/error/InteractionRequiredAuthError.d.ts.map +1 -1
  149. package/dist/error/InteractionRequiredAuthError.mjs +77 -78
  150. package/dist/error/InteractionRequiredAuthError.mjs.map +1 -1
  151. package/dist/error/InteractionRequiredAuthErrorCodes.d.ts +5 -6
  152. package/dist/error/InteractionRequiredAuthErrorCodes.d.ts.map +1 -1
  153. package/dist/error/InteractionRequiredAuthErrorCodes.mjs +12 -13
  154. package/dist/error/InteractionRequiredAuthErrorCodes.mjs.map +1 -1
  155. package/dist/error/JoseHeaderError.d.ts +15 -15
  156. package/dist/error/JoseHeaderError.mjs +22 -22
  157. package/dist/error/JoseHeaderError.mjs.map +1 -1
  158. package/dist/error/JoseHeaderErrorCodes.d.ts +2 -2
  159. package/dist/error/JoseHeaderErrorCodes.mjs +6 -6
  160. package/dist/error/JoseHeaderErrorCodes.mjs.map +1 -1
  161. package/dist/error/ServerError.d.ts +7 -7
  162. package/dist/error/ServerError.mjs +14 -14
  163. package/dist/error/ServerError.mjs.map +1 -1
  164. package/dist/index.cjs +8645 -8295
  165. package/dist/index.cjs.map +1 -1
  166. package/dist/index.d.ts +99 -98
  167. package/dist/index.d.ts.map +1 -1
  168. package/dist/index.mjs +7 -3
  169. package/dist/index.mjs.map +1 -1
  170. package/dist/logger/Logger.d.ts +95 -95
  171. package/dist/logger/Logger.mjs +188 -188
  172. package/dist/logger/Logger.mjs.map +1 -1
  173. package/dist/network/INetworkModule.d.ts +29 -29
  174. package/dist/network/INetworkModule.mjs +12 -12
  175. package/dist/network/INetworkModule.mjs.map +1 -1
  176. package/dist/network/NetworkManager.d.ts +33 -33
  177. package/dist/network/NetworkManager.mjs +34 -34
  178. package/dist/network/NetworkManager.mjs.map +1 -1
  179. package/dist/network/RequestThumbprint.d.ts +18 -18
  180. package/dist/network/ThrottlingUtils.d.ts +42 -42
  181. package/dist/network/ThrottlingUtils.mjs +95 -95
  182. package/dist/network/ThrottlingUtils.mjs.map +1 -1
  183. package/dist/packageMetadata.d.ts +2 -2
  184. package/dist/packageMetadata.mjs +4 -4
  185. package/dist/packageMetadata.mjs.map +1 -1
  186. package/dist/request/AuthenticationHeaderParser.d.ts +19 -19
  187. package/dist/request/AuthenticationHeaderParser.mjs +55 -55
  188. package/dist/request/AuthenticationHeaderParser.mjs.map +1 -1
  189. package/dist/request/BaseAuthRequest.d.ts +43 -43
  190. package/dist/request/CommonAuthorizationCodeRequest.d.ts +27 -27
  191. package/dist/request/CommonAuthorizationUrlRequest.d.ts +50 -50
  192. package/dist/request/CommonClientCredentialRequest.d.ts +17 -17
  193. package/dist/request/CommonDeviceCodeRequest.d.ts +21 -21
  194. package/dist/request/CommonEndSessionRequest.d.ts +21 -21
  195. package/dist/request/CommonOnBehalfOfRequest.d.ts +13 -13
  196. package/dist/request/CommonRefreshTokenRequest.d.ts +22 -23
  197. package/dist/request/CommonRefreshTokenRequest.d.ts.map +1 -1
  198. package/dist/request/CommonSilentFlowRequest.d.ts +20 -21
  199. package/dist/request/CommonSilentFlowRequest.d.ts.map +1 -1
  200. package/dist/request/CommonUsernamePasswordRequest.d.ts +17 -17
  201. package/dist/request/NativeRequest.d.ts +19 -19
  202. package/dist/request/NativeSignOutRequest.d.ts +5 -5
  203. package/dist/request/RequestParameterBuilder.d.ts +217 -217
  204. package/dist/request/RequestParameterBuilder.d.ts.map +1 -1
  205. package/dist/request/RequestParameterBuilder.mjs +383 -382
  206. package/dist/request/RequestParameterBuilder.mjs.map +1 -1
  207. package/dist/request/RequestValidator.d.ts +33 -33
  208. package/dist/request/RequestValidator.mjs +81 -81
  209. package/dist/request/RequestValidator.mjs.map +1 -1
  210. package/dist/request/ScopeSet.d.ts +88 -88
  211. package/dist/request/ScopeSet.mjs +197 -197
  212. package/dist/request/ScopeSet.mjs.map +1 -1
  213. package/dist/request/StoreInCache.d.ts +8 -8
  214. package/dist/response/AuthenticationResult.d.ts +41 -41
  215. package/dist/response/AuthorizationCodePayload.d.ts +13 -13
  216. package/dist/response/DeviceCodeResponse.d.ts +25 -25
  217. package/dist/response/ExternalTokenResponse.d.ts +15 -15
  218. package/dist/response/IMDSBadResponse.d.ts +4 -4
  219. package/dist/response/ResponseHandler.d.ts +69 -67
  220. package/dist/response/ResponseHandler.d.ts.map +1 -1
  221. package/dist/response/ResponseHandler.mjs +339 -313
  222. package/dist/response/ResponseHandler.mjs.map +1 -1
  223. package/dist/response/ServerAuthorizationCodeResponse.d.ts +25 -25
  224. package/dist/response/ServerAuthorizationTokenResponse.d.ts +46 -46
  225. package/dist/telemetry/performance/IPerformanceClient.d.ts +51 -51
  226. package/dist/telemetry/performance/IPerformanceMeasurement.d.ts +5 -5
  227. package/dist/telemetry/performance/PerformanceClient.d.ts +191 -191
  228. package/dist/telemetry/performance/PerformanceClient.mjs +409 -409
  229. package/dist/telemetry/performance/PerformanceClient.mjs.map +1 -1
  230. package/dist/telemetry/performance/PerformanceEvent.d.ts +464 -464
  231. package/dist/telemetry/performance/PerformanceEvent.mjs +253 -253
  232. package/dist/telemetry/performance/PerformanceEvent.mjs.map +1 -1
  233. package/dist/telemetry/performance/StubPerformanceClient.d.ts +24 -24
  234. package/dist/telemetry/performance/StubPerformanceClient.mjs +76 -76
  235. package/dist/telemetry/performance/StubPerformanceClient.mjs.map +1 -1
  236. package/dist/telemetry/server/ServerTelemetryManager.d.ts +66 -66
  237. package/dist/telemetry/server/ServerTelemetryManager.mjs +201 -201
  238. package/dist/telemetry/server/ServerTelemetryManager.mjs.map +1 -1
  239. package/dist/telemetry/server/ServerTelemetryRequest.d.ts +8 -8
  240. package/dist/url/IUri.d.ts +12 -12
  241. package/dist/url/UrlString.d.ts +48 -48
  242. package/dist/url/UrlString.mjs +161 -161
  243. package/dist/url/UrlString.mjs.map +1 -1
  244. package/dist/utils/Constants.d.ts +296 -365
  245. package/dist/utils/Constants.d.ts.map +1 -1
  246. package/dist/utils/Constants.mjs +309 -376
  247. package/dist/utils/Constants.mjs.map +1 -1
  248. package/dist/utils/FunctionWrappers.d.ts +27 -27
  249. package/dist/utils/FunctionWrappers.mjs +84 -84
  250. package/dist/utils/FunctionWrappers.mjs.map +1 -1
  251. package/dist/utils/MsalTypes.d.ts +6 -6
  252. package/dist/utils/ProtocolUtils.d.ts +42 -42
  253. package/dist/utils/ProtocolUtils.mjs +69 -69
  254. package/dist/utils/ProtocolUtils.mjs.map +1 -1
  255. package/dist/utils/StringUtils.d.ts +40 -40
  256. package/dist/utils/StringUtils.mjs +95 -95
  257. package/dist/utils/StringUtils.mjs.map +1 -1
  258. package/dist/utils/TimeUtils.d.ts +27 -27
  259. package/dist/utils/TimeUtils.mjs +45 -45
  260. package/dist/utils/TimeUtils.mjs.map +1 -1
  261. package/dist/utils/UrlUtils.d.ts +10 -10
  262. package/dist/utils/UrlUtils.mjs +44 -44
  263. package/dist/utils/UrlUtils.mjs.map +1 -1
  264. package/package.json +93 -92
  265. package/src/account/AccountInfo.ts +96 -0
  266. package/src/account/ClientInfo.ts +2 -3
  267. package/src/account/TokenClaims.ts +28 -0
  268. package/src/authority/Authority.ts +29 -2
  269. package/src/cache/CacheManager.ts +416 -114
  270. package/src/cache/entities/AccountEntity.ts +84 -33
  271. package/src/cache/entities/RefreshTokenEntity.ts +1 -3
  272. package/src/cache/utils/CacheHelpers.ts +1 -6
  273. package/src/cache/utils/CacheTypes.ts +11 -0
  274. package/src/client/AuthorizationCodeClient.ts +4 -5
  275. package/src/client/RefreshTokenClient.ts +3 -15
  276. package/src/client/SilentFlowClient.ts +1 -1
  277. package/src/constants/AADServerParamKeys.ts +56 -0
  278. package/src/crypto/PopTokenGenerator.ts +1 -1
  279. package/src/error/InteractionRequiredAuthError.ts +0 -2
  280. package/src/error/InteractionRequiredAuthErrorCodes.ts +0 -1
  281. package/src/index.ts +17 -5
  282. package/src/packageMetadata.ts +1 -1
  283. package/src/request/CommonRefreshTokenRequest.ts +0 -1
  284. package/src/request/CommonSilentFlowRequest.ts +0 -1
  285. package/src/request/RequestParameterBuilder.ts +7 -5
  286. package/src/response/ResponseHandler.ts +95 -27
  287. package/src/utils/Constants.ts +0 -72
@@ -1,8 +1,9 @@
1
- /*! @azure/msal-common v14.4.1-beta.0 2023-11-14 */
1
+ /*! @azure/msal-common v14.5.0 2023-12-01 */
2
2
  'use strict';
3
3
  import { BaseClient } from './BaseClient.mjs';
4
4
  import { RequestParameterBuilder } from '../request/RequestParameterBuilder.mjs';
5
- import { Separators, AADServerParamKeys, GrantType, AuthenticationScheme, PromptValue, HeaderNames } from '../utils/Constants.mjs';
5
+ import { Separators, GrantType, AuthenticationScheme, PromptValue, HeaderNames } from '../utils/Constants.mjs';
6
+ import { CLIENT_ID, RETURN_SPA_CODE } from '../constants/AADServerParamKeys.mjs';
6
7
  import { isOidcProtocolMode } from '../config/ClientConfiguration.mjs';
7
8
  import { ResponseHandler } from '../response/ResponseHandler.mjs';
8
9
  import { StringUtils } from '../utils/StringUtils.mjs';
@@ -19,407 +20,407 @@ import { invokeAsync } from '../utils/FunctionWrappers.mjs';
19
20
  import { requestCannotBeMade, authorizationCodeMissingFromServerResponse } from '../error/ClientAuthErrorCodes.mjs';
20
21
  import { logoutRequestEmpty, missingSshJwk } from '../error/ClientConfigurationErrorCodes.mjs';
21
22
 
22
- /*
23
- * Copyright (c) Microsoft Corporation. All rights reserved.
24
- * Licensed under the MIT License.
25
- */
26
- /**
27
- * Oauth2.0 Authorization Code client
28
- * @internal
29
- */
30
- class AuthorizationCodeClient extends BaseClient {
31
- constructor(configuration, performanceClient) {
32
- super(configuration, performanceClient);
33
- // Flag to indicate if client is for hybrid spa auth code redemption
34
- this.includeRedirectUri = true;
35
- this.oidcDefaultScopes =
36
- this.config.authOptions.authority.options.OIDCOptions?.defaultScopes;
37
- }
38
- /**
39
- * Creates the URL of the authorization request letting the user input credentials and consent to the
40
- * application. The URL target the /authorize endpoint of the authority configured in the
41
- * application object.
42
- *
43
- * Once the user inputs their credentials and consents, the authority will send a response to the redirect URI
44
- * sent in the request and should contain an authorization code, which can then be used to acquire tokens via
45
- * acquireToken(AuthorizationCodeRequest)
46
- * @param request
47
- */
48
- async getAuthCodeUrl(request) {
49
- this.performanceClient?.addQueueMeasurement(PerformanceEvents.GetAuthCodeUrl, request.correlationId);
50
- const queryString = await invokeAsync(this.createAuthCodeUrlQueryString.bind(this), PerformanceEvents.AuthClientCreateQueryString, this.logger, this.performanceClient, request.correlationId)(request);
51
- return UrlString.appendQueryString(this.authority.authorizationEndpoint, queryString);
52
- }
53
- /**
54
- * API to acquire a token in exchange of 'authorization_code` acquired by the user in the first leg of the
55
- * authorization_code_grant
56
- * @param request
57
- */
58
- async acquireToken(request, authCodePayload) {
59
- this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthClientAcquireToken, request.correlationId);
60
- if (!request.code) {
61
- throw createClientAuthError(requestCannotBeMade);
62
- }
63
- const reqTimestamp = TimeUtils.nowSeconds();
64
- const response = await invokeAsync(this.executeTokenRequest.bind(this), PerformanceEvents.AuthClientExecuteTokenRequest, this.logger, this.performanceClient, request.correlationId)(this.authority, request);
65
- // Retrieve requestId from response headers
66
- const requestId = response.headers?.[HeaderNames.X_MS_REQUEST_ID];
67
- const responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin, this.performanceClient);
68
- // Validate response. This function throws a server error if an error is returned by the server.
69
- responseHandler.validateTokenResponse(response.body);
70
- return invokeAsync(responseHandler.handleServerTokenResponse.bind(responseHandler), PerformanceEvents.HandleServerTokenResponse, this.logger, this.performanceClient, request.correlationId)(response.body, this.authority, reqTimestamp, request, authCodePayload, undefined, undefined, undefined, requestId, (TimeUtils.nowSeconds() + 24 * 60 * 60).toString());
71
- }
72
- /**
73
- * Handles the hash fragment response from public client code request. Returns a code response used by
74
- * the client to exchange for a token in acquireToken.
75
- * @param hashFragment
76
- */
77
- handleFragmentResponse(serverParams, cachedState) {
78
- // Handle responses.
79
- const responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, null, null);
80
- // Get code response
81
- responseHandler.validateServerAuthorizationCodeResponse(serverParams, cachedState);
82
- // throw when there is no auth code in the response
83
- if (!serverParams.code) {
84
- throw createClientAuthError(authorizationCodeMissingFromServerResponse);
85
- }
86
- return serverParams;
87
- }
88
- /**
89
- * Used to log out the current user, and redirect the user to the postLogoutRedirectUri.
90
- * Default behaviour is to redirect the user to `window.location.href`.
91
- * @param authorityUri
92
- */
93
- getLogoutUri(logoutRequest) {
94
- // Throw error if logoutRequest is null/undefined
95
- if (!logoutRequest) {
96
- throw createClientConfigurationError(logoutRequestEmpty);
97
- }
98
- const queryString = this.createLogoutUrlQueryString(logoutRequest);
99
- // Construct logout URI
100
- return UrlString.appendQueryString(this.authority.endSessionEndpoint, queryString);
101
- }
102
- /**
103
- * Executes POST request to token endpoint
104
- * @param authority
105
- * @param request
106
- */
107
- async executeTokenRequest(authority, request) {
108
- this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthClientExecuteTokenRequest, request.correlationId);
109
- const queryParametersString = this.createTokenQueryParameters(request);
110
- const endpoint = UrlString.appendQueryString(authority.tokenEndpoint, queryParametersString);
111
- const requestBody = await invokeAsync(this.createTokenRequestBody.bind(this), PerformanceEvents.AuthClientCreateTokenRequestBody, this.logger, this.performanceClient, request.correlationId)(request);
112
- let ccsCredential = undefined;
113
- if (request.clientInfo) {
114
- try {
115
- const clientInfo = buildClientInfo(request.clientInfo, this.cryptoUtils);
116
- ccsCredential = {
117
- credential: `${clientInfo.uid}${Separators.CLIENT_INFO_SEPARATOR}${clientInfo.utid}`,
118
- type: CcsCredentialType.HOME_ACCOUNT_ID,
119
- };
120
- }
121
- catch (e) {
122
- this.logger.verbose("Could not parse client info for CCS Header: " + e);
123
- }
124
- }
125
- const headers = this.createTokenRequestHeaders(ccsCredential || request.ccsCredential);
126
- const thumbprint = {
127
- clientId: request.tokenBodyParameters?.clientId ||
128
- this.config.authOptions.clientId,
129
- authority: authority.canonicalAuthority,
130
- scopes: request.scopes,
131
- claims: request.claims,
132
- authenticationScheme: request.authenticationScheme,
133
- resourceRequestMethod: request.resourceRequestMethod,
134
- resourceRequestUri: request.resourceRequestUri,
135
- shrClaims: request.shrClaims,
136
- sshKid: request.sshKid,
137
- };
138
- return invokeAsync(this.executePostToTokenEndpoint.bind(this), PerformanceEvents.AuthorizationCodeClientExecutePostToTokenEndpoint, this.logger, this.performanceClient, request.correlationId)(endpoint, requestBody, headers, thumbprint, request.correlationId, PerformanceEvents.AuthorizationCodeClientExecutePostToTokenEndpoint);
139
- }
140
- /**
141
- * Generates a map for all the params to be sent to the service
142
- * @param request
143
- */
144
- async createTokenRequestBody(request) {
145
- this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthClientCreateTokenRequestBody, request.correlationId);
146
- const parameterBuilder = new RequestParameterBuilder();
147
- parameterBuilder.addClientId(request.tokenBodyParameters?.[AADServerParamKeys.CLIENT_ID] ||
148
- this.config.authOptions.clientId);
149
- /*
150
- * For hybrid spa flow, there will be a code but no verifier
151
- * In this scenario, don't include redirect uri as auth code will not be bound to redirect URI
152
- */
153
- if (!this.includeRedirectUri) {
154
- // Just validate
155
- RequestValidator.validateRedirectUri(request.redirectUri);
156
- }
157
- else {
158
- // Validate and include redirect uri
159
- parameterBuilder.addRedirectUri(request.redirectUri);
160
- }
161
- // Add scope array, parameter builder will add default scopes and dedupe
162
- parameterBuilder.addScopes(request.scopes, true, this.oidcDefaultScopes);
163
- // add code: user set, not validated
164
- parameterBuilder.addAuthorizationCode(request.code);
165
- // Add library metadata
166
- parameterBuilder.addLibraryInfo(this.config.libraryInfo);
167
- parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
168
- parameterBuilder.addThrottling();
169
- if (this.serverTelemetryManager && !isOidcProtocolMode(this.config)) {
170
- parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
171
- }
172
- // add code_verifier if passed
173
- if (request.codeVerifier) {
174
- parameterBuilder.addCodeVerifier(request.codeVerifier);
175
- }
176
- if (this.config.clientCredentials.clientSecret) {
177
- parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
178
- }
179
- if (this.config.clientCredentials.clientAssertion) {
180
- const clientAssertion = this.config.clientCredentials.clientAssertion;
181
- parameterBuilder.addClientAssertion(clientAssertion.assertion);
182
- parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
183
- }
184
- parameterBuilder.addGrantType(GrantType.AUTHORIZATION_CODE_GRANT);
185
- parameterBuilder.addClientInfo();
186
- if (request.authenticationScheme === AuthenticationScheme.POP) {
187
- const popTokenGenerator = new PopTokenGenerator(this.cryptoUtils, this.performanceClient);
188
- const reqCnfData = await invokeAsync(popTokenGenerator.generateCnf.bind(popTokenGenerator), PerformanceEvents.PopTokenGenerateCnf, this.logger, this.performanceClient, request.correlationId)(request, this.logger);
189
- // SPA PoP requires full Base64Url encoded req_cnf string (unhashed)
190
- parameterBuilder.addPopToken(reqCnfData.reqCnfString);
191
- }
192
- else if (request.authenticationScheme === AuthenticationScheme.SSH) {
193
- if (request.sshJwk) {
194
- parameterBuilder.addSshJwk(request.sshJwk);
195
- }
196
- else {
197
- throw createClientConfigurationError(missingSshJwk);
198
- }
199
- }
200
- const correlationId = request.correlationId ||
201
- this.config.cryptoInterface.createNewGuid();
202
- parameterBuilder.addCorrelationId(correlationId);
203
- if (!StringUtils.isEmptyObj(request.claims) ||
204
- (this.config.authOptions.clientCapabilities &&
205
- this.config.authOptions.clientCapabilities.length > 0)) {
206
- parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
207
- }
208
- let ccsCred = undefined;
209
- if (request.clientInfo) {
210
- try {
211
- const clientInfo = buildClientInfo(request.clientInfo, this.cryptoUtils);
212
- ccsCred = {
213
- credential: `${clientInfo.uid}${Separators.CLIENT_INFO_SEPARATOR}${clientInfo.utid}`,
214
- type: CcsCredentialType.HOME_ACCOUNT_ID,
215
- };
216
- }
217
- catch (e) {
218
- this.logger.verbose("Could not parse client info for CCS Header: " + e);
219
- }
220
- }
221
- else {
222
- ccsCred = request.ccsCredential;
223
- }
224
- // Adds these as parameters in the request instead of headers to prevent CORS preflight request
225
- if (this.config.systemOptions.preventCorsPreflight && ccsCred) {
226
- switch (ccsCred.type) {
227
- case CcsCredentialType.HOME_ACCOUNT_ID:
228
- try {
229
- const clientInfo = buildClientInfoFromHomeAccountId(ccsCred.credential);
230
- parameterBuilder.addCcsOid(clientInfo);
231
- }
232
- catch (e) {
233
- this.logger.verbose("Could not parse home account ID for CCS Header: " +
234
- e);
235
- }
236
- break;
237
- case CcsCredentialType.UPN:
238
- parameterBuilder.addCcsUpn(ccsCred.credential);
239
- break;
240
- }
241
- }
242
- if (request.tokenBodyParameters) {
243
- parameterBuilder.addExtraQueryParameters(request.tokenBodyParameters);
244
- }
245
- // Add hybrid spa parameters if not already provided
246
- if (request.enableSpaAuthorizationCode &&
247
- (!request.tokenBodyParameters ||
248
- !request.tokenBodyParameters[AADServerParamKeys.RETURN_SPA_CODE])) {
249
- parameterBuilder.addExtraQueryParameters({
250
- [AADServerParamKeys.RETURN_SPA_CODE]: "1",
251
- });
252
- }
253
- return parameterBuilder.createQueryString();
254
- }
255
- /**
256
- * This API validates the `AuthorizationCodeUrlRequest` and creates a URL
257
- * @param request
258
- */
259
- async createAuthCodeUrlQueryString(request) {
260
- this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthClientCreateQueryString, request.correlationId);
261
- const parameterBuilder = new RequestParameterBuilder();
262
- parameterBuilder.addClientId(request.extraQueryParameters?.[AADServerParamKeys.CLIENT_ID] ||
263
- this.config.authOptions.clientId);
264
- const requestScopes = [
265
- ...(request.scopes || []),
266
- ...(request.extraScopesToConsent || []),
267
- ];
268
- parameterBuilder.addScopes(requestScopes, true, this.oidcDefaultScopes);
269
- // validate the redirectUri (to be a non null value)
270
- parameterBuilder.addRedirectUri(request.redirectUri);
271
- // generate the correlationId if not set by the user and add
272
- const correlationId = request.correlationId ||
273
- this.config.cryptoInterface.createNewGuid();
274
- parameterBuilder.addCorrelationId(correlationId);
275
- // add response_mode. If not passed in it defaults to query.
276
- parameterBuilder.addResponseMode(request.responseMode);
277
- // add response_type = code
278
- parameterBuilder.addResponseTypeCode();
279
- // add library info parameters
280
- parameterBuilder.addLibraryInfo(this.config.libraryInfo);
281
- if (!isOidcProtocolMode(this.config)) {
282
- parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
283
- }
284
- // add client_info=1
285
- parameterBuilder.addClientInfo();
286
- if (request.codeChallenge && request.codeChallengeMethod) {
287
- parameterBuilder.addCodeChallengeParams(request.codeChallenge, request.codeChallengeMethod);
288
- }
289
- if (request.prompt) {
290
- parameterBuilder.addPrompt(request.prompt);
291
- }
292
- if (request.domainHint) {
293
- parameterBuilder.addDomainHint(request.domainHint);
294
- }
295
- // Add sid or loginHint with preference for login_hint claim (in request) -> sid -> loginHint (upn/email) -> username of AccountInfo object
296
- if (request.prompt !== PromptValue.SELECT_ACCOUNT) {
297
- // AAD will throw if prompt=select_account is passed with an account hint
298
- if (request.sid && request.prompt === PromptValue.NONE) {
299
- // SessionID is only used in silent calls
300
- this.logger.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from request");
301
- parameterBuilder.addSid(request.sid);
302
- }
303
- else if (request.account) {
304
- const accountSid = this.extractAccountSid(request.account);
305
- const accountLoginHintClaim = this.extractLoginHint(request.account);
306
- // If login_hint claim is present, use it over sid/username
307
- if (accountLoginHintClaim) {
308
- this.logger.verbose("createAuthCodeUrlQueryString: login_hint claim present on account");
309
- parameterBuilder.addLoginHint(accountLoginHintClaim);
310
- try {
311
- const clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
312
- parameterBuilder.addCcsOid(clientInfo);
313
- }
314
- catch (e) {
315
- this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
316
- }
317
- }
318
- else if (accountSid && request.prompt === PromptValue.NONE) {
319
- /*
320
- * If account and loginHint are provided, we will check account first for sid before adding loginHint
321
- * SessionId is only used in silent calls
322
- */
323
- this.logger.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from account");
324
- parameterBuilder.addSid(accountSid);
325
- try {
326
- const clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
327
- parameterBuilder.addCcsOid(clientInfo);
328
- }
329
- catch (e) {
330
- this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
331
- }
332
- }
333
- else if (request.loginHint) {
334
- this.logger.verbose("createAuthCodeUrlQueryString: Adding login_hint from request");
335
- parameterBuilder.addLoginHint(request.loginHint);
336
- parameterBuilder.addCcsUpn(request.loginHint);
337
- }
338
- else if (request.account.username) {
339
- // Fallback to account username if provided
340
- this.logger.verbose("createAuthCodeUrlQueryString: Adding login_hint from account");
341
- parameterBuilder.addLoginHint(request.account.username);
342
- try {
343
- const clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
344
- parameterBuilder.addCcsOid(clientInfo);
345
- }
346
- catch (e) {
347
- this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
348
- }
349
- }
350
- }
351
- else if (request.loginHint) {
352
- this.logger.verbose("createAuthCodeUrlQueryString: No account, adding login_hint from request");
353
- parameterBuilder.addLoginHint(request.loginHint);
354
- parameterBuilder.addCcsUpn(request.loginHint);
355
- }
356
- }
357
- else {
358
- this.logger.verbose("createAuthCodeUrlQueryString: Prompt is select_account, ignoring account hints");
359
- }
360
- if (request.nonce) {
361
- parameterBuilder.addNonce(request.nonce);
362
- }
363
- if (request.state) {
364
- parameterBuilder.addState(request.state);
365
- }
366
- if (request.claims ||
367
- (this.config.authOptions.clientCapabilities &&
368
- this.config.authOptions.clientCapabilities.length > 0)) {
369
- parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
370
- }
371
- if (request.extraQueryParameters) {
372
- parameterBuilder.addExtraQueryParameters(request.extraQueryParameters);
373
- }
374
- if (request.nativeBroker) {
375
- // signal ests that this is a WAM call
376
- parameterBuilder.addNativeBroker();
377
- // pass the req_cnf for POP
378
- if (request.authenticationScheme === AuthenticationScheme.POP) {
379
- const popTokenGenerator = new PopTokenGenerator(this.cryptoUtils);
380
- // to reduce the URL length, it is recommended to send the hash of the req_cnf instead of the whole string
381
- const reqCnfData = await invokeAsync(popTokenGenerator.generateCnf.bind(popTokenGenerator), PerformanceEvents.PopTokenGenerateCnf, this.logger, this.performanceClient, request.correlationId)(request, this.logger);
382
- parameterBuilder.addPopToken(reqCnfData.reqCnfHash);
383
- }
384
- }
385
- return parameterBuilder.createQueryString();
386
- }
387
- /**
388
- * This API validates the `EndSessionRequest` and creates a URL
389
- * @param request
390
- */
391
- createLogoutUrlQueryString(request) {
392
- const parameterBuilder = new RequestParameterBuilder();
393
- if (request.postLogoutRedirectUri) {
394
- parameterBuilder.addPostLogoutRedirectUri(request.postLogoutRedirectUri);
395
- }
396
- if (request.correlationId) {
397
- parameterBuilder.addCorrelationId(request.correlationId);
398
- }
399
- if (request.idTokenHint) {
400
- parameterBuilder.addIdTokenHint(request.idTokenHint);
401
- }
402
- if (request.state) {
403
- parameterBuilder.addState(request.state);
404
- }
405
- if (request.logoutHint) {
406
- parameterBuilder.addLogoutHint(request.logoutHint);
407
- }
408
- if (request.extraQueryParameters) {
409
- parameterBuilder.addExtraQueryParameters(request.extraQueryParameters);
410
- }
411
- return parameterBuilder.createQueryString();
412
- }
413
- /**
414
- * Helper to get sid from account. Returns null if idTokenClaims are not present or sid is not present.
415
- * @param account
416
- */
417
- extractAccountSid(account) {
418
- return account.idTokenClaims?.sid || null;
419
- }
420
- extractLoginHint(account) {
421
- return account.idTokenClaims?.login_hint || null;
422
- }
23
+ /*
24
+ * Copyright (c) Microsoft Corporation. All rights reserved.
25
+ * Licensed under the MIT License.
26
+ */
27
+ /**
28
+ * Oauth2.0 Authorization Code client
29
+ * @internal
30
+ */
31
+ class AuthorizationCodeClient extends BaseClient {
32
+ constructor(configuration, performanceClient) {
33
+ super(configuration, performanceClient);
34
+ // Flag to indicate if client is for hybrid spa auth code redemption
35
+ this.includeRedirectUri = true;
36
+ this.oidcDefaultScopes =
37
+ this.config.authOptions.authority.options.OIDCOptions?.defaultScopes;
38
+ }
39
+ /**
40
+ * Creates the URL of the authorization request letting the user input credentials and consent to the
41
+ * application. The URL target the /authorize endpoint of the authority configured in the
42
+ * application object.
43
+ *
44
+ * Once the user inputs their credentials and consents, the authority will send a response to the redirect URI
45
+ * sent in the request and should contain an authorization code, which can then be used to acquire tokens via
46
+ * acquireToken(AuthorizationCodeRequest)
47
+ * @param request
48
+ */
49
+ async getAuthCodeUrl(request) {
50
+ this.performanceClient?.addQueueMeasurement(PerformanceEvents.GetAuthCodeUrl, request.correlationId);
51
+ const queryString = await invokeAsync(this.createAuthCodeUrlQueryString.bind(this), PerformanceEvents.AuthClientCreateQueryString, this.logger, this.performanceClient, request.correlationId)(request);
52
+ return UrlString.appendQueryString(this.authority.authorizationEndpoint, queryString);
53
+ }
54
+ /**
55
+ * API to acquire a token in exchange of 'authorization_code` acquired by the user in the first leg of the
56
+ * authorization_code_grant
57
+ * @param request
58
+ */
59
+ async acquireToken(request, authCodePayload) {
60
+ this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthClientAcquireToken, request.correlationId);
61
+ if (!request.code) {
62
+ throw createClientAuthError(requestCannotBeMade);
63
+ }
64
+ const reqTimestamp = TimeUtils.nowSeconds();
65
+ const response = await invokeAsync(this.executeTokenRequest.bind(this), PerformanceEvents.AuthClientExecuteTokenRequest, this.logger, this.performanceClient, request.correlationId)(this.authority, request);
66
+ // Retrieve requestId from response headers
67
+ const requestId = response.headers?.[HeaderNames.X_MS_REQUEST_ID];
68
+ const responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin, this.performanceClient);
69
+ // Validate response. This function throws a server error if an error is returned by the server.
70
+ responseHandler.validateTokenResponse(response.body);
71
+ return invokeAsync(responseHandler.handleServerTokenResponse.bind(responseHandler), PerformanceEvents.HandleServerTokenResponse, this.logger, this.performanceClient, request.correlationId)(response.body, this.authority, reqTimestamp, request, authCodePayload, undefined, undefined, undefined, requestId);
72
+ }
73
+ /**
74
+ * Handles the hash fragment response from public client code request. Returns a code response used by
75
+ * the client to exchange for a token in acquireToken.
76
+ * @param hashFragment
77
+ */
78
+ handleFragmentResponse(serverParams, cachedState) {
79
+ // Handle responses.
80
+ const responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, null, null);
81
+ // Get code response
82
+ responseHandler.validateServerAuthorizationCodeResponse(serverParams, cachedState);
83
+ // throw when there is no auth code in the response
84
+ if (!serverParams.code) {
85
+ throw createClientAuthError(authorizationCodeMissingFromServerResponse);
86
+ }
87
+ return serverParams;
88
+ }
89
+ /**
90
+ * Used to log out the current user, and redirect the user to the postLogoutRedirectUri.
91
+ * Default behaviour is to redirect the user to `window.location.href`.
92
+ * @param authorityUri
93
+ */
94
+ getLogoutUri(logoutRequest) {
95
+ // Throw error if logoutRequest is null/undefined
96
+ if (!logoutRequest) {
97
+ throw createClientConfigurationError(logoutRequestEmpty);
98
+ }
99
+ const queryString = this.createLogoutUrlQueryString(logoutRequest);
100
+ // Construct logout URI
101
+ return UrlString.appendQueryString(this.authority.endSessionEndpoint, queryString);
102
+ }
103
+ /**
104
+ * Executes POST request to token endpoint
105
+ * @param authority
106
+ * @param request
107
+ */
108
+ async executeTokenRequest(authority, request) {
109
+ this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthClientExecuteTokenRequest, request.correlationId);
110
+ const queryParametersString = this.createTokenQueryParameters(request);
111
+ const endpoint = UrlString.appendQueryString(authority.tokenEndpoint, queryParametersString);
112
+ const requestBody = await invokeAsync(this.createTokenRequestBody.bind(this), PerformanceEvents.AuthClientCreateTokenRequestBody, this.logger, this.performanceClient, request.correlationId)(request);
113
+ let ccsCredential = undefined;
114
+ if (request.clientInfo) {
115
+ try {
116
+ const clientInfo = buildClientInfo(request.clientInfo, this.cryptoUtils.base64Decode);
117
+ ccsCredential = {
118
+ credential: `${clientInfo.uid}${Separators.CLIENT_INFO_SEPARATOR}${clientInfo.utid}`,
119
+ type: CcsCredentialType.HOME_ACCOUNT_ID,
120
+ };
121
+ }
122
+ catch (e) {
123
+ this.logger.verbose("Could not parse client info for CCS Header: " + e);
124
+ }
125
+ }
126
+ const headers = this.createTokenRequestHeaders(ccsCredential || request.ccsCredential);
127
+ const thumbprint = {
128
+ clientId: request.tokenBodyParameters?.clientId ||
129
+ this.config.authOptions.clientId,
130
+ authority: authority.canonicalAuthority,
131
+ scopes: request.scopes,
132
+ claims: request.claims,
133
+ authenticationScheme: request.authenticationScheme,
134
+ resourceRequestMethod: request.resourceRequestMethod,
135
+ resourceRequestUri: request.resourceRequestUri,
136
+ shrClaims: request.shrClaims,
137
+ sshKid: request.sshKid,
138
+ };
139
+ return invokeAsync(this.executePostToTokenEndpoint.bind(this), PerformanceEvents.AuthorizationCodeClientExecutePostToTokenEndpoint, this.logger, this.performanceClient, request.correlationId)(endpoint, requestBody, headers, thumbprint, request.correlationId, PerformanceEvents.AuthorizationCodeClientExecutePostToTokenEndpoint);
140
+ }
141
+ /**
142
+ * Generates a map for all the params to be sent to the service
143
+ * @param request
144
+ */
145
+ async createTokenRequestBody(request) {
146
+ this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthClientCreateTokenRequestBody, request.correlationId);
147
+ const parameterBuilder = new RequestParameterBuilder();
148
+ parameterBuilder.addClientId(request.tokenBodyParameters?.[CLIENT_ID] ||
149
+ this.config.authOptions.clientId);
150
+ /*
151
+ * For hybrid spa flow, there will be a code but no verifier
152
+ * In this scenario, don't include redirect uri as auth code will not be bound to redirect URI
153
+ */
154
+ if (!this.includeRedirectUri) {
155
+ // Just validate
156
+ RequestValidator.validateRedirectUri(request.redirectUri);
157
+ }
158
+ else {
159
+ // Validate and include redirect uri
160
+ parameterBuilder.addRedirectUri(request.redirectUri);
161
+ }
162
+ // Add scope array, parameter builder will add default scopes and dedupe
163
+ parameterBuilder.addScopes(request.scopes, true, this.oidcDefaultScopes);
164
+ // add code: user set, not validated
165
+ parameterBuilder.addAuthorizationCode(request.code);
166
+ // Add library metadata
167
+ parameterBuilder.addLibraryInfo(this.config.libraryInfo);
168
+ parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
169
+ parameterBuilder.addThrottling();
170
+ if (this.serverTelemetryManager && !isOidcProtocolMode(this.config)) {
171
+ parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
172
+ }
173
+ // add code_verifier if passed
174
+ if (request.codeVerifier) {
175
+ parameterBuilder.addCodeVerifier(request.codeVerifier);
176
+ }
177
+ if (this.config.clientCredentials.clientSecret) {
178
+ parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
179
+ }
180
+ if (this.config.clientCredentials.clientAssertion) {
181
+ const clientAssertion = this.config.clientCredentials.clientAssertion;
182
+ parameterBuilder.addClientAssertion(clientAssertion.assertion);
183
+ parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
184
+ }
185
+ parameterBuilder.addGrantType(GrantType.AUTHORIZATION_CODE_GRANT);
186
+ parameterBuilder.addClientInfo();
187
+ if (request.authenticationScheme === AuthenticationScheme.POP) {
188
+ const popTokenGenerator = new PopTokenGenerator(this.cryptoUtils, this.performanceClient);
189
+ const reqCnfData = await invokeAsync(popTokenGenerator.generateCnf.bind(popTokenGenerator), PerformanceEvents.PopTokenGenerateCnf, this.logger, this.performanceClient, request.correlationId)(request, this.logger);
190
+ // SPA PoP requires full Base64Url encoded req_cnf string (unhashed)
191
+ parameterBuilder.addPopToken(reqCnfData.reqCnfString);
192
+ }
193
+ else if (request.authenticationScheme === AuthenticationScheme.SSH) {
194
+ if (request.sshJwk) {
195
+ parameterBuilder.addSshJwk(request.sshJwk);
196
+ }
197
+ else {
198
+ throw createClientConfigurationError(missingSshJwk);
199
+ }
200
+ }
201
+ const correlationId = request.correlationId ||
202
+ this.config.cryptoInterface.createNewGuid();
203
+ parameterBuilder.addCorrelationId(correlationId);
204
+ if (!StringUtils.isEmptyObj(request.claims) ||
205
+ (this.config.authOptions.clientCapabilities &&
206
+ this.config.authOptions.clientCapabilities.length > 0)) {
207
+ parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
208
+ }
209
+ let ccsCred = undefined;
210
+ if (request.clientInfo) {
211
+ try {
212
+ const clientInfo = buildClientInfo(request.clientInfo, this.cryptoUtils.base64Decode);
213
+ ccsCred = {
214
+ credential: `${clientInfo.uid}${Separators.CLIENT_INFO_SEPARATOR}${clientInfo.utid}`,
215
+ type: CcsCredentialType.HOME_ACCOUNT_ID,
216
+ };
217
+ }
218
+ catch (e) {
219
+ this.logger.verbose("Could not parse client info for CCS Header: " + e);
220
+ }
221
+ }
222
+ else {
223
+ ccsCred = request.ccsCredential;
224
+ }
225
+ // Adds these as parameters in the request instead of headers to prevent CORS preflight request
226
+ if (this.config.systemOptions.preventCorsPreflight && ccsCred) {
227
+ switch (ccsCred.type) {
228
+ case CcsCredentialType.HOME_ACCOUNT_ID:
229
+ try {
230
+ const clientInfo = buildClientInfoFromHomeAccountId(ccsCred.credential);
231
+ parameterBuilder.addCcsOid(clientInfo);
232
+ }
233
+ catch (e) {
234
+ this.logger.verbose("Could not parse home account ID for CCS Header: " +
235
+ e);
236
+ }
237
+ break;
238
+ case CcsCredentialType.UPN:
239
+ parameterBuilder.addCcsUpn(ccsCred.credential);
240
+ break;
241
+ }
242
+ }
243
+ if (request.tokenBodyParameters) {
244
+ parameterBuilder.addExtraQueryParameters(request.tokenBodyParameters);
245
+ }
246
+ // Add hybrid spa parameters if not already provided
247
+ if (request.enableSpaAuthorizationCode &&
248
+ (!request.tokenBodyParameters ||
249
+ !request.tokenBodyParameters[RETURN_SPA_CODE])) {
250
+ parameterBuilder.addExtraQueryParameters({
251
+ [RETURN_SPA_CODE]: "1",
252
+ });
253
+ }
254
+ return parameterBuilder.createQueryString();
255
+ }
256
+ /**
257
+ * This API validates the `AuthorizationCodeUrlRequest` and creates a URL
258
+ * @param request
259
+ */
260
+ async createAuthCodeUrlQueryString(request) {
261
+ this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthClientCreateQueryString, request.correlationId);
262
+ const parameterBuilder = new RequestParameterBuilder();
263
+ parameterBuilder.addClientId(request.extraQueryParameters?.[CLIENT_ID] ||
264
+ this.config.authOptions.clientId);
265
+ const requestScopes = [
266
+ ...(request.scopes || []),
267
+ ...(request.extraScopesToConsent || []),
268
+ ];
269
+ parameterBuilder.addScopes(requestScopes, true, this.oidcDefaultScopes);
270
+ // validate the redirectUri (to be a non null value)
271
+ parameterBuilder.addRedirectUri(request.redirectUri);
272
+ // generate the correlationId if not set by the user and add
273
+ const correlationId = request.correlationId ||
274
+ this.config.cryptoInterface.createNewGuid();
275
+ parameterBuilder.addCorrelationId(correlationId);
276
+ // add response_mode. If not passed in it defaults to query.
277
+ parameterBuilder.addResponseMode(request.responseMode);
278
+ // add response_type = code
279
+ parameterBuilder.addResponseTypeCode();
280
+ // add library info parameters
281
+ parameterBuilder.addLibraryInfo(this.config.libraryInfo);
282
+ if (!isOidcProtocolMode(this.config)) {
283
+ parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
284
+ }
285
+ // add client_info=1
286
+ parameterBuilder.addClientInfo();
287
+ if (request.codeChallenge && request.codeChallengeMethod) {
288
+ parameterBuilder.addCodeChallengeParams(request.codeChallenge, request.codeChallengeMethod);
289
+ }
290
+ if (request.prompt) {
291
+ parameterBuilder.addPrompt(request.prompt);
292
+ }
293
+ if (request.domainHint) {
294
+ parameterBuilder.addDomainHint(request.domainHint);
295
+ }
296
+ // Add sid or loginHint with preference for login_hint claim (in request) -> sid -> loginHint (upn/email) -> username of AccountInfo object
297
+ if (request.prompt !== PromptValue.SELECT_ACCOUNT) {
298
+ // AAD will throw if prompt=select_account is passed with an account hint
299
+ if (request.sid && request.prompt === PromptValue.NONE) {
300
+ // SessionID is only used in silent calls
301
+ this.logger.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from request");
302
+ parameterBuilder.addSid(request.sid);
303
+ }
304
+ else if (request.account) {
305
+ const accountSid = this.extractAccountSid(request.account);
306
+ const accountLoginHintClaim = this.extractLoginHint(request.account);
307
+ // If login_hint claim is present, use it over sid/username
308
+ if (accountLoginHintClaim) {
309
+ this.logger.verbose("createAuthCodeUrlQueryString: login_hint claim present on account");
310
+ parameterBuilder.addLoginHint(accountLoginHintClaim);
311
+ try {
312
+ const clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
313
+ parameterBuilder.addCcsOid(clientInfo);
314
+ }
315
+ catch (e) {
316
+ this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
317
+ }
318
+ }
319
+ else if (accountSid && request.prompt === PromptValue.NONE) {
320
+ /*
321
+ * If account and loginHint are provided, we will check account first for sid before adding loginHint
322
+ * SessionId is only used in silent calls
323
+ */
324
+ this.logger.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from account");
325
+ parameterBuilder.addSid(accountSid);
326
+ try {
327
+ const clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
328
+ parameterBuilder.addCcsOid(clientInfo);
329
+ }
330
+ catch (e) {
331
+ this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
332
+ }
333
+ }
334
+ else if (request.loginHint) {
335
+ this.logger.verbose("createAuthCodeUrlQueryString: Adding login_hint from request");
336
+ parameterBuilder.addLoginHint(request.loginHint);
337
+ parameterBuilder.addCcsUpn(request.loginHint);
338
+ }
339
+ else if (request.account.username) {
340
+ // Fallback to account username if provided
341
+ this.logger.verbose("createAuthCodeUrlQueryString: Adding login_hint from account");
342
+ parameterBuilder.addLoginHint(request.account.username);
343
+ try {
344
+ const clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
345
+ parameterBuilder.addCcsOid(clientInfo);
346
+ }
347
+ catch (e) {
348
+ this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
349
+ }
350
+ }
351
+ }
352
+ else if (request.loginHint) {
353
+ this.logger.verbose("createAuthCodeUrlQueryString: No account, adding login_hint from request");
354
+ parameterBuilder.addLoginHint(request.loginHint);
355
+ parameterBuilder.addCcsUpn(request.loginHint);
356
+ }
357
+ }
358
+ else {
359
+ this.logger.verbose("createAuthCodeUrlQueryString: Prompt is select_account, ignoring account hints");
360
+ }
361
+ if (request.nonce) {
362
+ parameterBuilder.addNonce(request.nonce);
363
+ }
364
+ if (request.state) {
365
+ parameterBuilder.addState(request.state);
366
+ }
367
+ if (request.claims ||
368
+ (this.config.authOptions.clientCapabilities &&
369
+ this.config.authOptions.clientCapabilities.length > 0)) {
370
+ parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
371
+ }
372
+ if (request.extraQueryParameters) {
373
+ parameterBuilder.addExtraQueryParameters(request.extraQueryParameters);
374
+ }
375
+ if (request.nativeBroker) {
376
+ // signal ests that this is a WAM call
377
+ parameterBuilder.addNativeBroker();
378
+ // pass the req_cnf for POP
379
+ if (request.authenticationScheme === AuthenticationScheme.POP) {
380
+ const popTokenGenerator = new PopTokenGenerator(this.cryptoUtils);
381
+ // to reduce the URL length, it is recommended to send the hash of the req_cnf instead of the whole string
382
+ const reqCnfData = await invokeAsync(popTokenGenerator.generateCnf.bind(popTokenGenerator), PerformanceEvents.PopTokenGenerateCnf, this.logger, this.performanceClient, request.correlationId)(request, this.logger);
383
+ parameterBuilder.addPopToken(reqCnfData.reqCnfHash);
384
+ }
385
+ }
386
+ return parameterBuilder.createQueryString();
387
+ }
388
+ /**
389
+ * This API validates the `EndSessionRequest` and creates a URL
390
+ * @param request
391
+ */
392
+ createLogoutUrlQueryString(request) {
393
+ const parameterBuilder = new RequestParameterBuilder();
394
+ if (request.postLogoutRedirectUri) {
395
+ parameterBuilder.addPostLogoutRedirectUri(request.postLogoutRedirectUri);
396
+ }
397
+ if (request.correlationId) {
398
+ parameterBuilder.addCorrelationId(request.correlationId);
399
+ }
400
+ if (request.idTokenHint) {
401
+ parameterBuilder.addIdTokenHint(request.idTokenHint);
402
+ }
403
+ if (request.state) {
404
+ parameterBuilder.addState(request.state);
405
+ }
406
+ if (request.logoutHint) {
407
+ parameterBuilder.addLogoutHint(request.logoutHint);
408
+ }
409
+ if (request.extraQueryParameters) {
410
+ parameterBuilder.addExtraQueryParameters(request.extraQueryParameters);
411
+ }
412
+ return parameterBuilder.createQueryString();
413
+ }
414
+ /**
415
+ * Helper to get sid from account. Returns null if idTokenClaims are not present or sid is not present.
416
+ * @param account
417
+ */
418
+ extractAccountSid(account) {
419
+ return account.idTokenClaims?.sid || null;
420
+ }
421
+ extractLoginHint(account) {
422
+ return account.idTokenClaims?.login_hint || null;
423
+ }
423
424
  }
424
425
 
425
426
  export { AuthorizationCodeClient };