@azure/msal-common 14.0.1 → 14.0.3

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 (295) hide show
  1. package/dist/account/AuthToken.d.ts +14 -17
  2. package/dist/account/AuthToken.d.ts.map +1 -1
  3. package/dist/account/AuthToken.mjs +48 -39
  4. package/dist/account/AuthToken.mjs.map +1 -1
  5. package/dist/account/CcsCredential.mjs +1 -1
  6. package/dist/account/CcsCredential.mjs.map +1 -1
  7. package/dist/account/ClientInfo.d.ts.map +1 -1
  8. package/dist/account/ClientInfo.mjs +3 -4
  9. package/dist/account/ClientInfo.mjs.map +1 -1
  10. package/dist/authority/Authority.d.ts +1 -0
  11. package/dist/authority/Authority.d.ts.map +1 -1
  12. package/dist/authority/Authority.mjs +4 -2
  13. package/dist/authority/Authority.mjs.map +1 -1
  14. package/dist/authority/AuthorityFactory.d.ts +1 -0
  15. package/dist/authority/AuthorityFactory.d.ts.map +1 -1
  16. package/dist/authority/AuthorityFactory.mjs +3 -3
  17. package/dist/authority/AuthorityFactory.mjs.map +1 -1
  18. package/dist/authority/AuthorityMetadata.mjs +1 -1
  19. package/dist/authority/AuthorityMetadata.mjs.map +1 -1
  20. package/dist/authority/AuthorityOptions.mjs +1 -1
  21. package/dist/authority/AuthorityOptions.mjs.map +1 -1
  22. package/dist/authority/AuthorityType.mjs +1 -1
  23. package/dist/authority/AuthorityType.mjs.map +1 -1
  24. package/dist/authority/CloudInstanceDiscoveryErrorResponse.mjs +1 -1
  25. package/dist/authority/CloudInstanceDiscoveryErrorResponse.mjs.map +1 -1
  26. package/dist/authority/CloudInstanceDiscoveryResponse.mjs +1 -1
  27. package/dist/authority/CloudInstanceDiscoveryResponse.mjs.map +1 -1
  28. package/dist/authority/OpenIdConfigResponse.mjs +1 -1
  29. package/dist/authority/OpenIdConfigResponse.mjs.map +1 -1
  30. package/dist/authority/ProtocolMode.mjs +1 -1
  31. package/dist/authority/ProtocolMode.mjs.map +1 -1
  32. package/dist/authority/RegionDiscovery.mjs +1 -1
  33. package/dist/authority/RegionDiscovery.mjs.map +1 -1
  34. package/dist/cache/CacheManager.d.ts +2 -0
  35. package/dist/cache/CacheManager.d.ts.map +1 -1
  36. package/dist/cache/CacheManager.mjs +7 -5
  37. package/dist/cache/CacheManager.mjs.map +1 -1
  38. package/dist/cache/entities/AccessTokenEntity.d.ts.map +1 -1
  39. package/dist/cache/entities/AccessTokenEntity.mjs +4 -7
  40. package/dist/cache/entities/AccessTokenEntity.mjs.map +1 -1
  41. package/dist/cache/entities/AccountEntity.d.ts +1 -0
  42. package/dist/cache/entities/AccountEntity.d.ts.map +1 -1
  43. package/dist/cache/entities/AccountEntity.mjs +3 -4
  44. package/dist/cache/entities/AccountEntity.mjs.map +1 -1
  45. package/dist/cache/entities/AppMetadataEntity.mjs +1 -1
  46. package/dist/cache/entities/AppMetadataEntity.mjs.map +1 -1
  47. package/dist/cache/entities/AuthorityMetadataEntity.d.ts +1 -0
  48. package/dist/cache/entities/AuthorityMetadataEntity.d.ts.map +1 -1
  49. package/dist/cache/entities/AuthorityMetadataEntity.mjs +2 -1
  50. package/dist/cache/entities/AuthorityMetadataEntity.mjs.map +1 -1
  51. package/dist/cache/entities/CacheRecord.d.ts +1 -0
  52. package/dist/cache/entities/CacheRecord.d.ts.map +1 -1
  53. package/dist/cache/entities/CacheRecord.mjs +2 -1
  54. package/dist/cache/entities/CacheRecord.mjs.map +1 -1
  55. package/dist/cache/entities/CredentialEntity.mjs +1 -1
  56. package/dist/cache/entities/CredentialEntity.mjs.map +1 -1
  57. package/dist/cache/entities/IdTokenEntity.mjs +1 -1
  58. package/dist/cache/entities/IdTokenEntity.mjs.map +1 -1
  59. package/dist/cache/entities/RefreshTokenEntity.mjs +1 -1
  60. package/dist/cache/entities/RefreshTokenEntity.mjs.map +1 -1
  61. package/dist/cache/entities/ServerTelemetryEntity.mjs +1 -1
  62. package/dist/cache/entities/ServerTelemetryEntity.mjs.map +1 -1
  63. package/dist/cache/entities/ThrottlingEntity.mjs +1 -1
  64. package/dist/cache/entities/ThrottlingEntity.mjs.map +1 -1
  65. package/dist/cache/persistence/TokenCacheContext.mjs +1 -1
  66. package/dist/cache/persistence/TokenCacheContext.mjs.map +1 -1
  67. package/dist/cache/utils/CacheTypes.d.ts +7 -0
  68. package/dist/cache/utils/CacheTypes.d.ts.map +1 -1
  69. package/dist/client/AuthorizationCodeClient.d.ts +1 -0
  70. package/dist/client/AuthorizationCodeClient.d.ts.map +1 -1
  71. package/dist/client/AuthorizationCodeClient.mjs +11 -39
  72. package/dist/client/AuthorizationCodeClient.mjs.map +1 -1
  73. package/dist/client/BaseClient.d.ts +2 -1
  74. package/dist/client/BaseClient.d.ts.map +1 -1
  75. package/dist/client/BaseClient.mjs +9 -2
  76. package/dist/client/BaseClient.mjs.map +1 -1
  77. package/dist/client/RefreshTokenClient.d.ts +1 -0
  78. package/dist/client/RefreshTokenClient.d.ts.map +1 -1
  79. package/dist/client/RefreshTokenClient.mjs +3 -11
  80. package/dist/client/RefreshTokenClient.mjs.map +1 -1
  81. package/dist/client/SilentFlowClient.d.ts +1 -0
  82. package/dist/client/SilentFlowClient.d.ts.map +1 -1
  83. package/dist/client/SilentFlowClient.mjs +8 -7
  84. package/dist/client/SilentFlowClient.mjs.map +1 -1
  85. package/dist/config/ClientConfiguration.d.ts +2 -0
  86. package/dist/config/ClientConfiguration.d.ts.map +1 -1
  87. package/dist/config/ClientConfiguration.mjs +1 -1
  88. package/dist/config/ClientConfiguration.mjs.map +1 -1
  89. package/dist/crypto/ICrypto.mjs +1 -1
  90. package/dist/crypto/ICrypto.mjs.map +1 -1
  91. package/dist/crypto/JoseHeader.d.ts +1 -0
  92. package/dist/crypto/JoseHeader.d.ts.map +1 -1
  93. package/dist/crypto/JoseHeader.mjs +2 -1
  94. package/dist/crypto/JoseHeader.mjs.map +1 -1
  95. package/dist/crypto/PopTokenGenerator.d.ts +1 -0
  96. package/dist/crypto/PopTokenGenerator.d.ts.map +1 -1
  97. package/dist/crypto/PopTokenGenerator.mjs +2 -1
  98. package/dist/crypto/PopTokenGenerator.mjs.map +1 -1
  99. package/dist/error/AuthError.mjs +1 -1
  100. package/dist/error/AuthError.mjs.map +1 -1
  101. package/dist/error/ClientAuthError.mjs +1 -1
  102. package/dist/error/ClientAuthError.mjs.map +1 -1
  103. package/dist/error/ClientConfigurationError.mjs +1 -1
  104. package/dist/error/ClientConfigurationError.mjs.map +1 -1
  105. package/dist/error/InteractionRequiredAuthError.mjs +1 -1
  106. package/dist/error/InteractionRequiredAuthError.mjs.map +1 -1
  107. package/dist/error/JoseHeaderError.mjs +1 -1
  108. package/dist/error/JoseHeaderError.mjs.map +1 -1
  109. package/dist/error/ServerError.mjs +1 -1
  110. package/dist/error/ServerError.mjs.map +1 -1
  111. package/dist/index.cjs +1926 -1826
  112. package/dist/index.cjs.map +1 -1
  113. package/dist/index.d.ts +4 -3
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.mjs +5 -3
  116. package/dist/index.mjs.map +1 -1
  117. package/dist/logger/Logger.d.ts.map +1 -1
  118. package/dist/logger/Logger.mjs +2 -12
  119. package/dist/logger/Logger.mjs.map +1 -1
  120. package/dist/network/INetworkModule.mjs +1 -1
  121. package/dist/network/INetworkModule.mjs.map +1 -1
  122. package/dist/network/NetworkManager.d.ts +1 -0
  123. package/dist/network/NetworkManager.d.ts.map +1 -1
  124. package/dist/network/NetworkManager.mjs +2 -1
  125. package/dist/network/NetworkManager.mjs.map +1 -1
  126. package/dist/network/ThrottlingUtils.d.ts +1 -0
  127. package/dist/network/ThrottlingUtils.d.ts.map +1 -1
  128. package/dist/network/ThrottlingUtils.mjs +2 -1
  129. package/dist/network/ThrottlingUtils.mjs.map +1 -1
  130. package/dist/packageMetadata.d.ts +1 -1
  131. package/dist/packageMetadata.mjs +2 -2
  132. package/dist/packageMetadata.mjs.map +1 -1
  133. package/dist/request/AuthenticationHeaderParser.mjs +1 -1
  134. package/dist/request/AuthenticationHeaderParser.mjs.map +1 -1
  135. package/dist/request/RequestParameterBuilder.d.ts +1 -0
  136. package/dist/request/RequestParameterBuilder.d.ts.map +1 -1
  137. package/dist/request/RequestParameterBuilder.mjs +7 -7
  138. package/dist/request/RequestParameterBuilder.mjs.map +1 -1
  139. package/dist/request/RequestValidator.d.ts.map +1 -1
  140. package/dist/request/RequestValidator.mjs +4 -6
  141. package/dist/request/RequestValidator.mjs.map +1 -1
  142. package/dist/request/ScopeSet.mjs +4 -4
  143. package/dist/request/ScopeSet.mjs.map +1 -1
  144. package/dist/response/AuthenticationResult.d.ts +3 -1
  145. package/dist/response/AuthenticationResult.d.ts.map +1 -1
  146. package/dist/response/ResponseHandler.d.ts +5 -3
  147. package/dist/response/ResponseHandler.d.ts.map +1 -1
  148. package/dist/response/ResponseHandler.mjs +58 -39
  149. package/dist/response/ResponseHandler.mjs.map +1 -1
  150. package/dist/response/ServerAuthorizationTokenResponse.d.ts +2 -0
  151. package/dist/response/ServerAuthorizationTokenResponse.d.ts.map +1 -1
  152. package/dist/telemetry/performance/IPerformanceClient.d.ts +4 -4
  153. package/dist/telemetry/performance/IPerformanceClient.d.ts.map +1 -1
  154. package/dist/telemetry/performance/PerformanceClient.d.ts +2 -2
  155. package/dist/telemetry/performance/PerformanceClient.d.ts.map +1 -1
  156. package/dist/telemetry/performance/PerformanceClient.mjs +1 -1
  157. package/dist/telemetry/performance/PerformanceClient.mjs.map +1 -1
  158. package/dist/telemetry/performance/PerformanceEvent.d.ts +8 -1
  159. package/dist/telemetry/performance/PerformanceEvent.d.ts.map +1 -1
  160. package/dist/telemetry/performance/PerformanceEvent.mjs +9 -1
  161. package/dist/telemetry/performance/PerformanceEvent.mjs.map +1 -1
  162. package/dist/telemetry/performance/StubPerformanceClient.d.ts +3 -3
  163. package/dist/telemetry/performance/StubPerformanceClient.d.ts.map +1 -1
  164. package/dist/telemetry/performance/StubPerformanceClient.mjs +23 -3
  165. package/dist/telemetry/performance/StubPerformanceClient.mjs.map +1 -1
  166. package/dist/telemetry/server/ServerTelemetryManager.d.ts +1 -0
  167. package/dist/telemetry/server/ServerTelemetryManager.d.ts.map +1 -1
  168. package/dist/telemetry/server/ServerTelemetryManager.mjs +4 -4
  169. package/dist/telemetry/server/ServerTelemetryManager.mjs.map +1 -1
  170. package/dist/url/UrlString.d.ts.map +1 -1
  171. package/dist/url/UrlString.mjs +10 -12
  172. package/dist/url/UrlString.mjs.map +1 -1
  173. package/dist/utils/Constants.d.ts +10 -0
  174. package/dist/utils/Constants.d.ts.map +1 -1
  175. package/dist/utils/Constants.mjs +11 -2
  176. package/dist/utils/Constants.mjs.map +1 -1
  177. package/dist/utils/FunctionWrappers.d.ts +28 -0
  178. package/dist/utils/FunctionWrappers.d.ts.map +1 -0
  179. package/dist/utils/FunctionWrappers.mjs +90 -0
  180. package/dist/utils/FunctionWrappers.mjs.map +1 -0
  181. package/dist/utils/ProtocolUtils.d.ts.map +1 -1
  182. package/dist/utils/ProtocolUtils.mjs +4 -7
  183. package/dist/utils/ProtocolUtils.mjs.map +1 -1
  184. package/dist/utils/StringUtils.d.ts +0 -13
  185. package/dist/utils/StringUtils.d.ts.map +1 -1
  186. package/dist/utils/StringUtils.mjs +3 -34
  187. package/dist/utils/StringUtils.mjs.map +1 -1
  188. package/dist/utils/TimeUtils.mjs +1 -1
  189. package/dist/utils/TimeUtils.mjs.map +1 -1
  190. package/package.json +6 -4
  191. package/src/account/AccountInfo.ts +44 -0
  192. package/src/account/AuthToken.ts +70 -0
  193. package/src/account/CcsCredential.ts +16 -0
  194. package/src/account/ClientCredentials.ts +20 -0
  195. package/src/account/ClientInfo.ts +64 -0
  196. package/src/account/TokenClaims.ts +70 -0
  197. package/src/authority/Authority.ts +1225 -0
  198. package/src/authority/AuthorityFactory.ts +106 -0
  199. package/src/authority/AuthorityMetadata.ts +953 -0
  200. package/src/authority/AuthorityOptions.ts +40 -0
  201. package/src/authority/AuthorityType.ts +15 -0
  202. package/src/authority/AzureRegion.ts +7 -0
  203. package/src/authority/AzureRegionConfiguration.ts +16 -0
  204. package/src/authority/CloudDiscoveryMetadata.ts +10 -0
  205. package/src/authority/CloudInstanceDiscoveryErrorResponse.ts +26 -0
  206. package/src/authority/CloudInstanceDiscoveryResponse.ts +21 -0
  207. package/src/authority/ImdsOptions.ts +10 -0
  208. package/src/authority/OIDCOptions.ts +14 -0
  209. package/src/authority/OpenIdConfigResponse.ts +24 -0
  210. package/src/authority/ProtocolMode.ts +13 -0
  211. package/src/authority/RegionDiscovery.ts +193 -0
  212. package/src/authority/RegionDiscoveryMetadata.ts +15 -0
  213. package/src/broker/nativeBroker/INativeBrokerPlugin.ts +29 -0
  214. package/src/cache/CacheManager.ts +1619 -0
  215. package/src/cache/entities/AccessTokenEntity.ts +162 -0
  216. package/src/cache/entities/AccountEntity.ts +309 -0
  217. package/src/cache/entities/AppMetadataEntity.ts +91 -0
  218. package/src/cache/entities/AuthorityMetadataEntity.ts +112 -0
  219. package/src/cache/entities/CacheRecord.ts +33 -0
  220. package/src/cache/entities/CredentialEntity.ts +215 -0
  221. package/src/cache/entities/IdTokenEntity.ts +74 -0
  222. package/src/cache/entities/RefreshTokenEntity.ts +78 -0
  223. package/src/cache/entities/ServerTelemetryEntity.ts +38 -0
  224. package/src/cache/entities/ThrottlingEntity.ts +36 -0
  225. package/src/cache/interface/ICacheManager.ts +218 -0
  226. package/src/cache/interface/ICachePlugin.ts +11 -0
  227. package/src/cache/interface/ISerializableTokenCache.ts +9 -0
  228. package/src/cache/persistence/TokenCacheContext.ts +39 -0
  229. package/src/cache/utils/CacheTypes.ts +93 -0
  230. package/src/client/AuthorizationCodeClient.ts +714 -0
  231. package/src/client/BaseClient.ts +205 -0
  232. package/src/client/RefreshTokenClient.ts +442 -0
  233. package/src/client/SilentFlowClient.ts +186 -0
  234. package/src/config/AppTokenProvider.ts +47 -0
  235. package/src/config/ClientConfiguration.ts +287 -0
  236. package/src/crypto/ICrypto.ts +127 -0
  237. package/src/crypto/IGuidGenerator.ts +9 -0
  238. package/src/crypto/JoseHeader.ts +55 -0
  239. package/src/crypto/PopTokenGenerator.ts +155 -0
  240. package/src/crypto/SignedHttpRequest.ts +16 -0
  241. package/src/error/AuthError.ts +85 -0
  242. package/src/error/ClientAuthError.ts +738 -0
  243. package/src/error/ClientConfigurationError.ts +396 -0
  244. package/src/error/InteractionRequiredAuthError.ts +134 -0
  245. package/src/error/JoseHeaderError.ts +52 -0
  246. package/src/error/ServerError.ts +18 -0
  247. package/src/index.ts +215 -0
  248. package/src/logger/Logger.ts +272 -0
  249. package/src/network/INetworkModule.ts +57 -0
  250. package/src/network/NetworkManager.ts +76 -0
  251. package/src/network/RequestThumbprint.ts +22 -0
  252. package/src/network/ThrottlingUtils.ts +156 -0
  253. package/src/packageMetadata.ts +3 -0
  254. package/src/request/AuthenticationHeaderParser.ts +89 -0
  255. package/src/request/BaseAuthRequest.ts +46 -0
  256. package/src/request/CommonAuthorizationCodeRequest.ts +33 -0
  257. package/src/request/CommonAuthorizationUrlRequest.ts +56 -0
  258. package/src/request/CommonClientCredentialRequest.ts +23 -0
  259. package/src/request/CommonDeviceCodeRequest.ts +31 -0
  260. package/src/request/CommonEndSessionRequest.ts +27 -0
  261. package/src/request/CommonOnBehalfOfRequest.ts +19 -0
  262. package/src/request/CommonRefreshTokenRequest.ts +25 -0
  263. package/src/request/CommonSilentFlowRequest.ts +24 -0
  264. package/src/request/CommonUsernamePasswordRequest.ts +23 -0
  265. package/src/request/NativeRequest.ts +25 -0
  266. package/src/request/NativeSignOutRequest.ts +10 -0
  267. package/src/request/RequestParameterBuilder.ts +606 -0
  268. package/src/request/RequestValidator.ts +103 -0
  269. package/src/request/ScopeSet.ts +230 -0
  270. package/src/request/StoreInCache.ts +16 -0
  271. package/src/response/AuthenticationResult.ts +47 -0
  272. package/src/response/AuthorizationCodePayload.ts +18 -0
  273. package/src/response/DeviceCodeResponse.ts +31 -0
  274. package/src/response/ExternalTokenResponse.ts +24 -0
  275. package/src/response/IMDSBadResponse.ts +9 -0
  276. package/src/response/ResponseHandler.ts +614 -0
  277. package/src/response/ServerAuthorizationCodeResponse.ts +33 -0
  278. package/src/response/ServerAuthorizationTokenResponse.ts +54 -0
  279. package/src/telemetry/performance/IPerformanceClient.ts +71 -0
  280. package/src/telemetry/performance/IPerformanceMeasurement.ts +10 -0
  281. package/src/telemetry/performance/PerformanceClient.ts +635 -0
  282. package/src/telemetry/performance/PerformanceEvent.ts +542 -0
  283. package/src/telemetry/performance/StubPerformanceClient.ts +101 -0
  284. package/src/telemetry/server/ServerTelemetryManager.ts +274 -0
  285. package/src/telemetry/server/ServerTelemetryRequest.ts +13 -0
  286. package/src/url/IUri.ts +17 -0
  287. package/src/url/UrlString.ts +363 -0
  288. package/src/utils/Constants.ts +436 -0
  289. package/src/utils/FunctionWrappers.ts +105 -0
  290. package/src/utils/MsalTypes.ts +9 -0
  291. package/src/utils/ProtocolUtils.ts +124 -0
  292. package/src/utils/StringUtils.ts +106 -0
  293. package/src/utils/TimeUtils.ts +51 -0
  294. package/dist/account/DecodedAuthToken.d.ts +0 -9
  295. package/dist/account/DecodedAuthToken.d.ts.map +0 -1
