@azure/msal-common 16.11.3 → 16.13.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 (269) hide show
  1. package/dist/account/AccountInfo.mjs +1 -1
  2. package/dist/account/AuthToken.mjs +1 -1
  3. package/dist/account/CcsCredential.mjs +1 -1
  4. package/dist/account/ClientInfo.mjs +1 -1
  5. package/dist/account/TokenClaims.mjs +1 -1
  6. package/dist/authority/Authority.mjs +1 -1
  7. package/dist/authority/AuthorityFactory.mjs +1 -1
  8. package/dist/authority/AuthorityMetadata.mjs +2 -5
  9. package/dist/authority/AuthorityMetadata.mjs.map +1 -1
  10. package/dist/authority/AuthorityOptions.mjs +1 -1
  11. package/dist/authority/AuthorityType.mjs +1 -1
  12. package/dist/authority/CloudInstanceDiscoveryErrorResponse.mjs +1 -1
  13. package/dist/authority/CloudInstanceDiscoveryResponse.mjs +1 -1
  14. package/dist/authority/OpenIdConfigResponse.mjs +1 -1
  15. package/dist/authority/ProtocolMode.mjs +1 -1
  16. package/dist/authority/RegionDiscovery.mjs +1 -1
  17. package/dist/cache/CacheManager.mjs +55 -19
  18. package/dist/cache/CacheManager.mjs.map +1 -1
  19. package/dist/cache/persistence/TokenCacheContext.mjs +1 -1
  20. package/dist/cache/utils/AccountEntityUtils.mjs +1 -1
  21. package/dist/cache/utils/CacheHelpers.mjs +24 -4
  22. package/dist/cache/utils/CacheHelpers.mjs.map +1 -1
  23. package/dist/client/AuthorizationCodeClient.mjs +10 -4
  24. package/dist/client/AuthorizationCodeClient.mjs.map +1 -1
  25. package/dist/client/RefreshTokenClient.mjs +10 -4
  26. package/dist/client/RefreshTokenClient.mjs.map +1 -1
  27. package/dist/client/SilentFlowClient.mjs +5 -2
  28. package/dist/client/SilentFlowClient.mjs.map +1 -1
  29. package/dist/config/ClientConfiguration.mjs +4 -2
  30. package/dist/config/ClientConfiguration.mjs.map +1 -1
  31. package/dist/constants/AADServerParamKeys.mjs +4 -3
  32. package/dist/constants/AADServerParamKeys.mjs.map +1 -1
  33. package/dist/crypto/ICrypto.mjs +16 -11
  34. package/dist/crypto/ICrypto.mjs.map +1 -1
  35. package/dist/crypto/ITokenBindingKeyManager.mjs +28 -0
  36. package/dist/crypto/ITokenBindingKeyManager.mjs.map +1 -0
  37. package/dist/crypto/JoseHeader.mjs +38 -11
  38. package/dist/crypto/JoseHeader.mjs.map +1 -1
  39. package/dist/crypto/PopTokenGenerator.mjs +28 -5
  40. package/dist/crypto/PopTokenGenerator.mjs.map +1 -1
  41. package/dist/error/AuthError.mjs +1 -1
  42. package/dist/error/AuthErrorCodes.mjs +1 -1
  43. package/dist/error/CacheError.mjs +1 -1
  44. package/dist/error/CacheErrorCodes.mjs +1 -1
  45. package/dist/error/ClientAuthError.mjs +1 -1
  46. package/dist/error/ClientAuthErrorCodes.mjs +1 -1
  47. package/dist/error/ClientConfigurationError.mjs +1 -1
  48. package/dist/error/ClientConfigurationErrorCodes.mjs +3 -2
  49. package/dist/error/ClientConfigurationErrorCodes.mjs.map +1 -1
  50. package/dist/error/InteractionRequiredAuthError.mjs +1 -1
  51. package/dist/error/InteractionRequiredAuthErrorCodes.mjs +1 -1
  52. package/dist/error/JoseHeaderError.mjs +1 -1
  53. package/dist/error/JoseHeaderErrorCodes.mjs +5 -3
  54. package/dist/error/JoseHeaderErrorCodes.mjs.map +1 -1
  55. package/dist/error/NetworkError.mjs +1 -1
  56. package/dist/error/PlatformBrokerError.mjs +1 -1
  57. package/dist/error/ServerError.mjs +1 -1
  58. package/dist/index-node.mjs +3 -2
  59. package/dist/index-node.mjs.map +1 -1
  60. package/dist/index.mjs +3 -2
  61. package/dist/index.mjs.map +1 -1
  62. package/dist/logger/Logger.mjs +1 -1
  63. package/dist/network/INetworkModule.mjs +1 -1
  64. package/dist/network/RequestThumbprint.mjs +4 -1
  65. package/dist/network/RequestThumbprint.mjs.map +1 -1
  66. package/dist/network/ThrottlingUtils.mjs +1 -1
  67. package/dist/packageMetadata.mjs +2 -2
  68. package/dist/protocol/Authorize.mjs +1 -1
  69. package/dist/protocol/Token.mjs +1 -1
  70. package/dist/request/AuthenticationHeaderParser.mjs +1 -1
  71. package/dist/request/BaseAuthRequest.mjs +1 -1
  72. package/dist/request/BaseAuthRequest.mjs.map +1 -1
  73. package/dist/request/RequestParameterBuilder.mjs +94 -26
  74. package/dist/request/RequestParameterBuilder.mjs.map +1 -1
  75. package/dist/request/ScopeSet.mjs +1 -1
  76. package/dist/response/ResponseHandler.mjs +30 -8
  77. package/dist/response/ResponseHandler.mjs.map +1 -1
  78. package/dist/telemetry/performance/PerformanceClient.mjs +1 -1
  79. package/dist/telemetry/performance/PerformanceEvent.mjs +1 -1
  80. package/dist/telemetry/performance/PerformanceEvent.mjs.map +1 -1
  81. package/dist/telemetry/performance/PerformanceEvents.mjs +1 -1
  82. package/dist/telemetry/performance/StubPerformanceClient.mjs +1 -1
  83. package/dist/telemetry/server/ServerTelemetryManager.mjs +1 -1
  84. package/dist/url/UrlString.mjs +1 -1
  85. package/dist/utils/ClientAssertionUtils.mjs +1 -1
  86. package/dist/utils/Constants.mjs +2 -1
  87. package/dist/utils/Constants.mjs.map +1 -1
  88. package/dist/utils/FunctionWrappers.mjs +1 -1
  89. package/dist/utils/ObjectUtils.mjs +28 -0
  90. package/dist/utils/ObjectUtils.mjs.map +1 -0
  91. package/dist/utils/ProtocolUtils.mjs +1 -1
  92. package/dist/utils/StringUtils.mjs +1 -1
  93. package/dist/utils/TimeUtils.mjs +1 -1
  94. package/dist/utils/UrlUtils.mjs +1 -1
  95. package/dist-browser/account/AccountInfo.mjs +1 -1
  96. package/dist-browser/account/AuthToken.mjs +1 -1
  97. package/dist-browser/account/CcsCredential.mjs +1 -1
  98. package/dist-browser/account/ClientInfo.mjs +1 -1
  99. package/dist-browser/account/TokenClaims.mjs +1 -1
  100. package/dist-browser/authority/Authority.mjs +1 -1
  101. package/dist-browser/authority/AuthorityFactory.mjs +1 -1
  102. package/dist-browser/authority/AuthorityMetadata.mjs +2 -5
  103. package/dist-browser/authority/AuthorityMetadata.mjs.map +1 -1
  104. package/dist-browser/authority/AuthorityOptions.mjs +1 -1
  105. package/dist-browser/authority/AuthorityType.mjs +1 -1
  106. package/dist-browser/authority/CloudInstanceDiscoveryErrorResponse.mjs +1 -1
  107. package/dist-browser/authority/CloudInstanceDiscoveryResponse.mjs +1 -1
  108. package/dist-browser/authority/OpenIdConfigResponse.mjs +1 -1
  109. package/dist-browser/authority/ProtocolMode.mjs +1 -1
  110. package/dist-browser/authority/RegionDiscovery.mjs +1 -1
  111. package/dist-browser/cache/CacheManager.mjs +55 -19
  112. package/dist-browser/cache/CacheManager.mjs.map +1 -1
  113. package/dist-browser/cache/persistence/TokenCacheContext.mjs +1 -1
  114. package/dist-browser/cache/utils/AccountEntityUtils.mjs +1 -1
  115. package/dist-browser/cache/utils/CacheHelpers.mjs +24 -4
  116. package/dist-browser/cache/utils/CacheHelpers.mjs.map +1 -1
  117. package/dist-browser/client/AuthorizationCodeClient.mjs +10 -4
  118. package/dist-browser/client/AuthorizationCodeClient.mjs.map +1 -1
  119. package/dist-browser/client/RefreshTokenClient.mjs +10 -4
  120. package/dist-browser/client/RefreshTokenClient.mjs.map +1 -1
  121. package/dist-browser/client/SilentFlowClient.mjs +5 -2
  122. package/dist-browser/client/SilentFlowClient.mjs.map +1 -1
  123. package/dist-browser/config/ClientConfiguration.mjs +4 -2
  124. package/dist-browser/config/ClientConfiguration.mjs.map +1 -1
  125. package/dist-browser/constants/AADServerParamKeys.mjs +4 -3
  126. package/dist-browser/constants/AADServerParamKeys.mjs.map +1 -1
  127. package/dist-browser/crypto/ICrypto.mjs +16 -11
  128. package/dist-browser/crypto/ICrypto.mjs.map +1 -1
  129. package/dist-browser/crypto/ITokenBindingKeyManager.mjs +28 -0
  130. package/dist-browser/crypto/ITokenBindingKeyManager.mjs.map +1 -0
  131. package/dist-browser/crypto/JoseHeader.mjs +38 -11
  132. package/dist-browser/crypto/JoseHeader.mjs.map +1 -1
  133. package/dist-browser/crypto/PopTokenGenerator.mjs +28 -5
  134. package/dist-browser/crypto/PopTokenGenerator.mjs.map +1 -1
  135. package/dist-browser/error/AuthError.mjs +1 -1
  136. package/dist-browser/error/AuthErrorCodes.mjs +1 -1
  137. package/dist-browser/error/CacheError.mjs +1 -1
  138. package/dist-browser/error/CacheErrorCodes.mjs +1 -1
  139. package/dist-browser/error/ClientAuthError.mjs +1 -1
  140. package/dist-browser/error/ClientAuthErrorCodes.mjs +1 -1
  141. package/dist-browser/error/ClientConfigurationError.mjs +1 -1
  142. package/dist-browser/error/ClientConfigurationErrorCodes.mjs +3 -2
  143. package/dist-browser/error/ClientConfigurationErrorCodes.mjs.map +1 -1
  144. package/dist-browser/error/InteractionRequiredAuthError.mjs +1 -1
  145. package/dist-browser/error/InteractionRequiredAuthErrorCodes.mjs +1 -1
  146. package/dist-browser/error/JoseHeaderError.mjs +1 -1
  147. package/dist-browser/error/JoseHeaderErrorCodes.mjs +5 -3
  148. package/dist-browser/error/JoseHeaderErrorCodes.mjs.map +1 -1
  149. package/dist-browser/error/NetworkError.mjs +1 -1
  150. package/dist-browser/error/PlatformBrokerError.mjs +1 -1
  151. package/dist-browser/error/ServerError.mjs +1 -1
  152. package/dist-browser/index-browser.mjs +3 -2
  153. package/dist-browser/index-browser.mjs.map +1 -1
  154. package/dist-browser/index.mjs +3 -2
  155. package/dist-browser/index.mjs.map +1 -1
  156. package/dist-browser/log-strings-mapping.json +2 -2
  157. package/dist-browser/logger/Logger.mjs +1 -1
  158. package/dist-browser/network/INetworkModule.mjs +1 -1
  159. package/dist-browser/network/RequestThumbprint.mjs +4 -1
  160. package/dist-browser/network/RequestThumbprint.mjs.map +1 -1
  161. package/dist-browser/network/ThrottlingUtils.mjs +1 -1
  162. package/dist-browser/packageMetadata.mjs +2 -2
  163. package/dist-browser/protocol/Authorize.mjs +1 -1
  164. package/dist-browser/protocol/Token.mjs +1 -1
  165. package/dist-browser/request/AuthenticationHeaderParser.mjs +1 -1
  166. package/dist-browser/request/BaseAuthRequest.mjs +1 -1
  167. package/dist-browser/request/BaseAuthRequest.mjs.map +1 -1
  168. package/dist-browser/request/RequestParameterBuilder.mjs +94 -26
  169. package/dist-browser/request/RequestParameterBuilder.mjs.map +1 -1
  170. package/dist-browser/request/ScopeSet.mjs +1 -1
  171. package/dist-browser/response/ResponseHandler.mjs +30 -8
  172. package/dist-browser/response/ResponseHandler.mjs.map +1 -1
  173. package/dist-browser/telemetry/performance/PerformanceClient.mjs +1 -1
  174. package/dist-browser/telemetry/performance/PerformanceEvent.mjs +1 -1
  175. package/dist-browser/telemetry/performance/PerformanceEvent.mjs.map +1 -1
  176. package/dist-browser/telemetry/performance/PerformanceEvents.mjs +1 -1
  177. package/dist-browser/telemetry/performance/StubPerformanceClient.mjs +1 -1
  178. package/dist-browser/telemetry/server/ServerTelemetryManager.mjs +1 -1
  179. package/dist-browser/url/UrlString.mjs +1 -1
  180. package/dist-browser/utils/ClientAssertionUtils.mjs +1 -1
  181. package/dist-browser/utils/Constants.mjs +2 -1
  182. package/dist-browser/utils/Constants.mjs.map +1 -1
  183. package/dist-browser/utils/FunctionWrappers.mjs +1 -1
  184. package/dist-browser/utils/ObjectUtils.mjs +28 -0
  185. package/dist-browser/utils/ObjectUtils.mjs.map +1 -0
  186. package/dist-browser/utils/ProtocolUtils.mjs +1 -1
  187. package/dist-browser/utils/StringUtils.mjs +1 -1
  188. package/dist-browser/utils/TimeUtils.mjs +1 -1
  189. package/dist-browser/utils/UrlUtils.mjs +1 -1
  190. package/lib/index-browser.cjs +5 -67
  191. package/lib/index-browser.cjs.map +1 -1
  192. package/lib/{index-node-JVUj78ag.js → index-node-BaODPZEy.js} +404 -75
  193. package/lib/index-node-BaODPZEy.js.map +1 -0
  194. package/lib/index-node.cjs +4 -2
  195. package/lib/index-node.cjs.map +1 -1
  196. package/lib/index.cjs +5 -3
  197. package/lib/index.cjs.map +1 -1
  198. package/package.json +1 -1
  199. package/src/authority/AuthorityMetadata.ts +1 -4
  200. package/src/cache/CacheManager.ts +100 -29
  201. package/src/cache/interface/ICacheManager.ts +7 -4
  202. package/src/cache/utils/CacheHelpers.ts +28 -1
  203. package/src/client/AuthorizationCodeClient.ts +16 -1
  204. package/src/client/RefreshTokenClient.ts +16 -1
  205. package/src/client/SilentFlowClient.ts +4 -1
  206. package/src/config/ClientConfiguration.ts +10 -0
  207. package/src/constants/AADServerParamKeys.ts +1 -0
  208. package/src/crypto/DpopProofGenerator.ts +52 -59
  209. package/src/crypto/ICrypto.ts +31 -26
  210. package/src/crypto/ITokenBindingKeyManager.ts +84 -0
  211. package/src/crypto/JoseHeader.ts +74 -14
  212. package/src/crypto/PopTokenGenerator.ts +62 -18
  213. package/src/error/ClientConfigurationErrorCodes.ts +2 -0
  214. package/src/error/JoseHeaderErrorCodes.ts +2 -0
  215. package/src/exports-common.ts +7 -0
  216. package/src/network/RequestThumbprint.ts +5 -0
  217. package/src/packageMetadata.ts +1 -1
  218. package/src/request/BaseAuthRequest.ts +4 -0
  219. package/src/request/RequestParameterBuilder.ts +119 -26
  220. package/src/response/ResponseHandler.ts +56 -15
  221. package/src/telemetry/performance/PerformanceEvent.ts +15 -0
  222. package/src/utils/Constants.ts +1 -0
  223. package/src/utils/ObjectUtils.ts +31 -0
  224. package/types/authority/AuthorityMetadata.d.ts.map +1 -1
  225. package/types/cache/CacheManager.d.ts +14 -7
  226. package/types/cache/CacheManager.d.ts.map +1 -1
  227. package/types/cache/interface/ICacheManager.d.ts +6 -4
  228. package/types/cache/interface/ICacheManager.d.ts.map +1 -1
  229. package/types/cache/utils/CacheHelpers.d.ts +7 -0
  230. package/types/cache/utils/CacheHelpers.d.ts.map +1 -1
  231. package/types/client/AuthorizationCodeClient.d.ts.map +1 -1
  232. package/types/client/RefreshTokenClient.d.ts.map +1 -1
  233. package/types/client/SilentFlowClient.d.ts.map +1 -1
  234. package/types/config/ClientConfiguration.d.ts +5 -1
  235. package/types/config/ClientConfiguration.d.ts.map +1 -1
  236. package/types/constants/AADServerParamKeys.d.ts +1 -0
  237. package/types/constants/AADServerParamKeys.d.ts.map +1 -1
  238. package/types/crypto/DpopProofGenerator.d.ts +10 -36
  239. package/types/crypto/DpopProofGenerator.d.ts.map +1 -1
  240. package/types/crypto/ICrypto.d.ts +10 -9
  241. package/types/crypto/ICrypto.d.ts.map +1 -1
  242. package/types/crypto/ITokenBindingKeyManager.d.ts +41 -0
  243. package/types/crypto/ITokenBindingKeyManager.d.ts.map +1 -0
  244. package/types/crypto/JoseHeader.d.ts +17 -5
  245. package/types/crypto/JoseHeader.d.ts.map +1 -1
  246. package/types/crypto/PopTokenGenerator.d.ts +3 -1
  247. package/types/crypto/PopTokenGenerator.d.ts.map +1 -1
  248. package/types/error/ClientConfigurationErrorCodes.d.ts +1 -0
  249. package/types/error/ClientConfigurationErrorCodes.d.ts.map +1 -1
  250. package/types/error/JoseHeaderErrorCodes.d.ts +2 -0
  251. package/types/error/JoseHeaderErrorCodes.d.ts.map +1 -1
  252. package/types/exports-common.d.ts +3 -2
  253. package/types/exports-common.d.ts.map +1 -1
  254. package/types/network/RequestThumbprint.d.ts +1 -0
  255. package/types/network/RequestThumbprint.d.ts.map +1 -1
  256. package/types/packageMetadata.d.ts +1 -1
  257. package/types/request/BaseAuthRequest.d.ts +4 -0
  258. package/types/request/BaseAuthRequest.d.ts.map +1 -1
  259. package/types/request/RequestParameterBuilder.d.ts +22 -4
  260. package/types/request/RequestParameterBuilder.d.ts.map +1 -1
  261. package/types/response/ResponseHandler.d.ts +12 -2
  262. package/types/response/ResponseHandler.d.ts.map +1 -1
  263. package/types/telemetry/performance/PerformanceEvent.d.ts +12 -0
  264. package/types/telemetry/performance/PerformanceEvent.d.ts.map +1 -1
  265. package/types/utils/Constants.d.ts +1 -0
  266. package/types/utils/Constants.d.ts.map +1 -1
  267. package/types/utils/ObjectUtils.d.ts +6 -0
  268. package/types/utils/ObjectUtils.d.ts.map +1 -0
  269. package/lib/index-node-JVUj78ag.js.map +0 -1
