@azure/msal-common 16.11.3 → 16.12.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 (198) 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 +1 -1
  9. package/dist/authority/AuthorityOptions.mjs +1 -1
  10. package/dist/authority/AuthorityType.mjs +1 -1
  11. package/dist/authority/CloudInstanceDiscoveryErrorResponse.mjs +1 -1
  12. package/dist/authority/CloudInstanceDiscoveryResponse.mjs +1 -1
  13. package/dist/authority/OpenIdConfigResponse.mjs +1 -1
  14. package/dist/authority/ProtocolMode.mjs +1 -1
  15. package/dist/authority/RegionDiscovery.mjs +1 -1
  16. package/dist/cache/CacheManager.mjs +28 -9
  17. package/dist/cache/CacheManager.mjs.map +1 -1
  18. package/dist/cache/persistence/TokenCacheContext.mjs +1 -1
  19. package/dist/cache/utils/AccountEntityUtils.mjs +1 -1
  20. package/dist/cache/utils/CacheHelpers.mjs +15 -2
  21. package/dist/cache/utils/CacheHelpers.mjs.map +1 -1
  22. package/dist/client/AuthorizationCodeClient.mjs +8 -2
  23. package/dist/client/AuthorizationCodeClient.mjs.map +1 -1
  24. package/dist/client/RefreshTokenClient.mjs +8 -2
  25. package/dist/client/RefreshTokenClient.mjs.map +1 -1
  26. package/dist/client/SilentFlowClient.mjs +1 -1
  27. package/dist/config/ClientConfiguration.mjs +1 -1
  28. package/dist/constants/AADServerParamKeys.mjs +4 -3
  29. package/dist/constants/AADServerParamKeys.mjs.map +1 -1
  30. package/dist/crypto/ICrypto.mjs +1 -1
  31. package/dist/crypto/JoseHeader.mjs +1 -1
  32. package/dist/crypto/PopTokenGenerator.mjs +1 -1
  33. package/dist/error/AuthError.mjs +1 -1
  34. package/dist/error/AuthErrorCodes.mjs +1 -1
  35. package/dist/error/CacheError.mjs +1 -1
  36. package/dist/error/CacheErrorCodes.mjs +1 -1
  37. package/dist/error/ClientAuthError.mjs +1 -1
  38. package/dist/error/ClientAuthErrorCodes.mjs +1 -1
  39. package/dist/error/ClientConfigurationError.mjs +1 -1
  40. package/dist/error/ClientConfigurationErrorCodes.mjs +1 -1
  41. package/dist/error/InteractionRequiredAuthError.mjs +1 -1
  42. package/dist/error/InteractionRequiredAuthErrorCodes.mjs +1 -1
  43. package/dist/error/JoseHeaderError.mjs +1 -1
  44. package/dist/error/JoseHeaderErrorCodes.mjs +1 -1
  45. package/dist/error/NetworkError.mjs +1 -1
  46. package/dist/error/PlatformBrokerError.mjs +1 -1
  47. package/dist/error/ServerError.mjs +1 -1
  48. package/dist/index-node.mjs +1 -1
  49. package/dist/index.mjs +1 -1
  50. package/dist/logger/Logger.mjs +1 -1
  51. package/dist/network/INetworkModule.mjs +1 -1
  52. package/dist/network/RequestThumbprint.mjs +4 -1
  53. package/dist/network/RequestThumbprint.mjs.map +1 -1
  54. package/dist/network/ThrottlingUtils.mjs +1 -1
  55. package/dist/packageMetadata.mjs +2 -2
  56. package/dist/protocol/Authorize.mjs +1 -1
  57. package/dist/protocol/Token.mjs +1 -1
  58. package/dist/request/AuthenticationHeaderParser.mjs +1 -1
  59. package/dist/request/BaseAuthRequest.mjs +1 -1
  60. package/dist/request/BaseAuthRequest.mjs.map +1 -1
  61. package/dist/request/RequestParameterBuilder.mjs +94 -26
  62. package/dist/request/RequestParameterBuilder.mjs.map +1 -1
  63. package/dist/request/ScopeSet.mjs +1 -1
  64. package/dist/response/ResponseHandler.mjs +11 -3
  65. package/dist/response/ResponseHandler.mjs.map +1 -1
  66. package/dist/telemetry/performance/PerformanceClient.mjs +1 -1
  67. package/dist/telemetry/performance/PerformanceEvent.mjs +1 -1
  68. package/dist/telemetry/performance/PerformanceEvent.mjs.map +1 -1
  69. package/dist/telemetry/performance/PerformanceEvents.mjs +1 -1
  70. package/dist/telemetry/performance/StubPerformanceClient.mjs +1 -1
  71. package/dist/telemetry/server/ServerTelemetryManager.mjs +1 -1
  72. package/dist/url/UrlString.mjs +1 -1
  73. package/dist/utils/ClientAssertionUtils.mjs +1 -1
  74. package/dist/utils/Constants.mjs +1 -1
  75. package/dist/utils/FunctionWrappers.mjs +1 -1
  76. package/dist/utils/ProtocolUtils.mjs +1 -1
  77. package/dist/utils/StringUtils.mjs +1 -1
  78. package/dist/utils/TimeUtils.mjs +1 -1
  79. package/dist/utils/UrlUtils.mjs +1 -1
  80. package/dist-browser/account/AccountInfo.mjs +1 -1
  81. package/dist-browser/account/AuthToken.mjs +1 -1
  82. package/dist-browser/account/CcsCredential.mjs +1 -1
  83. package/dist-browser/account/ClientInfo.mjs +1 -1
  84. package/dist-browser/account/TokenClaims.mjs +1 -1
  85. package/dist-browser/authority/Authority.mjs +1 -1
  86. package/dist-browser/authority/AuthorityFactory.mjs +1 -1
  87. package/dist-browser/authority/AuthorityMetadata.mjs +1 -1
  88. package/dist-browser/authority/AuthorityOptions.mjs +1 -1
  89. package/dist-browser/authority/AuthorityType.mjs +1 -1
  90. package/dist-browser/authority/CloudInstanceDiscoveryErrorResponse.mjs +1 -1
  91. package/dist-browser/authority/CloudInstanceDiscoveryResponse.mjs +1 -1
  92. package/dist-browser/authority/OpenIdConfigResponse.mjs +1 -1
  93. package/dist-browser/authority/ProtocolMode.mjs +1 -1
  94. package/dist-browser/authority/RegionDiscovery.mjs +1 -1
  95. package/dist-browser/cache/CacheManager.mjs +28 -9
  96. package/dist-browser/cache/CacheManager.mjs.map +1 -1
  97. package/dist-browser/cache/persistence/TokenCacheContext.mjs +1 -1
  98. package/dist-browser/cache/utils/AccountEntityUtils.mjs +1 -1
  99. package/dist-browser/cache/utils/CacheHelpers.mjs +15 -2
  100. package/dist-browser/cache/utils/CacheHelpers.mjs.map +1 -1
  101. package/dist-browser/client/AuthorizationCodeClient.mjs +8 -2
  102. package/dist-browser/client/AuthorizationCodeClient.mjs.map +1 -1
  103. package/dist-browser/client/RefreshTokenClient.mjs +8 -2
  104. package/dist-browser/client/RefreshTokenClient.mjs.map +1 -1
  105. package/dist-browser/client/SilentFlowClient.mjs +1 -1
  106. package/dist-browser/config/ClientConfiguration.mjs +1 -1
  107. package/dist-browser/constants/AADServerParamKeys.mjs +4 -3
  108. package/dist-browser/constants/AADServerParamKeys.mjs.map +1 -1
  109. package/dist-browser/crypto/ICrypto.mjs +1 -1
  110. package/dist-browser/crypto/JoseHeader.mjs +1 -1
  111. package/dist-browser/crypto/PopTokenGenerator.mjs +1 -1
  112. package/dist-browser/error/AuthError.mjs +1 -1
  113. package/dist-browser/error/AuthErrorCodes.mjs +1 -1
  114. package/dist-browser/error/CacheError.mjs +1 -1
  115. package/dist-browser/error/CacheErrorCodes.mjs +1 -1
  116. package/dist-browser/error/ClientAuthError.mjs +1 -1
  117. package/dist-browser/error/ClientAuthErrorCodes.mjs +1 -1
  118. package/dist-browser/error/ClientConfigurationError.mjs +1 -1
  119. package/dist-browser/error/ClientConfigurationErrorCodes.mjs +1 -1
  120. package/dist-browser/error/InteractionRequiredAuthError.mjs +1 -1
  121. package/dist-browser/error/InteractionRequiredAuthErrorCodes.mjs +1 -1
  122. package/dist-browser/error/JoseHeaderError.mjs +1 -1
  123. package/dist-browser/error/JoseHeaderErrorCodes.mjs +1 -1
  124. package/dist-browser/error/NetworkError.mjs +1 -1
  125. package/dist-browser/error/PlatformBrokerError.mjs +1 -1
  126. package/dist-browser/error/ServerError.mjs +1 -1
  127. package/dist-browser/index-browser.mjs +1 -1
  128. package/dist-browser/index.mjs +1 -1
  129. package/dist-browser/log-strings-mapping.json +2 -2
  130. package/dist-browser/logger/Logger.mjs +1 -1
  131. package/dist-browser/network/INetworkModule.mjs +1 -1
  132. package/dist-browser/network/RequestThumbprint.mjs +4 -1
  133. package/dist-browser/network/RequestThumbprint.mjs.map +1 -1
  134. package/dist-browser/network/ThrottlingUtils.mjs +1 -1
  135. package/dist-browser/packageMetadata.mjs +2 -2
  136. package/dist-browser/protocol/Authorize.mjs +1 -1
  137. package/dist-browser/protocol/Token.mjs +1 -1
  138. package/dist-browser/request/AuthenticationHeaderParser.mjs +1 -1
  139. package/dist-browser/request/BaseAuthRequest.mjs +1 -1
  140. package/dist-browser/request/BaseAuthRequest.mjs.map +1 -1
  141. package/dist-browser/request/RequestParameterBuilder.mjs +94 -26
  142. package/dist-browser/request/RequestParameterBuilder.mjs.map +1 -1
  143. package/dist-browser/request/ScopeSet.mjs +1 -1
  144. package/dist-browser/response/ResponseHandler.mjs +11 -3
  145. package/dist-browser/response/ResponseHandler.mjs.map +1 -1
  146. package/dist-browser/telemetry/performance/PerformanceClient.mjs +1 -1
  147. package/dist-browser/telemetry/performance/PerformanceEvent.mjs +1 -1
  148. package/dist-browser/telemetry/performance/PerformanceEvent.mjs.map +1 -1
  149. package/dist-browser/telemetry/performance/PerformanceEvents.mjs +1 -1
  150. package/dist-browser/telemetry/performance/StubPerformanceClient.mjs +1 -1
  151. package/dist-browser/telemetry/server/ServerTelemetryManager.mjs +1 -1
  152. package/dist-browser/url/UrlString.mjs +1 -1
  153. package/dist-browser/utils/ClientAssertionUtils.mjs +1 -1
  154. package/dist-browser/utils/Constants.mjs +1 -1
  155. package/dist-browser/utils/FunctionWrappers.mjs +1 -1
  156. package/dist-browser/utils/ProtocolUtils.mjs +1 -1
  157. package/dist-browser/utils/StringUtils.mjs +1 -1
  158. package/dist-browser/utils/TimeUtils.mjs +1 -1
  159. package/dist-browser/utils/UrlUtils.mjs +1 -1
  160. package/lib/index-browser.cjs +2 -2
  161. package/lib/{index-node-JVUj78ag.js → index-node-3p7V__ym.js} +158 -35
  162. package/lib/index-node-3p7V__ym.js.map +1 -0
  163. package/lib/index-node.cjs +2 -2
  164. package/lib/index.cjs +2 -2
  165. package/package.json +1 -1
  166. package/src/cache/CacheManager.ts +54 -16
  167. package/src/cache/interface/ICacheManager.ts +7 -4
  168. package/src/cache/utils/CacheHelpers.ts +17 -0
  169. package/src/client/AuthorizationCodeClient.ts +13 -0
  170. package/src/client/RefreshTokenClient.ts +13 -0
  171. package/src/constants/AADServerParamKeys.ts +1 -0
  172. package/src/network/RequestThumbprint.ts +5 -0
  173. package/src/packageMetadata.ts +1 -1
  174. package/src/request/BaseAuthRequest.ts +4 -0
  175. package/src/request/RequestParameterBuilder.ts +119 -26
  176. package/src/response/ResponseHandler.ts +13 -1
  177. package/src/telemetry/performance/PerformanceEvent.ts +5 -0
  178. package/types/cache/CacheManager.d.ts +12 -7
  179. package/types/cache/CacheManager.d.ts.map +1 -1
  180. package/types/cache/interface/ICacheManager.d.ts +6 -4
  181. package/types/cache/interface/ICacheManager.d.ts.map +1 -1
  182. package/types/cache/utils/CacheHelpers.d.ts +7 -0
  183. package/types/cache/utils/CacheHelpers.d.ts.map +1 -1
  184. package/types/client/AuthorizationCodeClient.d.ts.map +1 -1
  185. package/types/client/RefreshTokenClient.d.ts.map +1 -1
  186. package/types/constants/AADServerParamKeys.d.ts +1 -0
  187. package/types/constants/AADServerParamKeys.d.ts.map +1 -1
  188. package/types/network/RequestThumbprint.d.ts +1 -0
  189. package/types/network/RequestThumbprint.d.ts.map +1 -1
  190. package/types/packageMetadata.d.ts +1 -1
  191. package/types/request/BaseAuthRequest.d.ts +4 -0
  192. package/types/request/BaseAuthRequest.d.ts.map +1 -1
  193. package/types/request/RequestParameterBuilder.d.ts +22 -4
  194. package/types/request/RequestParameterBuilder.d.ts.map +1 -1
  195. package/types/response/ResponseHandler.d.ts.map +1 -1
  196. package/types/telemetry/performance/PerformanceEvent.d.ts +4 -0
  197. package/types/telemetry/performance/PerformanceEvent.d.ts.map +1 -1
  198. 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.12.0 2026-08-04 */
