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