@@ -0,0 +1,714 @@
1
+ /*
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { BaseClient } from "./BaseClient";
7
+ import { CommonAuthorizationUrlRequest } from "../request/CommonAuthorizationUrlRequest";
8
+ import { CommonAuthorizationCodeRequest } from "../request/CommonAuthorizationCodeRequest";
9
+ import { Authority } from "../authority/Authority";
10
+ import { RequestParameterBuilder } from "../request/RequestParameterBuilder";
11
+ import {
12
+ GrantType,
13
+ AuthenticationScheme,
14
+ PromptValue,
15
+ Separators,
16
+ AADServerParamKeys,
17
+ HeaderNames,
18
+ } from "../utils/Constants";
19
+ import {
20
+ ClientConfiguration,
21
+ isOidcProtocolMode,
22
+ } from "../config/ClientConfiguration";
23
+ import { ServerAuthorizationTokenResponse } from "../response/ServerAuthorizationTokenResponse";
24
+ import { NetworkResponse } from "../network/NetworkManager";
25
+ import { ResponseHandler } from "../response/ResponseHandler";
26
+ import { AuthenticationResult } from "../response/AuthenticationResult";
27
+ import { StringUtils } from "../utils/StringUtils";
28
+ import { ClientAuthError } from "../error/ClientAuthError";
29
+ import { UrlString } from "../url/UrlString";
30
+ import { ServerAuthorizationCodeResponse } from "../response/ServerAuthorizationCodeResponse";
31
+ import { CommonEndSessionRequest } from "../request/CommonEndSessionRequest";
32
+ import { PopTokenGenerator } from "../crypto/PopTokenGenerator";
33
+ import { RequestThumbprint } from "../network/RequestThumbprint";
34
+ import { AuthorizationCodePayload } from "../response/AuthorizationCodePayload";
35
+ import { TimeUtils } from "../utils/TimeUtils";
36
+ import { AccountInfo } from "../account/AccountInfo";
37
+ import {
38
+ buildClientInfoFromHomeAccountId,
39
+ buildClientInfo,
40
+ } from "../account/ClientInfo";
41
+ import { CcsCredentialType, CcsCredential } from "../account/CcsCredential";
42
+ import { ClientConfigurationError } from "../error/ClientConfigurationError";
43
+ import { RequestValidator } from "../request/RequestValidator";
44
+ import { IPerformanceClient } from "../telemetry/performance/IPerformanceClient";
45
+ import { PerformanceEvents } from "../telemetry/performance/PerformanceEvent";
46
+ import { invokeAsync } from "../utils/FunctionWrappers";
47
+
48
+ /**
49
+ * Oauth2.0 Authorization Code client
50
+ * @internal
51
+ */
52
+ export class AuthorizationCodeClient extends BaseClient {
53
+ // Flag to indicate if client is for hybrid spa auth code redemption
54
+ protected includeRedirectUri: boolean = true;
55
+ private oidcDefaultScopes;
56
+
57
+ constructor(
58
+ configuration: ClientConfiguration,
59
+ performanceClient?: IPerformanceClient
60
+ ) {
61
+ super(configuration, performanceClient);
62
+ this.oidcDefaultScopes =
63
+ this.config.authOptions.authority.options.OIDCOptions?.defaultScopes;
64
+ }
65
+
66
+ /**
67
+ * Creates the URL of the authorization request letting the user input credentials and consent to the
68
+ * application. The URL target the /authorize endpoint of the authority configured in the
69
+ * application object.
70
+ *
71
+ * Once the user inputs their credentials and consents, the authority will send a response to the redirect URI
72
+ * sent in the request and should contain an authorization code, which can then be used to acquire tokens via
73
+ * acquireToken(AuthorizationCodeRequest)
74
+ * @param request
75
+ */
76
+ async getAuthCodeUrl(
77
+ request: CommonAuthorizationUrlRequest
78
+ ): Promise<string> {
79
+ this.performanceClient?.addQueueMeasurement(
80
+ PerformanceEvents.GetAuthCodeUrl,
81
+ request.correlationId
82
+ );
83
+
84
+ const queryString = await invokeAsync(
85
+ this.createAuthCodeUrlQueryString.bind(this),
86
+ PerformanceEvents.AuthClientCreateQueryString,
87
+ this.logger,
88
+ this.performanceClient,
89
+ request.correlationId
90
+ )(request);
91
+
92
+ return UrlString.appendQueryString(
93
+ this.authority.authorizationEndpoint,
94
+ queryString
95
+ );
96
+ }
97
+
98
+ /**
99
+ * API to acquire a token in exchange of 'authorization_code` acquired by the user in the first leg of the
100
+ * authorization_code_grant
101
+ * @param request
102
+ */
103
+ async acquireToken(
104
+ request: CommonAuthorizationCodeRequest,
105
+ authCodePayload?: AuthorizationCodePayload
106
+ ): Promise<AuthenticationResult> {
107
+ this.performanceClient?.addQueueMeasurement(
108
+ PerformanceEvents.AuthClientAcquireToken,
109
+ request.correlationId
110
+ );
111
+
112
+ if (!request.code) {
113
+ throw ClientAuthError.createTokenRequestCannotBeMadeError();
114
+ }
115
+
116
+ const reqTimestamp = TimeUtils.nowSeconds();
117
+ const response = await invokeAsync(
118
+ this.executeTokenRequest.bind(this),
119
+ PerformanceEvents.AuthClientExecuteTokenRequest,
120
+ this.logger,
121
+ this.performanceClient,
122
+ request.correlationId
123
+ )(this.authority, request);
124
+
125
+ // Retrieve requestId from response headers
126
+ const requestId = response.headers?.[HeaderNames.X_MS_REQUEST_ID];
127
+
128
+ const responseHandler = new ResponseHandler(
129
+ this.config.authOptions.clientId,
130
+ this.cacheManager,
131
+ this.cryptoUtils,
132
+ this.logger,
133
+ this.config.serializableCache,
134
+ this.config.persistencePlugin,
135
+ this.performanceClient
136
+ );
137
+
138
+ // Validate response. This function throws a server error if an error is returned by the server.
139
+ responseHandler.validateTokenResponse(response.body);
140
+
141
+ return invokeAsync(
142
+ responseHandler.handleServerTokenResponse.bind(responseHandler),
143
+ PerformanceEvents.HandleServerTokenResponse,
144
+ this.logger,
145
+ this.performanceClient,
146
+ request.correlationId
147
+ )(
148
+ response.body,
149
+ this.authority,
150
+ reqTimestamp,
151
+ request,
152
+ authCodePayload,
153
+ undefined,
154
+ undefined,
155
+ undefined,
156
+ requestId
157
+ );
158
+ }
159
+
160
+ /**
161
+ * Handles the hash fragment response from public client code request. Returns a code response used by
162
+ * the client to exchange for a token in acquireToken.
163
+ * @param hashFragment
164
+ */
165
+ handleFragmentResponse(
166
+ hashFragment: string,
167
+ cachedState: string
168
+ ): AuthorizationCodePayload {
169
+ // Handle responses.
170
+ const responseHandler = new ResponseHandler(
171
+ this.config.authOptions.clientId,
172
+ this.cacheManager,
173
+ this.cryptoUtils,
174
+ this.logger,
175
+ null,
176
+ null
177
+ );
178
+
179
+ const serverParams: ServerAuthorizationCodeResponse =
180
+ UrlString.getDeserializedCodeResponse(
181
+ this.config.authOptions.authority.options.OIDCOptions
182
+ ?.serverResponseType,
183
+ hashFragment
184
+ );
185
+
186
+ // Get code response
187
+ responseHandler.validateServerAuthorizationCodeResponse(
188
+ serverParams,
189
+ cachedState,
190
+ this.cryptoUtils
191
+ );
192
+
193
+ // throw when there is no auth code in the response
194
+ if (!serverParams.code) {
195
+ throw ClientAuthError.createNoAuthCodeInServerResponseError();
196
+ }
197
+ return {
198
+ ...serverParams,
199
+ // Code param is optional in ServerAuthorizationCodeResponse but required in AuthorizationCodePaylod
200
+ code: serverParams.code,
201
+ };
202
+ }
203
+
204
+ /**
205
+ * Used to log out the current user, and redirect the user to the postLogoutRedirectUri.
206
+ * Default behaviour is to redirect the user to `window.location.href`.
207
+ * @param authorityUri
208
+ */
209
+ getLogoutUri(logoutRequest: CommonEndSessionRequest): string {
210
+ // Throw error if logoutRequest is null/undefined
211
+ if (!logoutRequest) {
212
+ throw ClientConfigurationError.createEmptyLogoutRequestError();
213
+ }
214
+ const queryString = this.createLogoutUrlQueryString(logoutRequest);
215
+
216
+ // Construct logout URI
217
+ return UrlString.appendQueryString(
218
+ this.authority.endSessionEndpoint,
219
+ queryString
220
+ );
221
+ }
222
+
223
+ /**
224
+ * Executes POST request to token endpoint
225
+ * @param authority
226
+ * @param request
227
+ */
228
+ private async executeTokenRequest(
229
+ authority: Authority,
230
+ request: CommonAuthorizationCodeRequest
231
+ ): Promise<NetworkResponse<ServerAuthorizationTokenResponse>> {
232
+ this.performanceClient?.addQueueMeasurement(
233
+ PerformanceEvents.AuthClientExecuteTokenRequest,
234
+ request.correlationId
235
+ );
236
+
237
+ const queryParametersString = this.createTokenQueryParameters(request);
238
+ const endpoint = UrlString.appendQueryString(
239
+ authority.tokenEndpoint,
240
+ queryParametersString
241
+ );
242
+
243
+ const requestBody = await invokeAsync(
244
+ this.createTokenRequestBody.bind(this),
245
+ PerformanceEvents.AuthClientCreateTokenRequestBody,
246
+ this.logger,
247
+ this.performanceClient,
248
+ request.correlationId
249
+ )(request);
250
+
251
+ let ccsCredential: CcsCredential | undefined = undefined;
252
+ if (request.clientInfo) {
253
+ try {
254
+ const clientInfo = buildClientInfo(
255
+ request.clientInfo,
256
+ this.cryptoUtils
257
+ );
258
+ ccsCredential = {
259
+ credential: `${clientInfo.uid}${Separators.CLIENT_INFO_SEPARATOR}${clientInfo.utid}`,
260
+ type: CcsCredentialType.HOME_ACCOUNT_ID,
261
+ };
262
+ } catch (e) {
263
+ this.logger.verbose(
264
+ "Could not parse client info for CCS Header: " + e
265
+ );
266
+ }
267
+ }
268
+ const headers: Record<string, string> = this.createTokenRequestHeaders(
269
+ ccsCredential || request.ccsCredential
270
+ );
271
+
272
+ const thumbprint: RequestThumbprint = {
273
+ clientId: this.config.authOptions.clientId,
274
+ authority: authority.canonicalAuthority,
275
+ scopes: request.scopes,
276
+ claims: request.claims,
277
+ authenticationScheme: request.authenticationScheme,
278
+ resourceRequestMethod: request.resourceRequestMethod,
279
+ resourceRequestUri: request.resourceRequestUri,
280
+ shrClaims: request.shrClaims,
281
+ sshKid: request.sshKid,
282
+ };
283
+
284
+ return invokeAsync(
285
+ this.executePostToTokenEndpoint.bind(this),
286
+ PerformanceEvents.BaseClientExecutePostToTokenEndpoint,
287
+ this.logger,
288
+ this.performanceClient,
289
+ request.correlationId
290
+ )(endpoint, requestBody, headers, thumbprint, request.correlationId);
291
+ }
292
+
293
+ /**
294
+ * Generates a map for all the params to be sent to the service
295
+ * @param request
296
+ */
297
+ private async createTokenRequestBody(
298
+ request: CommonAuthorizationCodeRequest
299
+ ): Promise<string> {
300
+ this.performanceClient?.addQueueMeasurement(
301
+ PerformanceEvents.AuthClientCreateTokenRequestBody,
302
+ request.correlationId
303
+ );
304
+
305
+ const parameterBuilder = new RequestParameterBuilder();
306
+
307
+ parameterBuilder.addClientId(
308
+ request.tokenBodyParameters?.[AADServerParamKeys.CLIENT_ID] ||
309
+ this.config.authOptions.clientId
310
+ );
311
+
312
+ /*
313
+ * For hybrid spa flow, there will be a code but no verifier
314
+ * In this scenario, don't include redirect uri as auth code will not be bound to redirect URI
315
+ */
316
+ if (!this.includeRedirectUri) {
317
+ // Just validate
318
+ RequestValidator.validateRedirectUri(request.redirectUri);
319
+ } else {
320
+ // Validate and include redirect uri
321
+ parameterBuilder.addRedirectUri(request.redirectUri);
322
+ }
323
+
324
+ // Add scope array, parameter builder will add default scopes and dedupe
325
+ parameterBuilder.addScopes(
326
+ request.scopes,
327
+ true,
328
+ this.oidcDefaultScopes
329
+ );
330
+
331
+ // add code: user set, not validated
332
+ parameterBuilder.addAuthorizationCode(request.code);
333
+
334
+ // Add library metadata
335
+ parameterBuilder.addLibraryInfo(this.config.libraryInfo);
336
+ parameterBuilder.addApplicationTelemetry(
337
+ this.config.telemetry.application
338
+ );
339
+ parameterBuilder.addThrottling();
340
+
341
+ if (this.serverTelemetryManager && !isOidcProtocolMode(this.config)) {
342
+ parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
343
+ }
344
+
345
+ // add code_verifier if passed
346
+ if (request.codeVerifier) {
347
+ parameterBuilder.addCodeVerifier(request.codeVerifier);
348
+ }
349
+
350
+ if (this.config.clientCredentials.clientSecret) {
351
+ parameterBuilder.addClientSecret(
352
+ this.config.clientCredentials.clientSecret
353
+ );
354
+ }
355
+
356
+ if (this.config.clientCredentials.clientAssertion) {
357
+ const clientAssertion =
358
+ this.config.clientCredentials.clientAssertion;
359
+ parameterBuilder.addClientAssertion(clientAssertion.assertion);
360
+ parameterBuilder.addClientAssertionType(
361
+ clientAssertion.assertionType
362
+ );
363
+ }
364
+
365
+ parameterBuilder.addGrantType(GrantType.AUTHORIZATION_CODE_GRANT);
366
+ parameterBuilder.addClientInfo();
367
+
368
+ if (request.authenticationScheme === AuthenticationScheme.POP) {
369
+ const popTokenGenerator = new PopTokenGenerator(
370
+ this.cryptoUtils,
371
+ this.performanceClient
372
+ );
373
+
374
+ this.performanceClient?.setPreQueueTime(
375
+ PerformanceEvents.PopTokenGenerateCnf,
376
+ request.correlationId
377
+ );
378
+ const reqCnfData = await popTokenGenerator.generateCnf(request);
379
+ // SPA PoP requires full Base64Url encoded req_cnf string (unhashed)
380
+ parameterBuilder.addPopToken(reqCnfData.reqCnfString);
381
+ } else if (request.authenticationScheme === AuthenticationScheme.SSH) {
382
+ if (request.sshJwk) {
383
+ parameterBuilder.addSshJwk(request.sshJwk);
384
+ } else {
385
+ throw ClientConfigurationError.createMissingSshJwkError();
386
+ }
387
+ }
388
+
389
+ const correlationId =
390
+ request.correlationId ||
391
+ this.config.cryptoInterface.createNewGuid();
392
+ parameterBuilder.addCorrelationId(correlationId);
393
+
394
+ if (
395
+ !StringUtils.isEmptyObj(request.claims) ||
396
+ (this.config.authOptions.clientCapabilities &&
397
+ this.config.authOptions.clientCapabilities.length > 0)
398
+ ) {
399
+ parameterBuilder.addClaims(
400
+ request.claims,
401
+ this.config.authOptions.clientCapabilities
402
+ );
403
+ }
404
+
405
+ let ccsCred: CcsCredential | undefined = undefined;
406
+ if (request.clientInfo) {
407
+ try {
408
+ const clientInfo = buildClientInfo(
409
+ request.clientInfo,
410
+ this.cryptoUtils
411
+ );
412
+ ccsCred = {
413
+ credential: `${clientInfo.uid}${Separators.CLIENT_INFO_SEPARATOR}${clientInfo.utid}`,
414
+ type: CcsCredentialType.HOME_ACCOUNT_ID,
415
+ };
416
+ } catch (e) {
417
+ this.logger.verbose(
418
+ "Could not parse client info for CCS Header: " + e
419
+ );
420
+ }
421
+ } else {
422
+ ccsCred = request.ccsCredential;
423
+ }
424
+
425
+ // Adds these as parameters in the request instead of headers to prevent CORS preflight request
426
+ if (this.config.systemOptions.preventCorsPreflight && ccsCred) {
427
+ switch (ccsCred.type) {
428
+ case CcsCredentialType.HOME_ACCOUNT_ID:
429
+ try {
430
+ const clientInfo = buildClientInfoFromHomeAccountId(
431
+ ccsCred.credential
432
+ );
433
+ parameterBuilder.addCcsOid(clientInfo);
434
+ } catch (e) {
435
+ this.logger.verbose(
436
+ "Could not parse home account ID for CCS Header: " +
437
+ e
438
+ );
439
+ }
440
+ break;
441
+ case CcsCredentialType.UPN:
442
+ parameterBuilder.addCcsUpn(ccsCred.credential);
443
+ break;
444
+ }
445
+ }
446
+
447
+ if (request.tokenBodyParameters) {
448
+ parameterBuilder.addExtraQueryParameters(
449
+ request.tokenBodyParameters
450
+ );
451
+ }
452
+
453
+ // Add hybrid spa parameters if not already provided
454
+ if (
455
+ request.enableSpaAuthorizationCode &&
456
+ (!request.tokenBodyParameters ||
457
+ !request.tokenBodyParameters[
458
+ AADServerParamKeys.RETURN_SPA_CODE
459
+ ])
460
+ ) {
461
+ parameterBuilder.addExtraQueryParameters({
462
+ [AADServerParamKeys.RETURN_SPA_CODE]: "1",
463
+ });
464
+ }
465
+
466
+ return parameterBuilder.createQueryString();
467
+ }
468
+
469
+ /**
470
+ * This API validates the `AuthorizationCodeUrlRequest` and creates a URL
471
+ * @param request
472
+ */
473
+ private async createAuthCodeUrlQueryString(
474
+ request: CommonAuthorizationUrlRequest
475
+ ): Promise<string> {
476
+ this.performanceClient?.addQueueMeasurement(
477
+ PerformanceEvents.AuthClientCreateQueryString,
478
+ request.correlationId
479
+ );
480
+
481
+ const parameterBuilder = new RequestParameterBuilder();
482
+
483
+ parameterBuilder.addClientId(
484
+ request.extraQueryParameters?.[AADServerParamKeys.CLIENT_ID] ||
485
+ this.config.authOptions.clientId
486
+ );
487
+
488
+ const requestScopes = [
489
+ ...(request.scopes || []),
490
+ ...(request.extraScopesToConsent || []),
491
+ ];
492
+ parameterBuilder.addScopes(requestScopes, true, this.oidcDefaultScopes);
493
+
494
+ // validate the redirectUri (to be a non null value)
495
+ parameterBuilder.addRedirectUri(request.redirectUri);
496
+
497
+ // generate the correlationId if not set by the user and add
498
+ const correlationId =
499
+ request.correlationId ||
500
+ this.config.cryptoInterface.createNewGuid();
501
+ parameterBuilder.addCorrelationId(correlationId);
502
+
503
+ // add response_mode. If not passed in it defaults to query.
504
+ parameterBuilder.addResponseMode(request.responseMode);
505
+
506
+ // add response_type = code
507
+ parameterBuilder.addResponseTypeCode();
508
+
509
+ // add library info parameters
510
+ parameterBuilder.addLibraryInfo(this.config.libraryInfo);
511
+ if (!isOidcProtocolMode(this.config)) {
512
+ parameterBuilder.addApplicationTelemetry(
513
+ this.config.telemetry.application
514
+ );
515
+ }
516
+
517
+ // add client_info=1
518
+ parameterBuilder.addClientInfo();
519
+
520
+ if (request.codeChallenge && request.codeChallengeMethod) {
521
+ parameterBuilder.addCodeChallengeParams(
522
+ request.codeChallenge,
523
+ request.codeChallengeMethod
524
+ );
525
+ }
526
+
527
+ if (request.prompt) {
528
+ parameterBuilder.addPrompt(request.prompt);
529
+ }
530
+
531
+ if (request.domainHint) {
532
+ parameterBuilder.addDomainHint(request.domainHint);
533
+ }
534
+
535
+ // Add sid or loginHint with preference for login_hint claim (in request) -> sid -> loginHint (upn/email) -> username of AccountInfo object
536
+ if (request.prompt !== PromptValue.SELECT_ACCOUNT) {
537
+ // AAD will throw if prompt=select_account is passed with an account hint
538
+ if (request.sid && request.prompt === PromptValue.NONE) {
539
+ // SessionID is only used in silent calls
540
+ this.logger.verbose(
541
+ "createAuthCodeUrlQueryString: Prompt is none, adding sid from request"
542
+ );
543
+ parameterBuilder.addSid(request.sid);
544
+ } else if (request.account) {
545
+ const accountSid = this.extractAccountSid(request.account);
546
+ const accountLoginHintClaim = this.extractLoginHint(
547
+ request.account
548
+ );
549
+ // If login_hint claim is present, use it over sid/username
550
+ if (accountLoginHintClaim) {
551
+ this.logger.verbose(
552
+ "createAuthCodeUrlQueryString: login_hint claim present on account"
553
+ );
554
+ parameterBuilder.addLoginHint(accountLoginHintClaim);
555
+ try {
556
+ const clientInfo = buildClientInfoFromHomeAccountId(
557
+ request.account.homeAccountId
558
+ );
559
+ parameterBuilder.addCcsOid(clientInfo);
560
+ } catch (e) {
561
+ this.logger.verbose(
562
+ "createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header"
563
+ );
564
+ }
565
+ } else if (accountSid && request.prompt === PromptValue.NONE) {
566
+ /*
567
+ * If account and loginHint are provided, we will check account first for sid before adding loginHint
568
+ * SessionId is only used in silent calls
569
+ */
570
+ this.logger.verbose(
571
+ "createAuthCodeUrlQueryString: Prompt is none, adding sid from account"
572
+ );
573
+ parameterBuilder.addSid(accountSid);
574
+ try {
575
+ const clientInfo = buildClientInfoFromHomeAccountId(
576
+ request.account.homeAccountId
577
+ );
578
+ parameterBuilder.addCcsOid(clientInfo);
579
+ } catch (e) {
580
+ this.logger.verbose(
581
+ "createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header"
582
+ );
583
+ }
584
+ } else if (request.loginHint) {
585
+ this.logger.verbose(
586
+ "createAuthCodeUrlQueryString: Adding login_hint from request"
587
+ );
588
+ parameterBuilder.addLoginHint(request.loginHint);
589
+ parameterBuilder.addCcsUpn(request.loginHint);
590
+ } else if (request.account.username) {
591
+ // Fallback to account username if provided
592
+ this.logger.verbose(
593
+ "createAuthCodeUrlQueryString: Adding login_hint from account"
594
+ );
595
+ parameterBuilder.addLoginHint(request.account.username);
596
+ try {
597
+ const clientInfo = buildClientInfoFromHomeAccountId(
598
+ request.account.homeAccountId
599
+ );
600
+ parameterBuilder.addCcsOid(clientInfo);
601
+ } catch (e) {
602
+ this.logger.verbose(
603
+ "createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header"
604
+ );
605
+ }
606
+ }
607
+ } else if (request.loginHint) {
608
+ this.logger.verbose(
609
+ "createAuthCodeUrlQueryString: No account, adding login_hint from request"
610
+ );
611
+ parameterBuilder.addLoginHint(request.loginHint);
612
+ parameterBuilder.addCcsUpn(request.loginHint);
613
+ }
614
+ } else {
615
+ this.logger.verbose(
616
+ "createAuthCodeUrlQueryString: Prompt is select_account, ignoring account hints"
617
+ );
618
+ }
619
+
620
+ if (request.nonce) {
621
+ parameterBuilder.addNonce(request.nonce);
622
+ }
623
+
624
+ if (request.state) {
625
+ parameterBuilder.addState(request.state);
626
+ }
627
+
628
+ if (
629
+ request.claims ||
630
+ (this.config.authOptions.clientCapabilities &&
631
+ this.config.authOptions.clientCapabilities.length > 0)
632
+ ) {
633
+ parameterBuilder.addClaims(
634
+ request.claims,
635
+ this.config.authOptions.clientCapabilities
636
+ );
637
+ }
638
+
639
+ if (request.extraQueryParameters) {
640
+ parameterBuilder.addExtraQueryParameters(
641
+ request.extraQueryParameters
642
+ );
643
+ }
644
+
645
+ if (request.nativeBroker) {
646
+ // signal ests that this is a WAM call
647
+ parameterBuilder.addNativeBroker();
648
+
649
+ // pass the req_cnf for POP
650
+ if (request.authenticationScheme === AuthenticationScheme.POP) {
651
+ const popTokenGenerator = new PopTokenGenerator(
652
+ this.cryptoUtils
653
+ );
654
+ // to reduce the URL length, it is recommended to send the hash of the req_cnf instead of the whole string
655
+ const reqCnfData = await popTokenGenerator.generateCnf(request);
656
+ parameterBuilder.addPopToken(reqCnfData.reqCnfHash);
657
+ }
658
+ }
659
+
660
+ return parameterBuilder.createQueryString();
661
+ }
662
+
663
+ /**
664
+ * This API validates the `EndSessionRequest` and creates a URL
665
+ * @param request
666
+ */
667
+ private createLogoutUrlQueryString(
668
+ request: CommonEndSessionRequest
669
+ ): string {
670
+ const parameterBuilder = new RequestParameterBuilder();
671
+
672
+ if (request.postLogoutRedirectUri) {
673
+ parameterBuilder.addPostLogoutRedirectUri(
674
+ request.postLogoutRedirectUri
675
+ );
676
+ }
677
+
678
+ if (request.correlationId) {
679
+ parameterBuilder.addCorrelationId(request.correlationId);
680
+ }
681
+
682
+ if (request.idTokenHint) {
683
+ parameterBuilder.addIdTokenHint(request.idTokenHint);
684
+ }
685
+
686
+ if (request.state) {
687
+ parameterBuilder.addState(request.state);
688
+ }
689
+
690
+ if (request.logoutHint) {
691
+ parameterBuilder.addLogoutHint(request.logoutHint);
692
+ }
693
+
694
+ if (request.extraQueryParameters) {
695
+ parameterBuilder.addExtraQueryParameters(
696
+ request.extraQueryParameters
697
+ );
698
+ }
699
+
700
+ return parameterBuilder.createQueryString();
701
+ }
702
+
703
+ /**
704
+ * Helper to get sid from account. Returns null if idTokenClaims are not present or sid is not present.
705
+ * @param account
706
+ */
707
+ private extractAccountSid(account: AccountInfo): string | null {
708
+ return account.idTokenClaims?.sid || null;
709
+ }
710
+
711
+ private extractLoginHint(account: AccountInfo): string | null {
712
+ return account.idTokenClaims?.login_hint || null;
713
+ }
714
+ }