2
2
  'use strict';
3
3
  'use strict';
4
4
 
@@ -1835,6 +1835,19 @@ function updateCloudDiscoveryMetadata(authorityMetadata, updatedValues, fromNetw
1835
1835
  */
1836
1836
  function isAuthorityMetadataExpired(metadata) {
1837
1837
  return metadata.expiresAt <= nowSeconds();
1838
+ }
1839
+ /**
1840
+ * Serialize attribute tokens synchronously (sort and join).
1841
+ * This is a sync-only operation for use at request construction time.
1842
+ * @param attributeTokens - array of tokens
1843
+ * @returns serialized partition string or undefined if no tokens
1844
+ */
1845
+ function serializeAttributeTokens(attributeTokens) {
1846
+ if (!attributeTokens || attributeTokens.length === 0) {
1847
+ return undefined;
1848
+ }
1849
+ // Serialize: sort and join tokens
1850
+ return [...attributeTokens].sort().join(" ");
1838
1851
  }
1839
1852
 
1840
1853
  var CacheHelpers = /*#__PURE__*/Object.freeze({
@@ -1853,6 +1866,7 @@ var CacheHelpers = /*#__PURE__*/Object.freeze({
1853
1866
  isRefreshTokenEntity: isRefreshTokenEntity,
1854
1867
  isServerTelemetryEntity: isServerTelemetryEntity,
1855
1868
  isThrottlingEntity: isThrottlingEntity,
1869
+ serializeAttributeTokens: serializeAttributeTokens,
1856
1870
  updateAuthorityEndpointMetadata: updateAuthorityEndpointMetadata,
1857
1871
  updateCloudDiscoveryMetadata: updateCloudDiscoveryMetadata
1858
1872
  });
@@ -3058,11 +3072,13 @@ const CLI_DATA = "clidata";
3058
3072
  const USER_FEDERATED_IDENTITY_CREDENTIAL = "user_federated_identity_credential";
3059
3073
  const USERNAME = "username";
3060
3074
  const USER_ID = "user_id";
3061
- const FMI_PATH = "fmi_path";
3075
+ const FMI_PATH = "fmi_path";
3076
+ const ATTRIBUTE_TOKENS = "attribute_tokens";
3062
3077
 
3063
3078
  var AADServerParamKeys = /*#__PURE__*/Object.freeze({
3064
3079
  __proto__: null,
3065
3080
  ACCESS_TOKEN: ACCESS_TOKEN,
3081
+ ATTRIBUTE_TOKENS: ATTRIBUTE_TOKENS,
3066
3082
  BROKER_CLIENT_ID: BROKER_CLIENT_ID,
3067
3083
  BROKER_REDIRECT_URI: BROKER_REDIRECT_URI,
3068
3084
  CCS_HEADER: CCS_HEADER,
@@ -3812,13 +3828,14 @@ function addSid(parameters, sid) {
3812
3828
  * @param claims - The claims string from the request
3813
3829
  * @param clientCapabilities - The client capabilities from configuration
3814
3830
  * @param skipBrokerClaims - When true and BROKER_CLIENT_ID is present, excludes clientCapabilities from claims
3831
+ * @param claimsToMerge - Optional client-originated claims JSON string (e.g. `claimsFromClient`) deep-merged into `claims` with precedence on conflicts
3815
3832
  */
3816
- function addClaims(parameters, correlationId, claims, clientCapabilities, skipBrokerClaims) {
3833
+ function addClaims(parameters, correlationId, claims, clientCapabilities, skipBrokerClaims, claimsToMerge) {
3817
3834
  // Skip clientCapabilities if skipBrokerClaims is set to true and this is a brokered authentication flow
3818
3835
  const configClaims = skipBrokerClaims && parameters.has(BROKER_CLIENT_ID)
3819
3836
  ? undefined
3820
3837
  : clientCapabilities;
3821
- const mergedClaims = buildMergedClaims(claims, configClaims, correlationId);
3838
+ const mergedClaims = buildMergedClaims(claims, configClaims, correlationId, claimsToMerge);
3822
3839
  parameters.set(CLAIMS, mergedClaims);
3823
3840
  }
3824
3841
  /**
@@ -4005,32 +4022,79 @@ const DEFAULT_ID_TOKEN_CLAIMS = {
4005
4022
  [ClaimsRequestKeys.LOGIN_HINT]: { essential: false },
4006
4023
  };
4007
4024
  /**
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.
4025
+ * Parses a claims JSON string into an object, throwing a ClientConfigurationError
4026
+ * (error code `invalid_claims`) if the value is not a valid JSON object. The raw
4027
+ * claims value is never included in the error - it may contain sensitive data.
4028
+ * @param claims - Claims JSON string. Must be valid JSON representing an object.
4029
+ * @param correlationId - The request correlation id
4030
+ * @returns The parsed claims object
4031
+ */
4032
+ function parseClaims(claims, correlationId = "") {
4033
+ let parsed;
4034
+ try {
4035
+ parsed = JSON.parse(claims);
4036
+ }
4037
+ catch (e) {
4038
+ // Malformed JSON
4039
+ throw createClientConfigurationError(invalidClaims, correlationId);
4040
+ }
4041
+ if (!isPlainObject(parsed)) {
4042
+ // Valid JSON, but not an object (e.g. an array, a scalar, or the literal `null`).
4043
+ throw createClientConfigurationError(invalidClaims, correlationId);
4044
+ }
4045
+ return parsed;
4046
+ }
4047
+ /**
4048
+ * Type guard for a non-null, non-array object (a JSON "object" value).
4049
+ * @param value - The value to test
4050
+ * @returns True when value is a plain object that can be deep-merged
4051
+ */
4052
+ function isPlainObject(value) {
4053
+ return typeof value === "object" && value !== null && !Array.isArray(value);
4054
+ }
4055
+ /**
4056
+ * Recursively deep-merges two parsed claims objects. Nested objects are merged key-by-key;
4057
+ * for any other value type (arrays, scalars, null) the value from `claimsToMerge` replaces
4058
+ * the base. This mirrors the deep merge used by msal-dotnet so that, for example, a server
4059
+ * `access_token` challenge and a client-originated `access_token` claim are combined rather
4060
+ * than one clobbering the other.
4061
+ * @param baseClaims - The parsed base claims object
4062
+ * @param claimsToMerge - The parsed claims object merged in with precedence
4063
+ * @returns The deep-merged claims object
4064
+ */
4065
+ function deepMergeClaims(baseClaims, claimsToMerge) {
4066
+ const merged = { ...baseClaims };
4067
+ for (const [key, mergeInValue] of Object.entries(claimsToMerge)) {
4068
+ const baseValue = merged[key];
4069
+ if (isPlainObject(baseValue) && isPlainObject(mergeInValue)) {
4070
+ merged[key] = deepMergeClaims(baseValue, mergeInValue);
4071
+ }
4072
+ else {
4073
+ merged[key] = mergeInValue;
4074
+ }
4075
+ }
4076
+ return merged;
4077
+ }
4078
+ /**
4079
+ * Parses claims JSON, optionally deep-merges a second client-originated claims string
4080
+ * (`claimsToMerge`, e.g. `claimsFromClient`) with precedence on conflicting keys, merges
4081
+ * default optional idToken claims (signin_state, login_hint), and appends client
4082
+ * capabilities (xms_cc) to the access_token section.
4010
4083
  * Does not overwrite idToken claims already specified by the caller.
4011
4084
  * @param claims - Existing claims JSON string from the request (may be undefined)
4012
4085
  * @param clientCapabilities - Client capabilities array from configuration
4086
+ * @param correlationId - The request correlation id
4087
+ * @param claimsToMerge - Optional second claims JSON string (e.g. client-originated `claimsFromClient`)
4088
+ * deep-merged into `claims` with precedence on conflicts; parsed and validated when present. Nested
4089
+ * objects are merged recursively; arrays and scalar values are replaced.
4013
4090
  * @returns Merged claims JSON string
4014
4091
  */
4015
- function buildMergedClaims(claims, clientCapabilities, correlationId = "") {
4016
- let mergedClaims;
4092
+ function buildMergedClaims(claims, clientCapabilities, correlationId = "", claimsToMerge) {
4017
4093
  // 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
- }
4094
+ let mergedClaims = claims ? parseClaims(claims, correlationId) : {};
4095
+ // Deep-merge client-originated claims (e.g. `claimsFromClient`) with precedence on conflicts
4096
+ if (claimsToMerge?.trim()) {
4097
+ mergedClaims = deepMergeClaims(mergedClaims, parseClaims(claimsToMerge, correlationId));
4034
4098
  }
4035
4099
  // Add default optional idToken claims
4036
4100
  if (!Object.prototype.hasOwnProperty.call(mergedClaims, ClaimsRequestKeys.ID_TOKEN)) {
@@ -4132,11 +4196,31 @@ function addResource(parameters, resource) {
4132
4196
  if (resource) {
4133
4197
  parameters.set(RESOURCE, resource);
4134
4198
  }
4199
+ }
4200
+ /**
4201
+ * Add the `attribute_tokens` parameter to a /token request body.
4202
+ *
4203
+ * When `attributeTokens` is a non-empty array the values are sorted lexicographically and joined
4204
+ * with a single space, then written to the request body. When `attributeTokens` is an empty array
4205
+ * the parameter is deleted from the request body.
4206
+ *
4207
+ * @param parameters - request parameter map that will be serialized into the /token body
4208
+ * @param attributeTokens - caller-provided attribute token strings
4209
+ */
4210
+ function addAttributeTokens(parameters, attributeTokens) {
4211
+ const serialized = serializeAttributeTokens(attributeTokens);
4212
+ if (serialized) {
4213
+ parameters.set(ATTRIBUTE_TOKENS, serialized);
4214
+ }
4215
+ else {
4216
+ parameters.delete(ATTRIBUTE_TOKENS);
4217
+ }
4135
4218
  }
4136
4219
 
4137
4220
  var RequestParameterBuilder = /*#__PURE__*/Object.freeze({
4138
4221
  __proto__: null,
4139
4222
  addApplicationTelemetry: addApplicationTelemetry,
4223
+ addAttributeTokens: addAttributeTokens,
4140
4224
  addAuthorizationCode: addAuthorizationCode,
4141
4225
  addBrokerParameters: addBrokerParameters,
4142
4226
  addCcsOid: addCcsOid,
@@ -4516,7 +4600,7 @@ class Logger {
4516
4600
 
4517
4601
  /* eslint-disable header/header */
4518
4602
  const name = "@azure/msal-common";
4519
- const version = "16.11.3";
4603
+ const version = "16.12.0";
4520
4604
 
4521
4605
  /*
4522
4606
  * Copyright (c) Microsoft Corporation. All rights reserved.
@@ -4792,9 +4876,17 @@ class CacheManager {
4792
4876
  }
4793
4877
  /**
4794
4878
  * saves access token credential
4795
- * @param credential
4879
+ * @param credential - the access token entity to save
4880
+ * @param correlationId - unique identifier for the request
4881
+ * @param kmsi - keep me signed in flag
4796
4882
  */
4797
4883
  async saveAccessToken(credential, correlationId, kmsi) {
4884
+ // Compute hash from components on the entity itself — no need to thread externally.
4885
+ let additionalCacheKeyHash;
4886
+ if (credential.additionalCacheKeyComponents &&
4887
+ Object.keys(credential.additionalCacheKeyComponents).length > 0) {
4888
+ additionalCacheKeyHash = await this.cryptoImpl.hashString(JSON.stringify(credential.additionalCacheKeyComponents));
4889
+ }
4798
4890
  const accessTokenFilter = {
4799
4891
  clientId: credential.clientId,
4800
4892
  credentialType: credential.credentialType,
@@ -4818,7 +4910,7 @@ class CacheManager {
4818
4910
  }
4819
4911
  }
4820
4912
  });
4821
- await this.setAccessTokenCredential(credential, correlationId, kmsi);
4913
+ await this.setAccessTokenCredential(credential, correlationId, kmsi, additionalCacheKeyHash);
4822
4914
  }
4823
4915
  /**
4824
4916
  * Retrieve account entities matching all provided tenant-agnostic filters; if no filter is set, get all account entities in the cache
@@ -5230,6 +5322,12 @@ class CacheManager {
5230
5322
  AuthenticationScheme.BEARER.toLowerCase()
5231
5323
  ? CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME
5232
5324
  : CredentialType.ACCESS_TOKEN;
5325
+ const attributeTokenPartition = serializeAttributeTokens(request.attributeTokens);
5326
+ const additionalCacheKeyComponents = attributeTokenPartition
5327
+ ? {
5328
+ attribute_tokens: attributeTokenPartition,
5329
+ }
5330
+ : undefined;
5233
5331
  const accessTokenFilter = {
5234
5332
  homeAccountId: account.homeAccountId,
5235
5333
  environment: account.environment,
@@ -5239,10 +5337,12 @@ class CacheManager {
5239
5337
  target: scopes,
5240
5338
  tokenType: authScheme,
5241
5339
  keyId: request.sshKid,
5340
+ additionalCacheKeyComponents: additionalCacheKeyComponents,
5242
5341
  };
5243
5342
  const accessTokenKeys = (tokenKeys && tokenKeys.accessToken) ||
5244
5343
  this.getTokenKeys().accessToken;
5245
5344
  const accessTokens = [];
5345
+ const matchedKeys = [];
5246
5346
  accessTokenKeys.forEach((key) => {
5247
5347
  // Validate key
5248
5348
  if (this.accessTokenKeyMatchesFilter(key, accessTokenFilter, true)) {
@@ -5251,18 +5351,18 @@ class CacheManager {
5251
5351
  if (accessToken &&
5252
5352
  this.credentialMatchesFilter(accessToken, accessTokenFilter, correlationId)) {
5253
5353
  accessTokens.push(accessToken);
5354
+ matchedKeys.push(key);
5254
5355
  }
5255
5356
  }
5256
5357
  });
5257
- const numAccessTokens = accessTokens.length;
5258
- if (numAccessTokens < 1) {
5358
+ if (accessTokens.length < 1) {
5259
5359
  this.commonLogger.info("CacheManager:getAccessToken - No token found", correlationId);
5260
5360
  return null;
5261
5361
  }
5262
- else if (numAccessTokens > 1) {
5362
+ else if (accessTokens.length > 1) {
5263
5363
  this.commonLogger.info("CacheManager:getAccessToken - Multiple access tokens found, clearing them", correlationId);
5264
- accessTokens.forEach((accessToken) => {
5265
- this.removeAccessToken(this.generateCredentialKey(accessToken), correlationId);
5364
+ matchedKeys.forEach((key) => {
5365
+ this.removeAccessToken(key, correlationId);
5266
5366
  });
5267
5367
  this.performanceClient.addFields({ multiMatchedAT: accessTokens.length }, correlationId);
5268
5368
  return null;
@@ -5705,7 +5805,9 @@ class DefaultStorageClass extends CacheManager {
5705
5805
  getTokenKeys() {
5706
5806
  throw createClientAuthError(methodNotImplemented, "");
5707
5807
  }
5708
- generateCredentialKey() {
5808
+ /* eslint-disable @typescript-eslint/no-unused-vars */
5809
+ generateCredentialKey(_credential, _hash) {
5810
+ /* eslint-enable @typescript-eslint/no-unused-vars */
5709
5811
  throw createClientAuthError(methodNotImplemented, "");
5710
5812
  }
5711
5813
  generateAccountKey() {
@@ -6340,7 +6442,15 @@ class ResponseHandler {
6340
6442
  // Add keyId from request to serverTokenResponse if defined
6341
6443
  serverTokenResponse.key_id =
6342
6444
  serverTokenResponse.key_id || request.sshKid || undefined;
6343
- const cacheRecord = this.generateCacheRecord(serverTokenResponse, authority, reqTimestamp, request, idTokenClaims, userAssertionHash, authCodePayload, additionalCacheKeyComponents);
6445
+ // Compute components once for entity storage (fallback if hash not provided by client)
6446
+ const attributeTokenPartition = serializeAttributeTokens(request.attributeTokens);
6447
+ const cacheKeyComponents = additionalCacheKeyComponents ??
6448
+ (attributeTokenPartition
6449
+ ? {
6450
+ attribute_tokens: attributeTokenPartition,
6451
+ }
6452
+ : undefined);
6453
+ const cacheRecord = this.generateCacheRecord(serverTokenResponse, authority, reqTimestamp, request, idTokenClaims, userAssertionHash, authCodePayload, cacheKeyComponents);
6344
6454
  let cacheContext;
6345
6455
  try {
6346
6456
  if (this.persistencePlugin && this.serializableCache) {
@@ -6652,6 +6762,7 @@ function getRequestThumbprint(clientId, request, homeAccountId) {
6652
6762
  sshKid: request.sshKid,
6653
6763
  embeddedClientId: request.embeddedClientId || request.extraParameters?.clientId,
6654
6764
  resource: request.resource,
6765
+ attributeTokens: serializeAttributeTokens(request.attributeTokens),
6655
6766
  };
6656
6767
  }
6657
6768
 
@@ -7009,6 +7120,12 @@ class AuthorizationCodeClient {
7009
7120
  // Add scope array, parameter builder will add default scopes and dedupe
7010
7121
  addScopes(parameters, request.scopes, request.correlationId, true, this.oidcDefaultScopes);
7011
7122
  addResource(parameters, request.resource);
7123
+ if (request.attributeTokens) {
7124
+ addAttributeTokens(parameters, request.attributeTokens);
7125
+ }
7126
+ this.performanceClient?.addFields({
7127
+ hasAttributeTokens: !!request.attributeTokens?.length,
7128
+ }, request.correlationId);
7012
7129
  // add code: user set, not validated
7013
7130
  addAuthorizationCode(parameters, request.code);
7014
7131
  // Add library metadata
@@ -7304,6 +7421,12 @@ class RefreshTokenClient {
7304
7421
  addServerTelemetry(parameters, this.serverTelemetryManager);
7305
7422
  }
7306
7423
  addRefreshToken(parameters, request.refreshToken);
7424
+ if (request.attributeTokens) {
7425
+ addAttributeTokens(parameters, request.attributeTokens);
7426
+ }
7427
+ this.performanceClient?.addFields({
7428
+ hasAttributeTokens: !!request.attributeTokens?.length,
7429
+ }, request.correlationId);
7307
7430
  if (this.config.clientCredentials.clientSecret) {
7308
7431
  addClientSecret(parameters, this.config.clientCredentials.clientSecret);
7309
7432
  }
@@ -8217,4 +8340,4 @@ exports.invokeAsync = invokeAsync;
8217
8340
  exports.tenantIdMatchesHomeTenant = tenantIdMatchesHomeTenant;
8218
8341
  exports.updateAccountTenantProfileData = updateAccountTenantProfileData;
8219
8342
  exports.version = version;
8220
- //# sourceMappingURL=index-node-JVUj78ag.js.map
8343
+ //# sourceMappingURL=index-node-3p7V__ym.js.map