@azure/msal-common 16.11.2 → 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.
- package/dist/account/AccountInfo.mjs +1 -1
- package/dist/account/AuthToken.mjs +1 -1
- package/dist/account/CcsCredential.mjs +1 -1
- package/dist/account/ClientInfo.mjs +1 -1
- package/dist/account/TokenClaims.mjs +1 -1
- package/dist/authority/Authority.mjs +1 -1
- package/dist/authority/AuthorityFactory.mjs +1 -1
- package/dist/authority/AuthorityMetadata.mjs +1 -1
- package/dist/authority/AuthorityOptions.mjs +1 -1
- package/dist/authority/AuthorityType.mjs +1 -1
- package/dist/authority/CloudInstanceDiscoveryErrorResponse.mjs +1 -1
- package/dist/authority/CloudInstanceDiscoveryResponse.mjs +1 -1
- package/dist/authority/OpenIdConfigResponse.mjs +1 -1
- package/dist/authority/ProtocolMode.mjs +1 -1
- package/dist/authority/RegionDiscovery.mjs +1 -1
- package/dist/cache/CacheManager.mjs +28 -9
- package/dist/cache/CacheManager.mjs.map +1 -1
- package/dist/cache/persistence/TokenCacheContext.mjs +1 -1
- package/dist/cache/utils/AccountEntityUtils.mjs +1 -1
- package/dist/cache/utils/CacheHelpers.mjs +15 -2
- package/dist/cache/utils/CacheHelpers.mjs.map +1 -1
- package/dist/client/AuthorizationCodeClient.mjs +8 -2
- package/dist/client/AuthorizationCodeClient.mjs.map +1 -1
- package/dist/client/RefreshTokenClient.mjs +8 -2
- package/dist/client/RefreshTokenClient.mjs.map +1 -1
- package/dist/client/SilentFlowClient.mjs +1 -1
- package/dist/config/ClientConfiguration.mjs +1 -1
- package/dist/constants/AADServerParamKeys.mjs +4 -3
- package/dist/constants/AADServerParamKeys.mjs.map +1 -1
- package/dist/crypto/ICrypto.mjs +1 -1
- package/dist/crypto/JoseHeader.mjs +1 -1
- package/dist/crypto/PopTokenGenerator.mjs +1 -1
- package/dist/error/AuthError.mjs +1 -1
- package/dist/error/AuthErrorCodes.mjs +1 -1
- package/dist/error/CacheError.mjs +1 -1
- package/dist/error/CacheErrorCodes.mjs +1 -1
- package/dist/error/ClientAuthError.mjs +1 -1
- package/dist/error/ClientAuthErrorCodes.mjs +1 -1
- package/dist/error/ClientConfigurationError.mjs +1 -1
- package/dist/error/ClientConfigurationErrorCodes.mjs +1 -1
- package/dist/error/InteractionRequiredAuthError.mjs +1 -1
- package/dist/error/InteractionRequiredAuthErrorCodes.mjs +1 -1
- package/dist/error/JoseHeaderError.mjs +1 -1
- package/dist/error/JoseHeaderErrorCodes.mjs +1 -1
- package/dist/error/NetworkError.mjs +1 -1
- package/dist/error/PlatformBrokerError.mjs +1 -1
- package/dist/error/ServerError.mjs +1 -1
- package/dist/index-node.mjs +1 -1
- package/dist/index.mjs +1 -1
- package/dist/logger/Logger.mjs +1 -1
- package/dist/network/INetworkModule.mjs +1 -1
- package/dist/network/INetworkModule.mjs.map +1 -1
- package/dist/network/RequestThumbprint.mjs +4 -1
- package/dist/network/RequestThumbprint.mjs.map +1 -1
- package/dist/network/ThrottlingUtils.mjs +1 -1
- package/dist/packageMetadata.mjs +2 -2
- package/dist/protocol/Authorize.mjs +1 -1
- package/dist/protocol/Token.mjs +2 -2
- package/dist/protocol/Token.mjs.map +1 -1
- package/dist/request/AuthenticationHeaderParser.mjs +1 -1
- package/dist/request/BaseAuthRequest.mjs +1 -1
- package/dist/request/BaseAuthRequest.mjs.map +1 -1
- package/dist/request/RequestParameterBuilder.mjs +94 -26
- package/dist/request/RequestParameterBuilder.mjs.map +1 -1
- package/dist/request/ScopeSet.mjs +1 -1
- package/dist/response/ResponseHandler.mjs +11 -3
- package/dist/response/ResponseHandler.mjs.map +1 -1
- package/dist/telemetry/performance/PerformanceClient.mjs +1 -1
- package/dist/telemetry/performance/PerformanceEvent.mjs +2 -1
- package/dist/telemetry/performance/PerformanceEvent.mjs.map +1 -1
- package/dist/telemetry/performance/PerformanceEvents.mjs +1 -1
- package/dist/telemetry/performance/StubPerformanceClient.mjs +1 -1
- package/dist/telemetry/server/ServerTelemetryManager.mjs +1 -1
- package/dist/url/UrlString.mjs +1 -1
- package/dist/utils/ClientAssertionUtils.mjs +1 -1
- package/dist/utils/Constants.mjs +1 -1
- package/dist/utils/FunctionWrappers.mjs +1 -1
- package/dist/utils/ProtocolUtils.mjs +1 -1
- package/dist/utils/StringUtils.mjs +1 -1
- package/dist/utils/TimeUtils.mjs +1 -1
- package/dist/utils/UrlUtils.mjs +1 -1
- package/dist-browser/account/AccountInfo.mjs +1 -1
- package/dist-browser/account/AuthToken.mjs +1 -1
- package/dist-browser/account/CcsCredential.mjs +1 -1
- package/dist-browser/account/ClientInfo.mjs +1 -1
- package/dist-browser/account/TokenClaims.mjs +1 -1
- package/dist-browser/authority/Authority.mjs +1 -1
- package/dist-browser/authority/AuthorityFactory.mjs +1 -1
- package/dist-browser/authority/AuthorityMetadata.mjs +1 -1
- package/dist-browser/authority/AuthorityOptions.mjs +1 -1
- package/dist-browser/authority/AuthorityType.mjs +1 -1
- package/dist-browser/authority/CloudInstanceDiscoveryErrorResponse.mjs +1 -1
- package/dist-browser/authority/CloudInstanceDiscoveryResponse.mjs +1 -1
- package/dist-browser/authority/OpenIdConfigResponse.mjs +1 -1
- package/dist-browser/authority/ProtocolMode.mjs +1 -1
- package/dist-browser/authority/RegionDiscovery.mjs +1 -1
- package/dist-browser/cache/CacheManager.mjs +28 -9
- package/dist-browser/cache/CacheManager.mjs.map +1 -1
- package/dist-browser/cache/persistence/TokenCacheContext.mjs +1 -1
- package/dist-browser/cache/utils/AccountEntityUtils.mjs +1 -1
- package/dist-browser/cache/utils/CacheHelpers.mjs +15 -2
- package/dist-browser/cache/utils/CacheHelpers.mjs.map +1 -1
- package/dist-browser/client/AuthorizationCodeClient.mjs +8 -2
- package/dist-browser/client/AuthorizationCodeClient.mjs.map +1 -1
- package/dist-browser/client/RefreshTokenClient.mjs +8 -2
- package/dist-browser/client/RefreshTokenClient.mjs.map +1 -1
- package/dist-browser/client/SilentFlowClient.mjs +1 -1
- package/dist-browser/config/ClientConfiguration.mjs +1 -1
- package/dist-browser/constants/AADServerParamKeys.mjs +4 -3
- package/dist-browser/constants/AADServerParamKeys.mjs.map +1 -1
- package/dist-browser/crypto/ICrypto.mjs +1 -1
- package/dist-browser/crypto/JoseHeader.mjs +1 -1
- package/dist-browser/crypto/PopTokenGenerator.mjs +1 -1
- package/dist-browser/error/AuthError.mjs +1 -1
- package/dist-browser/error/AuthErrorCodes.mjs +1 -1
- package/dist-browser/error/CacheError.mjs +1 -1
- package/dist-browser/error/CacheErrorCodes.mjs +1 -1
- package/dist-browser/error/ClientAuthError.mjs +1 -1
- package/dist-browser/error/ClientAuthErrorCodes.mjs +1 -1
- package/dist-browser/error/ClientConfigurationError.mjs +1 -1
- package/dist-browser/error/ClientConfigurationErrorCodes.mjs +1 -1
- package/dist-browser/error/InteractionRequiredAuthError.mjs +1 -1
- package/dist-browser/error/InteractionRequiredAuthErrorCodes.mjs +1 -1
- package/dist-browser/error/JoseHeaderError.mjs +1 -1
- package/dist-browser/error/JoseHeaderErrorCodes.mjs +1 -1
- package/dist-browser/error/NetworkError.mjs +1 -1
- package/dist-browser/error/PlatformBrokerError.mjs +1 -1
- package/dist-browser/error/ServerError.mjs +1 -1
- package/dist-browser/index-browser.mjs +1 -1
- package/dist-browser/index.mjs +1 -1
- package/dist-browser/log-strings-mapping.json +2 -2
- package/dist-browser/logger/Logger.mjs +1 -1
- package/dist-browser/network/INetworkModule.mjs +1 -1
- package/dist-browser/network/INetworkModule.mjs.map +1 -1
- package/dist-browser/network/RequestThumbprint.mjs +4 -1
- package/dist-browser/network/RequestThumbprint.mjs.map +1 -1
- package/dist-browser/network/ThrottlingUtils.mjs +1 -1
- package/dist-browser/packageMetadata.mjs +2 -2
- package/dist-browser/protocol/Authorize.mjs +1 -1
- package/dist-browser/protocol/Token.mjs +2 -2
- package/dist-browser/protocol/Token.mjs.map +1 -1
- package/dist-browser/request/AuthenticationHeaderParser.mjs +1 -1
- package/dist-browser/request/BaseAuthRequest.mjs +1 -1
- package/dist-browser/request/BaseAuthRequest.mjs.map +1 -1
- package/dist-browser/request/RequestParameterBuilder.mjs +94 -26
- package/dist-browser/request/RequestParameterBuilder.mjs.map +1 -1
- package/dist-browser/request/ScopeSet.mjs +1 -1
- package/dist-browser/response/ResponseHandler.mjs +11 -3
- package/dist-browser/response/ResponseHandler.mjs.map +1 -1
- package/dist-browser/telemetry/performance/PerformanceClient.mjs +1 -1
- package/dist-browser/telemetry/performance/PerformanceEvent.mjs +2 -1
- package/dist-browser/telemetry/performance/PerformanceEvent.mjs.map +1 -1
- package/dist-browser/telemetry/performance/PerformanceEvents.mjs +1 -1
- package/dist-browser/telemetry/performance/StubPerformanceClient.mjs +1 -1
- package/dist-browser/telemetry/server/ServerTelemetryManager.mjs +1 -1
- package/dist-browser/url/UrlString.mjs +1 -1
- package/dist-browser/utils/ClientAssertionUtils.mjs +1 -1
- package/dist-browser/utils/Constants.mjs +1 -1
- package/dist-browser/utils/FunctionWrappers.mjs +1 -1
- package/dist-browser/utils/ProtocolUtils.mjs +1 -1
- package/dist-browser/utils/StringUtils.mjs +1 -1
- package/dist-browser/utils/TimeUtils.mjs +1 -1
- package/dist-browser/utils/UrlUtils.mjs +1 -1
- package/lib/index-browser.cjs +2 -2
- package/lib/{index-node-CqVflMt1.js → index-node-3p7V__ym.js} +160 -36
- package/lib/index-node-3p7V__ym.js.map +1 -0
- package/lib/index-node.cjs +2 -2
- package/lib/index.cjs +2 -2
- package/package.json +1 -1
- package/src/cache/CacheManager.ts +54 -16
- package/src/cache/interface/ICacheManager.ts +7 -4
- package/src/cache/utils/CacheHelpers.ts +17 -0
- package/src/client/AuthorizationCodeClient.ts +13 -0
- package/src/client/RefreshTokenClient.ts +13 -0
- package/src/constants/AADServerParamKeys.ts +1 -0
- package/src/network/INetworkModule.ts +6 -1
- package/src/network/RequestThumbprint.ts +5 -0
- package/src/packageMetadata.ts +1 -1
- package/src/protocol/Token.ts +1 -1
- package/src/request/BaseAuthRequest.ts +4 -0
- package/src/request/RequestParameterBuilder.ts +119 -26
- package/src/response/ResponseHandler.ts +13 -1
- package/src/telemetry/performance/PerformanceEvent.ts +11 -0
- package/types/cache/CacheManager.d.ts +12 -7
- package/types/cache/CacheManager.d.ts.map +1 -1
- package/types/cache/interface/ICacheManager.d.ts +6 -4
- package/types/cache/interface/ICacheManager.d.ts.map +1 -1
- package/types/cache/utils/CacheHelpers.d.ts +7 -0
- package/types/cache/utils/CacheHelpers.d.ts.map +1 -1
- package/types/client/AuthorizationCodeClient.d.ts.map +1 -1
- package/types/client/RefreshTokenClient.d.ts.map +1 -1
- package/types/constants/AADServerParamKeys.d.ts +1 -0
- package/types/constants/AADServerParamKeys.d.ts.map +1 -1
- package/types/network/INetworkModule.d.ts +6 -1
- package/types/network/INetworkModule.d.ts.map +1 -1
- package/types/network/RequestThumbprint.d.ts +1 -0
- package/types/network/RequestThumbprint.d.ts.map +1 -1
- package/types/packageMetadata.d.ts +1 -1
- package/types/request/BaseAuthRequest.d.ts +4 -0
- package/types/request/BaseAuthRequest.d.ts.map +1 -1
- package/types/request/RequestParameterBuilder.d.ts +22 -4
- package/types/request/RequestParameterBuilder.d.ts.map +1 -1
- package/types/response/ResponseHandler.d.ts.map +1 -1
- package/types/telemetry/performance/PerformanceEvent.d.ts +8 -0
- package/types/telemetry/performance/PerformanceEvent.d.ts.map +1 -1
- package/lib/index-node-CqVflMt1.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @azure/msal-common v16.
|
|
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
|
|
4009
|
-
*
|
|
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
|
-
|
|
4019
|
-
|
|
4020
|
-
|
|
4021
|
-
|
|
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.
|
|
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
|
-
|
|
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 (
|
|
5362
|
+
else if (accessTokens.length > 1) {
|
|
5263
5363
|
this.commonLogger.info("CacheManager:getAccessToken - Multiple access tokens found, clearing them", correlationId);
|
|
5264
|
-
|
|
5265
|
-
this.removeAccessToken(
|
|
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
|
-
|
|
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() {
|
|
@@ -5775,6 +5877,7 @@ const IntFields = new Set([
|
|
|
5775
5877
|
"networkRtt",
|
|
5776
5878
|
"redirectBridgeTimeoutMs",
|
|
5777
5879
|
"redirectBridgeMessageVersion",
|
|
5880
|
+
"fetchRetryCount",
|
|
5778
5881
|
]);
|
|
5779
5882
|
|
|
5780
5883
|
/*
|
|
@@ -6339,7 +6442,15 @@ class ResponseHandler {
|
|
|
6339
6442
|
// Add keyId from request to serverTokenResponse if defined
|
|
6340
6443
|
serverTokenResponse.key_id =
|
|
6341
6444
|
serverTokenResponse.key_id || request.sshKid || undefined;
|
|
6342
|
-
|
|
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);
|
|
6343
6454
|
let cacheContext;
|
|
6344
6455
|
try {
|
|
6345
6456
|
if (this.persistencePlugin && this.serializableCache) {
|
|
@@ -6651,6 +6762,7 @@ function getRequestThumbprint(clientId, request, homeAccountId) {
|
|
|
6651
6762
|
sshKid: request.sshKid,
|
|
6652
6763
|
embeddedClientId: request.embeddedClientId || request.extraParameters?.clientId,
|
|
6653
6764
|
resource: request.resource,
|
|
6765
|
+
attributeTokens: serializeAttributeTokens(request.attributeTokens),
|
|
6654
6766
|
};
|
|
6655
6767
|
}
|
|
6656
6768
|
|
|
@@ -6845,7 +6957,7 @@ async function sendPostRequest(thumbprint, tokenEndpoint, options, correlationId
|
|
|
6845
6957
|
ThrottlingUtils.preProcess(cacheManager, thumbprint, correlationId);
|
|
6846
6958
|
let response;
|
|
6847
6959
|
try {
|
|
6848
|
-
response = await invokeAsync((networkClient.sendPostRequestAsync.bind(networkClient)), NetworkClientSendPostRequestAsync, logger, performanceClient, correlationId)(tokenEndpoint, options);
|
|
6960
|
+
response = await invokeAsync((networkClient.sendPostRequestAsync.bind(networkClient)), NetworkClientSendPostRequestAsync, logger, performanceClient, correlationId)(tokenEndpoint, { ...options, correlationId, performanceClient });
|
|
6849
6961
|
const responseHeaders = response.headers || {};
|
|
6850
6962
|
performanceClient?.addFields({
|
|
6851
6963
|
refreshTokenSize: response.body.refresh_token?.length || 0,
|
|
@@ -7008,6 +7120,12 @@ class AuthorizationCodeClient {
|
|
|
7008
7120
|
// Add scope array, parameter builder will add default scopes and dedupe
|
|
7009
7121
|
addScopes(parameters, request.scopes, request.correlationId, true, this.oidcDefaultScopes);
|
|
7010
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);
|
|
7011
7129
|
// add code: user set, not validated
|
|
7012
7130
|
addAuthorizationCode(parameters, request.code);
|
|
7013
7131
|
// Add library metadata
|
|
@@ -7303,6 +7421,12 @@ class RefreshTokenClient {
|
|
|
7303
7421
|
addServerTelemetry(parameters, this.serverTelemetryManager);
|
|
7304
7422
|
}
|
|
7305
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);
|
|
7306
7430
|
if (this.config.clientCredentials.clientSecret) {
|
|
7307
7431
|
addClientSecret(parameters, this.config.clientCredentials.clientSecret);
|
|
7308
7432
|
}
|
|
@@ -8216,4 +8340,4 @@ exports.invokeAsync = invokeAsync;
|
|
|
8216
8340
|
exports.tenantIdMatchesHomeTenant = tenantIdMatchesHomeTenant;
|
|
8217
8341
|
exports.updateAccountTenantProfileData = updateAccountTenantProfileData;
|
|
8218
8342
|
exports.version = version;
|
|
8219
|
-
//# sourceMappingURL=index-node-
|
|
8343
|
+
//# sourceMappingURL=index-node-3p7V__ym.js.map
|