@@ -1,4 +1,4 @@
1
- /*! @azure/msal-common v16.11.3 2026-07-29 */
1
+ /*! @azure/msal-common v16.13.0 2026-08-18 */
2
2
  'use strict';
3
3
  'use strict';
4
4
 
@@ -266,6 +266,7 @@ const invalidAuthorityMetadata = "invalid_authority_metadata";
266
266
  const untrustedAuthority = "untrusted_authority";
267
267
  const missingSshJwk = "missing_ssh_jwk";
268
268
  const missingSshKid = "missing_ssh_kid";
269
+ const unsupportedAuthenticationScheme = "unsupported_authentication_scheme";
269
270
  const missingNonceAuthenticationHeader = "missing_nonce_authentication_header";
270
271
  const invalidAuthenticationHeader = "invalid_authentication_header";
271
272
  const cannotSetOIDCOptions = "cannot_set_OIDCOptions";
@@ -304,6 +305,7 @@ var ClientConfigurationErrorCodes = /*#__PURE__*/Object.freeze({
304
305
  pkceParamsMissing: pkceParamsMissing,
305
306
  redirectUriEmpty: redirectUriEmpty,
306
307
  tokenRequestEmpty: tokenRequestEmpty,
308
+ unsupportedAuthenticationScheme: unsupportedAuthenticationScheme,
307
309
  untrustedAuthority: untrustedAuthority,
308
310
  urlEmptyError: urlEmptyError,
309
311
  urlParseError: urlParseError
@@ -694,6 +696,7 @@ const JsonWebTokenTypes = {
694
696
  Jwt: "JWT",
695
697
  Jwk: "JWK",
696
698
  Pop: "pop",
699
+ Dpop: "dpop+jwt",
697
700
  };
698
701
  const ONE_DAY_IN_MS = 86400000;
699
702
  // Token renewal offset default in seconds
@@ -971,10 +974,7 @@ class UrlString {
971
974
  // Build endpoint metadata dynamically to avoid string duplication
972
975
  const endpointHosts = [
973
976
  { host: "login.microsoftonline.com" },
974
- {
975
- host: "login.chinacloudapi.cn",
976
- issuerHost: "login.partner.microsoftonline.cn", // Issuer differs
977
- },
977
+ { host: "login.partner.microsoftonline.cn" },
978
978
  { host: "login.microsoftonline.us" },
979
979
  { host: "login.sovcloud-identity.fr" },
980
980
  { host: "login.sovcloud-identity.de" },
@@ -1627,6 +1627,7 @@ function createAccessTokenEntity(homeAccountId, environment, accessToken, client
1627
1627
  if (refreshOn) {
1628
1628
  atEntity.refreshOn = refreshOn.toString();
1629
1629
  }
1630
+ const normalizedTokenType = atEntity.tokenType?.toLowerCase();
1630
1631
  /*
1631
1632
  * Create Access Token With Auth Scheme instead of regular access token
1632
1633
  * Cast to lower to handle "bearer" from ADFS
@@ -1635,7 +1636,7 @@ function createAccessTokenEntity(homeAccountId, environment, accessToken, client
1635
1636
  AuthenticationScheme.BEARER.toLowerCase()) {
1636
1637
  atEntity.credentialType =
1637
1638
  CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME;
1638
- switch (atEntity.tokenType) {
1639
+ switch (normalizedTokenType) {
1639
1640
  case AuthenticationScheme.POP:
1640
1641
  // Make sure keyId is present and add it to credential
1641
1642
  const tokenClaims = extractTokenClaims(accessToken, base64Decode, correlationId);
@@ -1644,6 +1645,12 @@ function createAccessTokenEntity(homeAccountId, environment, accessToken, client
1644
1645
  }
1645
1646
  atEntity.keyId = tokenClaims.cnf.kid;
1646
1647
  break;
1648
+ case "dpop":
1649
+ if (!keyId) {
1650
+ throw createClientAuthError(keyIdMissing, correlationId);
1651
+ }
1652
+ atEntity.keyId = keyId;
1653
+ break;
1647
1654
  case AuthenticationScheme.SSH:
1648
1655
  atEntity.keyId = keyId;
1649
1656
  }
@@ -1835,6 +1842,19 @@ function updateCloudDiscoveryMetadata(authorityMetadata, updatedValues, fromNetw
1835
1842
  */
1836
1843
  function isAuthorityMetadataExpired(metadata) {
1837
1844
  return metadata.expiresAt <= nowSeconds();
1845
+ }
1846
+ /**
1847
+ * Serialize attribute tokens synchronously (sort and join).
1848
+ * This is a sync-only operation for use at request construction time.
1849
+ * @param attributeTokens - array of tokens
1850
+ * @returns serialized partition string or undefined if no tokens
1851
+ */
1852
+ function serializeAttributeTokens(attributeTokens) {
1853
+ if (!attributeTokens || attributeTokens.length === 0) {
1854
+ return undefined;
1855
+ }
1856
+ // Serialize: sort and join tokens
1857
+ return [...attributeTokens].sort().join(" ");
1838
1858
  }
1839
1859
 
1840
1860
  var CacheHelpers = /*#__PURE__*/Object.freeze({
@@ -1853,6 +1873,7 @@ var CacheHelpers = /*#__PURE__*/Object.freeze({
1853
1873
  isRefreshTokenEntity: isRefreshTokenEntity,
1854
1874
  isServerTelemetryEntity: isServerTelemetryEntity,
1855
1875
  isThrottlingEntity: isThrottlingEntity,
1876
+ serializeAttributeTokens: serializeAttributeTokens,
1856
1877
  updateAuthorityEndpointMetadata: updateAuthorityEndpointMetadata,
1857
1878
  updateCloudDiscoveryMetadata: updateCloudDiscoveryMetadata
1858
1879
  });
@@ -3058,11 +3079,13 @@ const CLI_DATA = "clidata";
3058
3079
  const USER_FEDERATED_IDENTITY_CREDENTIAL = "user_federated_identity_credential";
3059
3080
  const USERNAME = "username";
3060
3081
  const USER_ID = "user_id";
3061
- const FMI_PATH = "fmi_path";
3082
+ const FMI_PATH = "fmi_path";
3083
+ const ATTRIBUTE_TOKENS = "attribute_tokens";
3062
3084
 
3063
3085
  var AADServerParamKeys = /*#__PURE__*/Object.freeze({
3064
3086
  __proto__: null,
3065
3087
  ACCESS_TOKEN: ACCESS_TOKEN,
3088
+ ATTRIBUTE_TOKENS: ATTRIBUTE_TOKENS,
3066
3089
  BROKER_CLIENT_ID: BROKER_CLIENT_ID,
3067
3090
  BROKER_REDIRECT_URI: BROKER_REDIRECT_URI,
3068
3091
  CCS_HEADER: CCS_HEADER,
@@ -3812,13 +3835,14 @@ function addSid(parameters, sid) {
3812
3835
  * @param claims - The claims string from the request
3813
3836
  * @param clientCapabilities - The client capabilities from configuration
3814
3837
  * @param skipBrokerClaims - When true and BROKER_CLIENT_ID is present, excludes clientCapabilities from claims
3838
+ * @param claimsToMerge - Optional client-originated claims JSON string (e.g. `claimsFromClient`) deep-merged into `claims` with precedence on conflicts
3815
3839
  */
3816
- function addClaims(parameters, correlationId, claims, clientCapabilities, skipBrokerClaims) {
3840
+ function addClaims(parameters, correlationId, claims, clientCapabilities, skipBrokerClaims, claimsToMerge) {
3817
3841
  // Skip clientCapabilities if skipBrokerClaims is set to true and this is a brokered authentication flow
3818
3842
  const configClaims = skipBrokerClaims && parameters.has(BROKER_CLIENT_ID)
3819
3843
  ? undefined
3820
3844
  : clientCapabilities;
3821
- const mergedClaims = buildMergedClaims(claims, configClaims, correlationId);
3845
+ const mergedClaims = buildMergedClaims(claims, configClaims, correlationId, claimsToMerge);
3822
3846
  parameters.set(CLAIMS, mergedClaims);
3823
3847
  }
3824
3848
  /**
@@ -4005,32 +4029,79 @@ const DEFAULT_ID_TOKEN_CLAIMS = {
4005
4029
  [ClaimsRequestKeys.LOGIN_HINT]: { essential: false },
4006
4030
  };
4007
4031
  /**
4008
- * Parses claims JSON, merges default optional idToken claims (signin_state, login_hint),
4009
- * and appends client capabilities (xms_cc) to the access_token section.
4032
+ * Parses a claims JSON string into an object, throwing a ClientConfigurationError
4033
+ * (error code `invalid_claims`) if the value is not a valid JSON object. The raw
4034
+ * claims value is never included in the error - it may contain sensitive data.
4035
+ * @param claims - Claims JSON string. Must be valid JSON representing an object.
4036
+ * @param correlationId - The request correlation id
4037
+ * @returns The parsed claims object
4038
+ */
4039
+ function parseClaims(claims, correlationId = "") {
4040
+ let parsed;
4041
+ try {
4042
+ parsed = JSON.parse(claims);
4043
+ }
4044
+ catch (e) {
4045
+ // Malformed JSON
4046
+ throw createClientConfigurationError(invalidClaims, correlationId);
4047
+ }
4048
+ if (!isPlainObject$1(parsed)) {
4049
+ // Valid JSON, but not an object (e.g. an array, a scalar, or the literal `null`).
4050
+ throw createClientConfigurationError(invalidClaims, correlationId);
4051
+ }
4052
+ return parsed;
4053
+ }
4054
+ /**
4055
+ * Type guard for a non-null, non-array object (a JSON "object" value).
4056
+ * @param value - The value to test
4057
+ * @returns True when value is a plain object that can be deep-merged
4058
+ */
4059
+ function isPlainObject$1(value) {
4060
+ return typeof value === "object" && value !== null && !Array.isArray(value);
4061
+ }
4062
+ /**
4063
+ * Recursively deep-merges two parsed claims objects. Nested objects are merged key-by-key;
4064
+ * for any other value type (arrays, scalars, null) the value from `claimsToMerge` replaces
4065
+ * the base. This mirrors the deep merge used by msal-dotnet so that, for example, a server
4066
+ * `access_token` challenge and a client-originated `access_token` claim are combined rather
4067
+ * than one clobbering the other.
4068
+ * @param baseClaims - The parsed base claims object
4069
+ * @param claimsToMerge - The parsed claims object merged in with precedence
4070
+ * @returns The deep-merged claims object
4071
+ */
4072
+ function deepMergeClaims(baseClaims, claimsToMerge) {
4073
+ const merged = { ...baseClaims };
4074
+ for (const [key, mergeInValue] of Object.entries(claimsToMerge)) {
4075
+ const baseValue = merged[key];
4076
+ if (isPlainObject$1(baseValue) && isPlainObject$1(mergeInValue)) {
4077
+ merged[key] = deepMergeClaims(baseValue, mergeInValue);
4078
+ }
4079
+ else {
4080
+ merged[key] = mergeInValue;
4081
+ }
4082
+ }
4083
+ return merged;
4084
+ }
4085
+ /**
4086
+ * Parses claims JSON, optionally deep-merges a second client-originated claims string
4087
+ * (`claimsToMerge`, e.g. `claimsFromClient`) with precedence on conflicting keys, merges
4088
+ * default optional idToken claims (signin_state, login_hint), and appends client
4089
+ * capabilities (xms_cc) to the access_token section.
4010
4090
  * Does not overwrite idToken claims already specified by the caller.
4011
4091
  * @param claims - Existing claims JSON string from the request (may be undefined)
4012
4092
  * @param clientCapabilities - Client capabilities array from configuration
4093
+ * @param correlationId - The request correlation id
4094
+ * @param claimsToMerge - Optional second claims JSON string (e.g. client-originated `claimsFromClient`)
4095
+ * deep-merged into `claims` with precedence on conflicts; parsed and validated when present. Nested
4096
+ * objects are merged recursively; arrays and scalar values are replaced.
4013
4097
  * @returns Merged claims JSON string
4014
4098
  */
4015
- function buildMergedClaims(claims, clientCapabilities, correlationId = "") {
4016
- let mergedClaims;
4099
+ function buildMergedClaims(claims, clientCapabilities, correlationId = "", claimsToMerge) {
4017
4100
  // Parse provided claims into JSON object or initialize empty object
4018
- if (!claims) {
4019
- mergedClaims = {};
4020
- }
4021
- else {
4022
- try {
4023
- const parsed = JSON.parse(claims);
4024
- if (typeof parsed !== "object" ||
4025
- parsed === null ||
4026
- Array.isArray(parsed)) {
4027
- throw new Error("Claims must be a JSON object");
4028
- }
4029
- mergedClaims = parsed;
4030
- }
4031
- catch (e) {
4032
- throw createClientConfigurationError(invalidClaims, correlationId);
4033
- }
4101
+ let mergedClaims = claims ? parseClaims(claims, correlationId) : {};
4102
+ // Deep-merge client-originated claims (e.g. `claimsFromClient`) with precedence on conflicts
4103
+ if (claimsToMerge?.trim()) {
4104
+ mergedClaims = deepMergeClaims(mergedClaims, parseClaims(claimsToMerge, correlationId));
4034
4105
  }
4035
4106
  // Add default optional idToken claims
4036
4107
  if (!Object.prototype.hasOwnProperty.call(mergedClaims, ClaimsRequestKeys.ID_TOKEN)) {
@@ -4132,11 +4203,31 @@ function addResource(parameters, resource) {
4132
4203
  if (resource) {
4133
4204
  parameters.set(RESOURCE, resource);
4134
4205
  }
4206
+ }
4207
+ /**
4208
+ * Add the `attribute_tokens` parameter to a /token request body.
4209
+ *
4210
+ * When `attributeTokens` is a non-empty array the values are sorted lexicographically and joined
4211
+ * with a single space, then written to the request body. When `attributeTokens` is an empty array
4212
+ * the parameter is deleted from the request body.
4213
+ *
4214
+ * @param parameters - request parameter map that will be serialized into the /token body
4215
+ * @param attributeTokens - caller-provided attribute token strings
4216
+ */
4217
+ function addAttributeTokens(parameters, attributeTokens) {
4218
+ const serialized = serializeAttributeTokens(attributeTokens);
4219
+ if (serialized) {
4220
+ parameters.set(ATTRIBUTE_TOKENS, serialized);
4221
+ }
4222
+ else {
4223
+ parameters.delete(ATTRIBUTE_TOKENS);
4224
+ }
4135
4225
  }
4136
4226
 
4137
4227
  var RequestParameterBuilder = /*#__PURE__*/Object.freeze({
4138
4228
  __proto__: null,
4139
4229
  addApplicationTelemetry: addApplicationTelemetry,
4230
+ addAttributeTokens: addAttributeTokens,
4140
4231
  addAuthorizationCode: addAuthorizationCode,
4141
4232
  addBrokerParameters: addBrokerParameters,
4142
4233
  addCcsOid: addCcsOid,
@@ -4189,6 +4280,14 @@ var RequestParameterBuilder = /*#__PURE__*/Object.freeze({
4189
4280
  * Copyright (c) Microsoft Corporation. All rights reserved.
4190
4281
  * Licensed under the MIT License.
4191
4282
  */
4283
+ /**
4284
+ * Shared JOSE algorithm literals used by MSAL package internals.
4285
+ * @internal
4286
+ */
4287
+ const JsonWebTokenAlgorithms = {
4288
+ ES256: "ES256",
4289
+ RS256: "RS256",
4290
+ };
4192
4291
  /**
4193
4292
  * Default crypto implementation used when a platform-specific implementation has
4194
4293
  * not been provided.
@@ -4209,23 +4308,41 @@ const DEFAULT_CRYPTO_IMPLEMENTATION = {
4209
4308
  encodeKid: () => {
4210
4309
  throw createClientAuthError(methodNotImplemented, "");
4211
4310
  },
4212
- async getPublicKeyThumbprint() {
4213
- throw createClientAuthError(methodNotImplemented, "");
4311
+ async removeTokenBindingKey(kid, correlationId) {
4312
+ throw createClientAuthError(methodNotImplemented, correlationId);
4214
4313
  },
4215
- async removeTokenBindingKey() {
4216
- throw createClientAuthError(methodNotImplemented, "");
4314
+ async clearKeystore(correlationId) {
4315
+ throw createClientAuthError(methodNotImplemented, correlationId);
4217
4316
  },
4218
- async clearKeystore() {
4219
- throw createClientAuthError(methodNotImplemented, "");
4220
- },
4221
- async signJwt() {
4222
- throw createClientAuthError(methodNotImplemented, "");
4317
+ async signTokenBindingJwt(header, payload, kid, correlationId) {
4318
+ throw createClientAuthError(methodNotImplemented, correlationId);
4223
4319
  },
4224
4320
  async hashString() {
4225
4321
  throw createClientAuthError(methodNotImplemented, "");
4226
4322
  },
4227
4323
  };
4228
4324
 
4325
+ /*
4326
+ * Copyright (c) Microsoft Corporation. All rights reserved.
4327
+ * Licensed under the MIT License.
4328
+ */
4329
+ /**
4330
+ * Default token-binding key manager used when a platform-specific implementation
4331
+ * has not been provided.
4332
+ * @internal
4333
+ */
4334
+ const DEFAULT_TOKEN_BINDING_KEY_MANAGER = {
4335
+ async provisionTokenBindingKey(request) {
4336
+ throw createClientAuthError(methodNotImplemented, request.correlationId);
4337
+ },
4338
+ async removeTokenBindingKey(_kid, correlationId) {
4339
+ throw createClientAuthError(methodNotImplemented, correlationId);
4340
+ },
4341
+ async getTokenBindingPublicKeyJwk(_kid, correlationId) {
4342
+ throw createClientAuthError(methodNotImplemented, correlationId);
4343
+ },
4344
+ };
4345
+
4229
4346
  /*
4230
4347
  * Copyright (c) Microsoft Corporation. All rights reserved.
4231
4348
  * Licensed under the MIT License.
@@ -4516,7 +4633,7 @@ class Logger {
4516
4633
 
4517
4634
  /* eslint-disable header/header */
4518
4635
  const name = "@azure/msal-common";
4519
- const version = "16.11.3";
4636
+ const version = "16.13.0";
4520
4637
 
4521
4638
  /*
4522
4639
  * Copyright (c) Microsoft Corporation. All rights reserved.
@@ -4792,9 +4909,17 @@ class CacheManager {
4792
4909
  }
4793
4910
  /**
4794
4911
  * saves access token credential
4795
- * @param credential
4912
+ * @param credential - the access token entity to save
4913
+ * @param correlationId - unique identifier for the request
4914
+ * @param kmsi - keep me signed in flag
4796
4915
  */
4797
4916
  async saveAccessToken(credential, correlationId, kmsi) {
4917
+ // Compute hash from components on the entity itself — no need to thread externally.
4918
+ let additionalCacheKeyHash;
4919
+ if (credential.additionalCacheKeyComponents &&
4920
+ Object.keys(credential.additionalCacheKeyComponents).length > 0) {
4921
+ additionalCacheKeyHash = await this.cryptoImpl.hashString(JSON.stringify(credential.additionalCacheKeyComponents));
4922
+ }
4798
4923
  const accessTokenFilter = {
4799
4924
  clientId: credential.clientId,
4800
4925
  credentialType: credential.credentialType,
@@ -4818,7 +4943,7 @@ class CacheManager {
4818
4943
  }
4819
4944
  }
4820
4945
  });
4821
- await this.setAccessTokenCredential(credential, correlationId, kmsi);
4946
+ await this.setAccessTokenCredential(credential, correlationId, kmsi, additionalCacheKeyHash);
4822
4947
  }
4823
4948
  /**
4824
4949
  * Retrieve account entities matching all provided tenant-agnostic filters; if no filter is set, get all account entities in the cache
@@ -4918,16 +5043,9 @@ class CacheManager {
4918
5043
  // Access Token with Auth Scheme specific matching
4919
5044
  if (entity.credentialType ===
4920
5045
  CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME) {
4921
- if (!!filter.tokenType &&
4922
- !this.matchTokenType(entity, filter.tokenType)) {
5046
+ if (!this.matchAccessTokenWithAuthScheme(entity, filter)) {
4923
5047
  return false;
4924
5048
  }
4925
- // KeyId (sshKid) in request must match cached SSH certificate keyId because SSH cert is bound to a specific key
4926
- if (filter.tokenType === AuthenticationScheme.SSH) {
4927
- if (filter.keyId && !this.matchKeyId(entity, filter.keyId)) {
4928
- return false;
4929
- }
4930
- }
4931
5049
  }
4932
5050
  // Additional cache key components matching (bidirectional isolation)
4933
5051
  const entityComponents = entity.additionalCacheKeyComponents;
@@ -5230,6 +5348,12 @@ class CacheManager {
5230
5348
  AuthenticationScheme.BEARER.toLowerCase()
5231
5349
  ? CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME
5232
5350
  : CredentialType.ACCESS_TOKEN;
5351
+ const attributeTokenPartition = serializeAttributeTokens(request.attributeTokens);
5352
+ const additionalCacheKeyComponents = attributeTokenPartition
5353
+ ? {
5354
+ attribute_tokens: attributeTokenPartition,
5355
+ }
5356
+ : undefined;
5233
5357
  const accessTokenFilter = {
5234
5358
  homeAccountId: account.homeAccountId,
5235
5359
  environment: account.environment,
@@ -5238,11 +5362,15 @@ class CacheManager {
5238
5362
  realm: targetRealm || account.tenantId,
5239
5363
  target: scopes,
5240
5364
  tokenType: authScheme,
5241
- keyId: request.sshKid,
5365
+ keyId: authScheme === AuthenticationScheme.SSH
5366
+ ? request.sshKid
5367
+ : undefined,
5368
+ additionalCacheKeyComponents: additionalCacheKeyComponents,
5242
5369
  };
5243
5370
  const accessTokenKeys = (tokenKeys && tokenKeys.accessToken) ||
5244
5371
  this.getTokenKeys().accessToken;
5245
5372
  const accessTokens = [];
5373
+ const matchedKeys = [];
5246
5374
  accessTokenKeys.forEach((key) => {
5247
5375
  // Validate key
5248
5376
  if (this.accessTokenKeyMatchesFilter(key, accessTokenFilter, true)) {
@@ -5251,18 +5379,18 @@ class CacheManager {
5251
5379
  if (accessToken &&
5252
5380
  this.credentialMatchesFilter(accessToken, accessTokenFilter, correlationId)) {
5253
5381
  accessTokens.push(accessToken);
5382
+ matchedKeys.push(key);
5254
5383
  }
5255
5384
  }
5256
5385
  });
5257
- const numAccessTokens = accessTokens.length;
5258
- if (numAccessTokens < 1) {
5386
+ if (accessTokens.length < 1) {
5259
5387
  this.commonLogger.info("CacheManager:getAccessToken - No token found", correlationId);
5260
5388
  return null;
5261
5389
  }
5262
- else if (numAccessTokens > 1) {
5390
+ else if (accessTokens.length > 1) {
5263
5391
  this.commonLogger.info("CacheManager:getAccessToken - Multiple access tokens found, clearing them", correlationId);
5264
- accessTokens.forEach((accessToken) => {
5265
- this.removeAccessToken(this.generateCredentialKey(accessToken), correlationId);
5392
+ matchedKeys.forEach((key) => {
5393
+ this.removeAccessToken(key, correlationId);
5266
5394
  });
5267
5395
  this.performanceClient.addFields({ multiMatchedAT: accessTokens.length }, correlationId);
5268
5396
  return null;
@@ -5598,7 +5726,29 @@ class CacheManager {
5598
5726
  * @param tokenType
5599
5727
  */
5600
5728
  matchTokenType(entity, tokenType) {
5601
- return !!(entity.tokenType && entity.tokenType === tokenType);
5729
+ return !!(entity.tokenType &&
5730
+ entity.tokenType.toLowerCase() === tokenType.toLowerCase());
5731
+ }
5732
+ matchAccessTokenWithAuthScheme(entity, filter) {
5733
+ const normalizedFilterTokenType = filter.tokenType?.toLowerCase();
5734
+ if (!!filter.tokenType &&
5735
+ !this.matchTokenType(entity, filter.tokenType)) {
5736
+ return false;
5737
+ }
5738
+ switch (normalizedFilterTokenType) {
5739
+ case "dpop":
5740
+ return this.matchKeyBoundAccessToken(entity, filter, true);
5741
+ case AuthenticationScheme.SSH:
5742
+ return this.matchKeyBoundAccessToken(entity, filter, false);
5743
+ default:
5744
+ return true;
5745
+ }
5746
+ }
5747
+ matchKeyBoundAccessToken(entity, filter, requireKeyId) {
5748
+ if (!filter.keyId) {
5749
+ return !requireKeyId;
5750
+ }
5751
+ return this.matchKeyId(entity, filter.keyId);
5602
5752
  }
5603
5753
  /**
5604
5754
  * Returns true if the credential's keyId matches the one in the request, false otherwise
@@ -5705,7 +5855,9 @@ class DefaultStorageClass extends CacheManager {
5705
5855
  getTokenKeys() {
5706
5856
  throw createClientAuthError(methodNotImplemented, "");
5707
5857
  }
5708
- generateCredentialKey() {
5858
+ /* eslint-disable @typescript-eslint/no-unused-vars */
5859
+ generateCredentialKey(_credential, _hash) {
5860
+ /* eslint-enable @typescript-eslint/no-unused-vars */
5709
5861
  throw createClientAuthError(methodNotImplemented, "");
5710
5862
  }
5711
5863
  generateAccountKey() {
@@ -5886,7 +6038,7 @@ const DEFAULT_TELEMETRY_OPTIONS = {
5886
6038
  * @returns Configuration
5887
6039
  * @internal
5888
6040
  */
5889
- function buildClientConfiguration({ authOptions: userAuthOptions, systemOptions: userSystemOptions, loggerOptions: userLoggerOption, storageInterface: storageImplementation, networkInterface: networkImplementation, cryptoInterface: cryptoImplementation, clientCredentials: clientCredentials, libraryInfo: libraryInfo, telemetry: telemetry, serverTelemetryManager: serverTelemetryManager, persistencePlugin: persistencePlugin, serializableCache: serializableCache, }) {
6041
+ function buildClientConfiguration({ authOptions: userAuthOptions, systemOptions: userSystemOptions, loggerOptions: userLoggerOption, storageInterface: storageImplementation, networkInterface: networkImplementation, cryptoInterface: cryptoImplementation, tokenBindingKeyManager: tokenBindingKeyManager, clientCredentials: clientCredentials, libraryInfo: libraryInfo, telemetry: telemetry, serverTelemetryManager: serverTelemetryManager, persistencePlugin: persistencePlugin, serializableCache: serializableCache, }) {
5890
6042
  const loggerOptions = {
5891
6043
  ...DEFAULT_LOGGER_IMPLEMENTATION,
5892
6044
  ...userLoggerOption,
@@ -5899,6 +6051,7 @@ function buildClientConfiguration({ authOptions: userAuthOptions, systemOptions:
5899
6051
  new DefaultStorageClass(userAuthOptions.clientId, DEFAULT_CRYPTO_IMPLEMENTATION, new Logger(loggerOptions, name, version), new StubPerformanceClient()),
5900
6052
  networkInterface: networkImplementation || DEFAULT_NETWORK_IMPLEMENTATION,
5901
6053
  cryptoInterface: cryptoImplementation || DEFAULT_CRYPTO_IMPLEMENTATION,
6054
+ tokenBindingKeyManager: tokenBindingKeyManager || DEFAULT_TOKEN_BINDING_KEY_MANAGER,
5902
6055
  clientCredentials: clientCredentials || DEFAULT_CLIENT_CREDENTIALS,
5903
6056
  libraryInfo: { ...DEFAULT_LIBRARY_INFO, ...libraryInfo },
5904
6057
  telemetry: { ...DEFAULT_TELEMETRY_OPTIONS, ...telemetry },
@@ -5954,16 +6107,135 @@ function isOidcProtocolMode(config) {
5954
6107
  }
5955
6108
  }
5956
6109
 
6110
+ /*
6111
+ * Copyright (c) Microsoft Corporation. All rights reserved.
6112
+ * Licensed under the MIT License.
6113
+ */
6114
+ const missingKidError = "missing_kid_error";
6115
+ const missingAlgError = "missing_alg_error";
6116
+ const missingJwkError = "missing_jwk_error";
6117
+ const invalidJwkError = "invalid_jwk_error";
6118
+
6119
+ /*
6120
+ * Copyright (c) Microsoft Corporation. All rights reserved.
6121
+ * Licensed under the MIT License.
6122
+ */
6123
+ /**
6124
+ * Error thrown when there is an error in the client code running on the browser.
6125
+ */
6126
+ class JoseHeaderError extends AuthError {
6127
+ constructor(errorCode, correlationId, errorMessage) {
6128
+ super(errorCode, correlationId, errorMessage);
6129
+ this.name = "JoseHeaderError";
6130
+ Object.setPrototypeOf(this, JoseHeaderError.prototype);
6131
+ }
6132
+ }
6133
+ /** Returns JoseHeaderError object */
6134
+ function createJoseHeaderError(code, correlationId) {
6135
+ return new JoseHeaderError(code, correlationId);
6136
+ }
6137
+
6138
+ /*
6139
+ * Copyright (c) Microsoft Corporation. All rights reserved.
6140
+ * Licensed under the MIT License.
6141
+ */
6142
+ /**
6143
+ * Checks whether a value is a plain JSON-like object.
6144
+ * Allows objects with null prototypes, but rejects arrays and object subclasses.
6145
+ */
6146
+ function isPlainObject(value) {
6147
+ if (typeof value !== "object" ||
6148
+ value === null ||
6149
+ Object.prototype.toString.call(value) !== "[object Object]") {
6150
+ return false;
6151
+ }
6152
+ if (Object.getPrototypeOf(value) === null) {
6153
+ return true;
6154
+ }
6155
+ let proto = value;
6156
+ while (Object.getPrototypeOf(proto) !== null) {
6157
+ proto = Object.getPrototypeOf(proto);
6158
+ }
6159
+ return Object.getPrototypeOf(value) === proto;
6160
+ }
6161
+
6162
+ /*
6163
+ * Copyright (c) Microsoft Corporation. All rights reserved.
6164
+ * Licensed under the MIT License.
6165
+ */
6166
+ /** @internal */
6167
+ class JoseHeader {
6168
+ constructor(options, correlationId) {
6169
+ if (typeof options.alg !== "string" || !options.alg) {
6170
+ throw createJoseHeaderError(missingAlgError, correlationId);
6171
+ }
6172
+ this.typ = options.typ;
6173
+ this.alg = options.alg;
6174
+ this.kid = options.kid;
6175
+ this.jwk = options.jwk;
6176
+ }
6177
+ /**
6178
+ * Builds SignedHttpRequest formatted JOSE Header from the
6179
+ * JOSE Header options provided or previously set on the object.
6180
+ * Throws if keyId or algorithm aren't provided since they are required for Access Token Binding.
6181
+ * @param shrHeaderOptions
6182
+ * @param correlationId
6183
+ * @returns
6184
+ */
6185
+ static getShrHeader(shrHeaderOptions, correlationId) {
6186
+ // KeyID is required on the SHR header
6187
+ if (!shrHeaderOptions.kid) {
6188
+ throw createJoseHeaderError(missingKidError, correlationId);
6189
+ }
6190
+ // Alg is required on the SHR header
6191
+ if (!shrHeaderOptions.alg) {
6192
+ throw createJoseHeaderError(missingAlgError, correlationId);
6193
+ }
6194
+ return new JoseHeader({
6195
+ // Access Token PoP headers must have type pop, but the type header can be overriden for special cases
6196
+ typ: shrHeaderOptions.typ || JsonWebTokenTypes.Pop,
6197
+ kid: shrHeaderOptions.kid,
6198
+ alg: shrHeaderOptions.alg,
6199
+ }, correlationId);
6200
+ }
6201
+ /**
6202
+ * Builds a DPoP formatted JOSE Header from the JOSE Header options provided.
6203
+ * Throws if public JWK or algorithm aren't provided since they are required for DPoP.
6204
+ * @param dpopHeaderOptions
6205
+ * @param correlationId
6206
+ * @returns
6207
+ */
6208
+ static getDpopHeader(dpopHeaderOptions, correlationId) {
6209
+ if (!isPlainObject(dpopHeaderOptions.jwk)) {
6210
+ throw createJoseHeaderError(missingJwkError, correlationId);
6211
+ }
6212
+ if (!dpopHeaderOptions.alg) {
6213
+ throw createJoseHeaderError(missingAlgError, correlationId);
6214
+ }
6215
+ if (Object.keys(dpopHeaderOptions.jwk).length === 0) {
6216
+ throw createJoseHeaderError(invalidJwkError, correlationId);
6217
+ }
6218
+ return new JoseHeader({
6219
+ typ: JsonWebTokenTypes.Dpop,
6220
+ alg: dpopHeaderOptions.alg,
6221
+ jwk: dpopHeaderOptions.jwk,
6222
+ }, correlationId);
6223
+ }
6224
+ }
6225
+
5957
6226
  /*
5958
6227
  * Copyright (c) Microsoft Corporation. All rights reserved.
5959
6228
  * Licensed under the MIT License.
5960
6229
  */
5961
6230
  const KeyLocation = {
5962
6231
  SW: "sw"};
6232
+ const SHR_TOKEN_BINDING_KEY_TYPE = "shr";
6233
+ const SHR_TOKEN_BINDING_KEY_ALGORITHM = JsonWebTokenAlgorithms.RS256;
5963
6234
  /** @internal */
5964
6235
  class PopTokenGenerator {
5965
- constructor(cryptoUtils, performanceClient) {
6236
+ constructor(cryptoUtils, tokenBindingKeyManager, performanceClient) {
5966
6237
  this.cryptoUtils = cryptoUtils;
6238
+ this.tokenBindingKeyManager = tokenBindingKeyManager;
5967
6239
  this.performanceClient = performanceClient;
5968
6240
  }
5969
6241
  /**
@@ -5986,7 +6258,11 @@ class PopTokenGenerator {
5986
6258
  * @returns
5987
6259
  */
5988
6260
  async generateKid(request) {
5989
- const kidThumbprint = await this.cryptoUtils.getPublicKeyThumbprint(request);
6261
+ const kidThumbprint = await this.tokenBindingKeyManager.provisionTokenBindingKey({
6262
+ correlationId: request.correlationId,
6263
+ tokenBindingKeyType: SHR_TOKEN_BINDING_KEY_TYPE,
6264
+ tokenBindingKeyAlgorithm: SHR_TOKEN_BINDING_KEY_ALGORITHM,
6265
+ });
5990
6266
  return {
5991
6267
  kid: kidThumbprint,
5992
6268
  xms_ksl: KeyLocation.SW,
@@ -6016,7 +6292,17 @@ class PopTokenGenerator {
6016
6292
  ? new UrlString(resourceRequestUri, request.correlationId)
6017
6293
  : undefined;
6018
6294
  const resourceUrlComponents = resourceUrlString?.getUrlComponents();
6019
- return this.cryptoUtils.signJwt({
6295
+ const publicKeyJwk = await this.tokenBindingKeyManager.getTokenBindingPublicKeyJwk(keyId, request.correlationId);
6296
+ const encodedKeyIdThumbprint = this.cryptoUtils.base64UrlEncode(JSON.stringify({ kid: keyId }));
6297
+ const shrAlgorithm = shrOptions?.header?.alg ||
6298
+ publicKeyJwk.alg ||
6299
+ SHR_TOKEN_BINDING_KEY_ALGORITHM;
6300
+ const shrHeader = JoseHeader.getShrHeader({
6301
+ ...shrOptions?.header,
6302
+ alg: shrAlgorithm,
6303
+ kid: encodedKeyIdThumbprint,
6304
+ }, request.correlationId);
6305
+ const shrPayload = {
6020
6306
  at: payload,
6021
6307
  ts: nowSeconds(),
6022
6308
  m: resourceRequestMethod?.toUpperCase(),
@@ -6028,7 +6314,11 @@ class PopTokenGenerator {
6028
6314
  : undefined,
6029
6315
  client_claims: shrClaims || undefined,
6030
6316
  ...claims,
6031
- }, keyId, shrOptions, request.correlationId);
6317
+ cnf: {
6318
+ jwk: publicKeyJwk,
6319
+ },
6320
+ };
6321
+ return this.cryptoUtils.signTokenBindingJwt(shrHeader, shrPayload, keyId, request.correlationId);
6032
6322
  }
6033
6323
  }
6034
6324
 
@@ -6262,10 +6552,11 @@ var ProtocolUtils = /*#__PURE__*/Object.freeze({
6262
6552
  * @internal
6263
6553
  */
6264
6554
  class ResponseHandler {
6265
- constructor(clientId, cacheStorage, cryptoObj, logger, performanceClient, serializableCache, persistencePlugin) {
6555
+ constructor(clientId, cacheStorage, cryptoObj, logger, performanceClient, serializableCache, persistencePlugin, tokenBindingKeyManager = DEFAULT_TOKEN_BINDING_KEY_MANAGER) {
6266
6556
  this.clientId = clientId;
6267
6557
  this.cacheStorage = cacheStorage;
6268
6558
  this.cryptoObj = cryptoObj;
6559
+ this.tokenBindingKeyManager = tokenBindingKeyManager;
6269
6560
  this.logger = logger;
6270
6561
  this.performanceClient = performanceClient;
6271
6562
  this.serializableCache = serializableCache;
@@ -6340,7 +6631,15 @@ class ResponseHandler {
6340
6631
  // Add keyId from request to serverTokenResponse if defined
6341
6632
  serverTokenResponse.key_id =
6342
6633
  serverTokenResponse.key_id || request.sshKid || undefined;
6343
- const cacheRecord = this.generateCacheRecord(serverTokenResponse, authority, reqTimestamp, request, idTokenClaims, userAssertionHash, authCodePayload, additionalCacheKeyComponents);
6634
+ // Compute components once for entity storage (fallback if hash not provided by client)
6635
+ const attributeTokenPartition = serializeAttributeTokens(request.attributeTokens);
6636
+ const cacheKeyComponents = additionalCacheKeyComponents ??
6637
+ (attributeTokenPartition
6638
+ ? {
6639
+ attribute_tokens: attributeTokenPartition,
6640
+ }
6641
+ : undefined);
6642
+ const cacheRecord = this.generateCacheRecord(serverTokenResponse, authority, reqTimestamp, request, idTokenClaims, userAssertionHash, authCodePayload, cacheKeyComponents);
6344
6643
  let cacheContext;
6345
6644
  try {
6346
6645
  if (this.persistencePlugin && this.serializableCache) {
@@ -6366,7 +6665,12 @@ class ResponseHandler {
6366
6665
  this.performanceClient?.addFields({
6367
6666
  acntLoggedOut: true,
6368
6667
  }, request.correlationId);
6369
- return await ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, this.performanceClient, idTokenClaims, requestStateObj, undefined, serverRequestId);
6668
+ return await ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, this.performanceClient, {
6669
+ idTokenClaims,
6670
+ requestState: requestStateObj,
6671
+ requestId: serverRequestId,
6672
+ tokenBindingKeyManager: this.tokenBindingKeyManager,
6673
+ });
6370
6674
  }
6371
6675
  }
6372
6676
  await this.cacheStorage.saveCacheRecord(cacheRecord, request.correlationId, isKmsi(idTokenClaims || {}), apiId, request.storeInCache);
@@ -6379,7 +6683,13 @@ class ResponseHandler {
6379
6683
  await this.persistencePlugin.afterCacheAccess(cacheContext);
6380
6684
  }
6381
6685
  }
6382
- return ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, this.performanceClient, idTokenClaims, requestStateObj, serverTokenResponse, serverRequestId);
6686
+ return ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, this.performanceClient, {
6687
+ idTokenClaims,
6688
+ requestState: requestStateObj,
6689
+ serverTokenResponse,
6690
+ requestId: serverRequestId,
6691
+ tokenBindingKeyManager: this.tokenBindingKeyManager,
6692
+ });
6383
6693
  }
6384
6694
  /**
6385
6695
  * Generates CacheRecord
@@ -6475,7 +6785,8 @@ class ResponseHandler {
6475
6785
  * @param fromTokenCache
6476
6786
  * @param stateString
6477
6787
  */
6478
- static async generateAuthenticationResult(cryptoObj, authority, cacheRecord, fromTokenCache, request, performanceClient, idTokenClaims, requestState, serverTokenResponse, requestId) {
6788
+ static async generateAuthenticationResult(cryptoObj, authority, cacheRecord, fromTokenCache, request, performanceClient, options = {}) {
6789
+ const { idTokenClaims, requestState, serverTokenResponse, requestId, tokenBindingKeyManager = DEFAULT_TOKEN_BINDING_KEY_MANAGER, } = options;
6479
6790
  let accessToken = "";
6480
6791
  let responseScopes = [];
6481
6792
  let expiresOn = null;
@@ -6490,7 +6801,7 @@ class ResponseHandler {
6490
6801
  if (cacheRecord.accessToken.tokenType ===
6491
6802
  AuthenticationScheme.POP &&
6492
6803
  !request.popKid) {
6493
- const popTokenGenerator = new PopTokenGenerator(cryptoObj, performanceClient);
6804
+ const popTokenGenerator = new PopTokenGenerator(cryptoObj, tokenBindingKeyManager, performanceClient);
6494
6805
  const { secret, keyId } = cacheRecord.accessToken;
6495
6806
  if (!keyId) {
6496
6807
  throw createClientAuthError(keyIdMissing, request.correlationId);
@@ -6652,6 +6963,7 @@ function getRequestThumbprint(clientId, request, homeAccountId) {
6652
6963
  sshKid: request.sshKid,
6653
6964
  embeddedClientId: request.embeddedClientId || request.extraParameters?.clientId,
6654
6965
  resource: request.resource,
6966
+ attributeTokens: serializeAttributeTokens(request.attributeTokens),
6655
6967
  };
6656
6968
  }
6657
6969
 
@@ -6938,7 +7250,7 @@ class AuthorizationCodeClient {
6938
7250
  const response = await invokeAsync(this.executeTokenRequest.bind(this), AuthClientExecuteTokenRequest, this.logger, this.performanceClient, request.correlationId)(this.authority, request, this.serverTelemetryManager);
6939
7251
  // Retrieve requestId from response headers
6940
7252
  const requestId = response.headers?.[HeaderNames.X_MS_REQUEST_ID];
6941
- const responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.performanceClient, this.config.serializableCache, this.config.persistencePlugin);
7253
+ const responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.performanceClient, this.config.serializableCache, this.config.persistencePlugin, this.config.tokenBindingKeyManager);
6942
7254
  // Validate response. This function throws a server error if an error is returned by the server.
6943
7255
  responseHandler.validateTokenResponse(response.body, request.correlationId);
6944
7256
  return invokeAsync(responseHandler.handleServerTokenResponse.bind(responseHandler), HandleServerTokenResponse, this.logger, this.performanceClient, request.correlationId)(response.body, this.authority, reqTimestamp, request, apiId, authCodePayload, undefined, undefined, undefined, requestId);
@@ -7009,6 +7321,12 @@ class AuthorizationCodeClient {
7009
7321
  // Add scope array, parameter builder will add default scopes and dedupe
7010
7322
  addScopes(parameters, request.scopes, request.correlationId, true, this.oidcDefaultScopes);
7011
7323
  addResource(parameters, request.resource);
7324
+ if (request.attributeTokens) {
7325
+ addAttributeTokens(parameters, request.attributeTokens);
7326
+ }
7327
+ this.performanceClient?.addFields({
7328
+ hasAttributeTokens: !!request.attributeTokens?.length,
7329
+ }, request.correlationId);
7012
7330
  // add code: user set, not validated
7013
7331
  addAuthorizationCode(parameters, request.code);
7014
7332
  // Add library metadata
@@ -7033,7 +7351,7 @@ class AuthorizationCodeClient {
7033
7351
  addGrantType(parameters, GrantType.AUTHORIZATION_CODE_GRANT);
7034
7352
  addClientInfo(parameters);
7035
7353
  if (request.authenticationScheme === AuthenticationScheme.POP) {
7036
- const popTokenGenerator = new PopTokenGenerator(this.cryptoUtils, this.performanceClient);
7354
+ const popTokenGenerator = new PopTokenGenerator(this.cryptoUtils, this.config.tokenBindingKeyManager, this.performanceClient);
7037
7355
  let reqCnfData;
7038
7356
  if (!request.popKid) {
7039
7357
  const generatedReqCnfData = await invokeAsync(popTokenGenerator.generateCnf.bind(popTokenGenerator), PopTokenGenerateCnf, this.logger, this.performanceClient, request.correlationId)(request, this.logger);
@@ -7178,7 +7496,7 @@ class RefreshTokenClient {
7178
7496
  const response = await invokeAsync(this.executeTokenRequest.bind(this), RefreshTokenClientExecuteTokenRequest, this.logger, this.performanceClient, request.correlationId)(request, this.authority);
7179
7497
  // Retrieve requestId from response headers
7180
7498
  const requestId = response.headers?.[HeaderNames.X_MS_REQUEST_ID];
7181
- const responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.performanceClient, this.config.serializableCache, this.config.persistencePlugin);
7499
+ const responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.performanceClient, this.config.serializableCache, this.config.persistencePlugin, this.config.tokenBindingKeyManager);
7182
7500
  responseHandler.validateTokenResponse(response.body, request.correlationId);
7183
7501
  return invokeAsync(responseHandler.handleServerTokenResponse.bind(responseHandler), HandleServerTokenResponse, this.logger, this.performanceClient, request.correlationId)(response.body, this.authority, reqTimestamp, request, apiId, undefined, undefined, true, request.forceCache, requestId);
7184
7502
  }
@@ -7304,6 +7622,12 @@ class RefreshTokenClient {
7304
7622
  addServerTelemetry(parameters, this.serverTelemetryManager);
7305
7623
  }
7306
7624
  addRefreshToken(parameters, request.refreshToken);
7625
+ if (request.attributeTokens) {
7626
+ addAttributeTokens(parameters, request.attributeTokens);
7627
+ }
7628
+ this.performanceClient?.addFields({
7629
+ hasAttributeTokens: !!request.attributeTokens?.length,
7630
+ }, request.correlationId);
7307
7631
  if (this.config.clientCredentials.clientSecret) {
7308
7632
  addClientSecret(parameters, this.config.clientCredentials.clientSecret);
7309
7633
  }
@@ -7313,7 +7637,7 @@ class RefreshTokenClient {
7313
7637
  addClientAssertionType(parameters, clientAssertion.assertionType);
7314
7638
  }
7315
7639
  if (request.authenticationScheme === AuthenticationScheme.POP) {
7316
- const popTokenGenerator = new PopTokenGenerator(this.cryptoUtils, this.performanceClient);
7640
+ const popTokenGenerator = new PopTokenGenerator(this.cryptoUtils, this.config.tokenBindingKeyManager, this.performanceClient);
7317
7641
  let reqCnfData;
7318
7642
  if (!request.popKid) {
7319
7643
  const generatedReqCnfData = await invokeAsync(popTokenGenerator.generateCnf.bind(popTokenGenerator), PopTokenGenerateCnf, this.logger, this.performanceClient, request.correlationId)(request, this.logger);
@@ -7466,7 +7790,10 @@ class SilentFlowClient {
7466
7790
  if (cacheRecord.idToken) {
7467
7791
  idTokenClaims = extractTokenClaims(cacheRecord.idToken.secret, this.config.cryptoInterface.base64Decode, request.correlationId);
7468
7792
  }
7469
- return ResponseHandler.generateAuthenticationResult(this.cryptoUtils, this.authority, cacheRecord, true, request, this.performanceClient, idTokenClaims);
7793
+ return ResponseHandler.generateAuthenticationResult(this.cryptoUtils, this.authority, cacheRecord, true, request, this.performanceClient, {
7794
+ idTokenClaims,
7795
+ tokenBindingKeyManager: this.config.tokenBindingKeyManager,
7796
+ });
7470
7797
  }
7471
7798
  }
7472
7799
 
@@ -8163,12 +8490,14 @@ exports.ClientConfigurationErrorCodes = ClientConfigurationErrorCodes;
8163
8490
  exports.Constants = Constants;
8164
8491
  exports.DEFAULT_CRYPTO_IMPLEMENTATION = DEFAULT_CRYPTO_IMPLEMENTATION;
8165
8492
  exports.DEFAULT_SYSTEM_OPTIONS = DEFAULT_SYSTEM_OPTIONS;
8493
+ exports.DEFAULT_TOKEN_BINDING_KEY_MANAGER = DEFAULT_TOKEN_BINDING_KEY_MANAGER;
8166
8494
  exports.DefaultStorageClass = DefaultStorageClass;
8167
8495
  exports.EXT_FIELD_PREFIX = EXT_FIELD_PREFIX;
8168
8496
  exports.IntFields = IntFields;
8169
8497
  exports.InteractionRequiredAuthError = InteractionRequiredAuthError;
8170
8498
  exports.InteractionRequiredAuthErrorCodes = InteractionRequiredAuthErrorCodes;
8171
- exports.JsonWebTokenTypes = JsonWebTokenTypes;
8499
+ exports.JoseHeader = JoseHeader;
8500
+ exports.JsonWebTokenAlgorithms = JsonWebTokenAlgorithms;
8172
8501
  exports.Logger = Logger;
8173
8502
  exports.NetworkError = NetworkError;
8174
8503
  exports.PerformanceEventStatus = PerformanceEventStatus;
@@ -8217,4 +8546,4 @@ exports.invokeAsync = invokeAsync;
8217
8546
  exports.tenantIdMatchesHomeTenant = tenantIdMatchesHomeTenant;
8218
8547
  exports.updateAccountTenantProfileData = updateAccountTenantProfileData;
8219
8548
  exports.version = version;
8220
- //# sourceMappingURL=index-node-JVUj78ag.js.map
8549
+ //# sourceMappingURL=index-node-BaODPZEy.js.map