@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.
- 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 +2 -5
- package/dist/authority/AuthorityMetadata.mjs.map +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 +55 -19
- 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 +24 -4
- package/dist/cache/utils/CacheHelpers.mjs.map +1 -1
- package/dist/client/AuthorizationCodeClient.mjs +10 -4
- package/dist/client/AuthorizationCodeClient.mjs.map +1 -1
- package/dist/client/RefreshTokenClient.mjs +10 -4
- package/dist/client/RefreshTokenClient.mjs.map +1 -1
- package/dist/client/SilentFlowClient.mjs +5 -2
- package/dist/client/SilentFlowClient.mjs.map +1 -1
- package/dist/config/ClientConfiguration.mjs +4 -2
- package/dist/config/ClientConfiguration.mjs.map +1 -1
- package/dist/constants/AADServerParamKeys.mjs +4 -3
- package/dist/constants/AADServerParamKeys.mjs.map +1 -1
- package/dist/crypto/ICrypto.mjs +16 -11
- package/dist/crypto/ICrypto.mjs.map +1 -1
- package/dist/crypto/ITokenBindingKeyManager.mjs +28 -0
- package/dist/crypto/ITokenBindingKeyManager.mjs.map +1 -0
- package/dist/crypto/JoseHeader.mjs +38 -11
- package/dist/crypto/JoseHeader.mjs.map +1 -1
- package/dist/crypto/PopTokenGenerator.mjs +28 -5
- package/dist/crypto/PopTokenGenerator.mjs.map +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 +3 -2
- package/dist/error/ClientConfigurationErrorCodes.mjs.map +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 +5 -3
- package/dist/error/JoseHeaderErrorCodes.mjs.map +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 +3 -2
- package/dist/index-node.mjs.map +1 -1
- package/dist/index.mjs +3 -2
- package/dist/index.mjs.map +1 -1
- package/dist/logger/Logger.mjs +1 -1
- package/dist/network/INetworkModule.mjs +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 +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 +30 -8
- package/dist/response/ResponseHandler.mjs.map +1 -1
- package/dist/telemetry/performance/PerformanceClient.mjs +1 -1
- package/dist/telemetry/performance/PerformanceEvent.mjs +1 -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 +2 -1
- package/dist/utils/Constants.mjs.map +1 -1
- package/dist/utils/FunctionWrappers.mjs +1 -1
- package/dist/utils/ObjectUtils.mjs +28 -0
- package/dist/utils/ObjectUtils.mjs.map +1 -0
- 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 +2 -5
- package/dist-browser/authority/AuthorityMetadata.mjs.map +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 +55 -19
- 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 +24 -4
- package/dist-browser/cache/utils/CacheHelpers.mjs.map +1 -1
- package/dist-browser/client/AuthorizationCodeClient.mjs +10 -4
- package/dist-browser/client/AuthorizationCodeClient.mjs.map +1 -1
- package/dist-browser/client/RefreshTokenClient.mjs +10 -4
- package/dist-browser/client/RefreshTokenClient.mjs.map +1 -1
- package/dist-browser/client/SilentFlowClient.mjs +5 -2
- package/dist-browser/client/SilentFlowClient.mjs.map +1 -1
- package/dist-browser/config/ClientConfiguration.mjs +4 -2
- package/dist-browser/config/ClientConfiguration.mjs.map +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 +16 -11
- package/dist-browser/crypto/ICrypto.mjs.map +1 -1
- package/dist-browser/crypto/ITokenBindingKeyManager.mjs +28 -0
- package/dist-browser/crypto/ITokenBindingKeyManager.mjs.map +1 -0
- package/dist-browser/crypto/JoseHeader.mjs +38 -11
- package/dist-browser/crypto/JoseHeader.mjs.map +1 -1
- package/dist-browser/crypto/PopTokenGenerator.mjs +28 -5
- package/dist-browser/crypto/PopTokenGenerator.mjs.map +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 +3 -2
- package/dist-browser/error/ClientConfigurationErrorCodes.mjs.map +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 +5 -3
- package/dist-browser/error/JoseHeaderErrorCodes.mjs.map +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 +3 -2
- package/dist-browser/index-browser.mjs.map +1 -1
- package/dist-browser/index.mjs +3 -2
- package/dist-browser/index.mjs.map +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/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 +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 +30 -8
- 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 +1 -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 +2 -1
- package/dist-browser/utils/Constants.mjs.map +1 -1
- package/dist-browser/utils/FunctionWrappers.mjs +1 -1
- package/dist-browser/utils/ObjectUtils.mjs +28 -0
- package/dist-browser/utils/ObjectUtils.mjs.map +1 -0
- 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 +5 -67
- package/lib/index-browser.cjs.map +1 -1
- package/lib/{index-node-JVUj78ag.js → index-node-BaODPZEy.js} +404 -75
- package/lib/index-node-BaODPZEy.js.map +1 -0
- package/lib/index-node.cjs +4 -2
- package/lib/index-node.cjs.map +1 -1
- package/lib/index.cjs +5 -3
- package/lib/index.cjs.map +1 -1
- package/package.json +1 -1
- package/src/authority/AuthorityMetadata.ts +1 -4
- package/src/cache/CacheManager.ts +100 -29
- package/src/cache/interface/ICacheManager.ts +7 -4
- package/src/cache/utils/CacheHelpers.ts +28 -1
- package/src/client/AuthorizationCodeClient.ts +16 -1
- package/src/client/RefreshTokenClient.ts +16 -1
- package/src/client/SilentFlowClient.ts +4 -1
- package/src/config/ClientConfiguration.ts +10 -0
- package/src/constants/AADServerParamKeys.ts +1 -0
- package/src/crypto/DpopProofGenerator.ts +52 -59
- package/src/crypto/ICrypto.ts +31 -26
- package/src/crypto/ITokenBindingKeyManager.ts +84 -0
- package/src/crypto/JoseHeader.ts +74 -14
- package/src/crypto/PopTokenGenerator.ts +62 -18
- package/src/error/ClientConfigurationErrorCodes.ts +2 -0
- package/src/error/JoseHeaderErrorCodes.ts +2 -0
- package/src/exports-common.ts +7 -0
- package/src/network/RequestThumbprint.ts +5 -0
- package/src/packageMetadata.ts +1 -1
- package/src/request/BaseAuthRequest.ts +4 -0
- package/src/request/RequestParameterBuilder.ts +119 -26
- package/src/response/ResponseHandler.ts +56 -15
- package/src/telemetry/performance/PerformanceEvent.ts +15 -0
- package/src/utils/Constants.ts +1 -0
- package/src/utils/ObjectUtils.ts +31 -0
- package/types/authority/AuthorityMetadata.d.ts.map +1 -1
- package/types/cache/CacheManager.d.ts +14 -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/client/SilentFlowClient.d.ts.map +1 -1
- package/types/config/ClientConfiguration.d.ts +5 -1
- package/types/config/ClientConfiguration.d.ts.map +1 -1
- package/types/constants/AADServerParamKeys.d.ts +1 -0
- package/types/constants/AADServerParamKeys.d.ts.map +1 -1
- package/types/crypto/DpopProofGenerator.d.ts +10 -36
- package/types/crypto/DpopProofGenerator.d.ts.map +1 -1
- package/types/crypto/ICrypto.d.ts +10 -9
- package/types/crypto/ICrypto.d.ts.map +1 -1
- package/types/crypto/ITokenBindingKeyManager.d.ts +41 -0
- package/types/crypto/ITokenBindingKeyManager.d.ts.map +1 -0
- package/types/crypto/JoseHeader.d.ts +17 -5
- package/types/crypto/JoseHeader.d.ts.map +1 -1
- package/types/crypto/PopTokenGenerator.d.ts +3 -1
- package/types/crypto/PopTokenGenerator.d.ts.map +1 -1
- package/types/error/ClientConfigurationErrorCodes.d.ts +1 -0
- package/types/error/ClientConfigurationErrorCodes.d.ts.map +1 -1
- package/types/error/JoseHeaderErrorCodes.d.ts +2 -0
- package/types/error/JoseHeaderErrorCodes.d.ts.map +1 -1
- package/types/exports-common.d.ts +3 -2
- package/types/exports-common.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 +12 -2
- package/types/response/ResponseHandler.d.ts.map +1 -1
- package/types/telemetry/performance/PerformanceEvent.d.ts +12 -0
- package/types/telemetry/performance/PerformanceEvent.d.ts.map +1 -1
- package/types/utils/Constants.d.ts +1 -0
- package/types/utils/Constants.d.ts.map +1 -1
- package/types/utils/ObjectUtils.d.ts +6 -0
- package/types/utils/ObjectUtils.d.ts.map +1 -0
- package/lib/index-node-JVUj78ag.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @azure/msal-common v16.
|
|
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 (
|
|
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
|
|
4009
|
-
*
|
|
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
|
-
|
|
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
|
-
}
|
|
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
|
|
4213
|
-
throw createClientAuthError(methodNotImplemented,
|
|
4311
|
+
async removeTokenBindingKey(kid, correlationId) {
|
|
4312
|
+
throw createClientAuthError(methodNotImplemented, correlationId);
|
|
4214
4313
|
},
|
|
4215
|
-
async
|
|
4216
|
-
throw createClientAuthError(methodNotImplemented,
|
|
4314
|
+
async clearKeystore(correlationId) {
|
|
4315
|
+
throw createClientAuthError(methodNotImplemented, correlationId);
|
|
4217
4316
|
},
|
|
4218
|
-
async
|
|
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.
|
|
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 (
|
|
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:
|
|
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
|
-
|
|
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 (
|
|
5390
|
+
else if (accessTokens.length > 1) {
|
|
5263
5391
|
this.commonLogger.info("CacheManager:getAccessToken - Multiple access tokens found, clearing them", correlationId);
|
|
5264
|
-
|
|
5265
|
-
this.removeAccessToken(
|
|
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 &&
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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.
|
|
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-
|
|
8549
|
+
//# sourceMappingURL=index-node-BaODPZEy.js.map
|