@azure/msal-common 16.12.0 → 16.14.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 +2 -4
- package/dist/authority/Authority.mjs.map +1 -1
- package/dist/authority/AuthorityFactory.mjs +1 -1
- package/dist/authority/AuthorityMetadata.mjs +2 -14
- package/dist/authority/AuthorityMetadata.mjs.map +1 -1
- package/dist/authority/AuthorityOptions.mjs +1 -3
- package/dist/authority/AuthorityOptions.mjs.map +1 -1
- package/dist/authority/AuthorityType.mjs +1 -2
- package/dist/authority/AuthorityType.mjs.map +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 +45 -23
- package/dist/cache/CacheManager.mjs.map +1 -1
- package/dist/cache/persistence/TokenCacheContext.mjs +1 -1
- package/dist/cache/utils/AccountEntityUtils.mjs +3 -3
- package/dist/cache/utils/AccountEntityUtils.mjs.map +1 -1
- package/dist/cache/utils/CacheHelpers.mjs +10 -3
- package/dist/cache/utils/CacheHelpers.mjs.map +1 -1
- package/dist/client/AuthorizationCodeClient.mjs +5 -4
- package/dist/client/AuthorizationCodeClient.mjs.map +1 -1
- package/dist/client/RefreshTokenClient.mjs +12 -4
- package/dist/client/RefreshTokenClient.mjs.map +1 -1
- package/dist/client/SilentFlowClient.mjs +22 -3
- package/dist/client/SilentFlowClient.mjs.map +1 -1
- package/dist/config/ClientConfiguration.mjs +6 -3
- package/dist/config/ClientConfiguration.mjs.map +1 -1
- package/dist/constants/AADServerParamKeys.mjs +3 -2
- package/dist/constants/AADServerParamKeys.mjs.map +1 -1
- package/dist/crypto/DpopProofGenerator.mjs +153 -0
- package/dist/crypto/DpopProofGenerator.mjs.map +1 -0
- 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 +3 -2
- package/dist/error/ClientAuthErrorCodes.mjs.map +1 -1
- package/dist/error/ClientConfigurationError.mjs +1 -1
- package/dist/error/ClientConfigurationErrorCodes.mjs +6 -3
- 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 +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 +22 -4
- 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 +8 -4
- package/dist/request/RequestParameterBuilder.mjs.map +1 -1
- package/dist/request/ScopeSet.mjs +1 -1
- package/dist/response/ResponseHandler.mjs +65 -9
- 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 +6 -3
- 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 +2 -4
- package/dist-browser/authority/Authority.mjs.map +1 -1
- package/dist-browser/authority/AuthorityFactory.mjs +1 -1
- package/dist-browser/authority/AuthorityMetadata.mjs +2 -14
- package/dist-browser/authority/AuthorityMetadata.mjs.map +1 -1
- package/dist-browser/authority/AuthorityOptions.mjs +1 -3
- package/dist-browser/authority/AuthorityOptions.mjs.map +1 -1
- package/dist-browser/authority/AuthorityType.mjs +1 -2
- package/dist-browser/authority/AuthorityType.mjs.map +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 +45 -23
- 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 +3 -3
- package/dist-browser/cache/utils/AccountEntityUtils.mjs.map +1 -1
- package/dist-browser/cache/utils/CacheHelpers.mjs +10 -3
- package/dist-browser/cache/utils/CacheHelpers.mjs.map +1 -1
- package/dist-browser/client/AuthorizationCodeClient.mjs +5 -4
- package/dist-browser/client/AuthorizationCodeClient.mjs.map +1 -1
- package/dist-browser/client/RefreshTokenClient.mjs +12 -4
- package/dist-browser/client/RefreshTokenClient.mjs.map +1 -1
- package/dist-browser/client/SilentFlowClient.mjs +22 -3
- package/dist-browser/client/SilentFlowClient.mjs.map +1 -1
- package/dist-browser/config/ClientConfiguration.mjs +6 -3
- package/dist-browser/config/ClientConfiguration.mjs.map +1 -1
- package/dist-browser/constants/AADServerParamKeys.mjs +3 -2
- package/dist-browser/constants/AADServerParamKeys.mjs.map +1 -1
- package/dist-browser/crypto/DpopProofGenerator.mjs +153 -0
- package/dist-browser/crypto/DpopProofGenerator.mjs.map +1 -0
- 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 +3 -2
- package/dist-browser/error/ClientAuthErrorCodes.mjs.map +1 -1
- package/dist-browser/error/ClientConfigurationError.mjs +1 -1
- package/dist-browser/error/ClientConfigurationErrorCodes.mjs +6 -3
- 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 +13 -5
- package/dist-browser/logger/Logger.mjs +1 -1
- package/dist-browser/network/INetworkModule.mjs +1 -1
- package/dist-browser/network/RequestThumbprint.mjs +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 +22 -4
- 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 +8 -4
- package/dist-browser/request/RequestParameterBuilder.mjs.map +1 -1
- package/dist-browser/request/ScopeSet.mjs +1 -1
- package/dist-browser/response/ResponseHandler.mjs +65 -9
- 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 +6 -3
- 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-3p7V__ym.js → index-node-l_NIe8t5.js} +520 -83
- package/lib/index-node-l_NIe8t5.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/Authority.ts +0 -2
- package/src/authority/AuthorityMetadata.ts +1 -13
- package/src/authority/AuthorityOptions.ts +0 -3
- package/src/authority/AuthorityType.ts +0 -1
- package/src/cache/CacheManager.ts +73 -35
- package/src/cache/utils/AccountEntityUtils.ts +2 -2
- package/src/cache/utils/CacheHelpers.ts +11 -1
- package/src/client/AuthorizationCodeClient.ts +11 -1
- package/src/client/RefreshTokenClient.ts +25 -1
- package/src/client/SilentFlowClient.ts +44 -2
- package/src/config/ClientConfiguration.ts +14 -1
- package/src/constants/AADServerParamKeys.ts +1 -0
- package/src/crypto/DpopProofGenerator.ts +92 -60
- package/src/crypto/ICrypto.ts +31 -26
- package/src/crypto/ITokenBindingKeyManager.ts +85 -0
- package/src/crypto/JoseHeader.ts +75 -14
- package/src/crypto/PopTokenGenerator.ts +62 -18
- package/src/crypto/PublicJsonWebKey.ts +24 -0
- package/src/error/ClientAuthErrorCodes.ts +1 -0
- package/src/error/ClientConfigurationErrorCodes.ts +4 -0
- package/src/error/JoseHeaderErrorCodes.ts +2 -0
- package/src/exports-common.ts +8 -0
- package/src/packageMetadata.ts +1 -1
- package/src/protocol/Token.ts +44 -1
- package/src/request/BaseAuthRequest.ts +5 -0
- package/src/request/CommonAuthorizationUrlRequest.ts +5 -0
- package/src/request/RequestParameterBuilder.ts +7 -3
- package/src/response/AuthenticationResult.ts +2 -0
- package/src/response/ResponseHandler.ts +115 -16
- package/src/telemetry/performance/PerformanceEvent.ts +22 -0
- package/src/utils/Constants.ts +4 -1
- package/src/utils/ObjectUtils.ts +31 -0
- package/types/authority/Authority.d.ts.map +1 -1
- package/types/authority/AuthorityMetadata.d.ts.map +1 -1
- package/types/authority/AuthorityOptions.d.ts +0 -1
- package/types/authority/AuthorityOptions.d.ts.map +1 -1
- package/types/authority/AuthorityType.d.ts +0 -1
- package/types/authority/AuthorityType.d.ts.map +1 -1
- package/types/cache/CacheManager.d.ts +5 -1
- package/types/cache/CacheManager.d.ts.map +1 -1
- 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 +16 -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 +42 -0
- package/types/crypto/ITokenBindingKeyManager.d.ts.map +1 -0
- package/types/crypto/JoseHeader.d.ts +18 -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/crypto/PublicJsonWebKey.d.ts +20 -0
- package/types/crypto/PublicJsonWebKey.d.ts.map +1 -0
- package/types/error/ClientAuthErrorCodes.d.ts +1 -0
- package/types/error/ClientAuthErrorCodes.d.ts.map +1 -1
- package/types/error/ClientConfigurationErrorCodes.d.ts +3 -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 +4 -2
- package/types/exports-common.d.ts.map +1 -1
- package/types/packageMetadata.d.ts +1 -1
- package/types/protocol/Token.d.ts +7 -0
- package/types/protocol/Token.d.ts.map +1 -1
- package/types/request/BaseAuthRequest.d.ts +5 -0
- package/types/request/BaseAuthRequest.d.ts.map +1 -1
- package/types/request/CommonAuthorizationUrlRequest.d.ts +5 -0
- package/types/request/CommonAuthorizationUrlRequest.d.ts.map +1 -1
- package/types/request/RequestParameterBuilder.d.ts +2 -2
- package/types/request/RequestParameterBuilder.d.ts.map +1 -1
- package/types/response/AuthenticationResult.d.ts +2 -0
- package/types/response/AuthenticationResult.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 +18 -0
- package/types/telemetry/performance/PerformanceEvent.d.ts.map +1 -1
- package/types/utils/Constants.d.ts +4 -1
- 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-3p7V__ym.js.map +0 -1
|
@@ -4,11 +4,14 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { ICrypto, JsonWebTokenAlgorithms } from "./ICrypto.js";
|
|
7
|
+
import { ITokenBindingKeyManager } from "./ITokenBindingKeyManager.js";
|
|
7
8
|
import * as TimeUtils from "../utils/TimeUtils.js";
|
|
8
9
|
import {
|
|
9
10
|
createClientConfigurationError,
|
|
10
11
|
ClientConfigurationErrorCodes,
|
|
11
12
|
} from "../error/ClientConfigurationError.js";
|
|
13
|
+
import { JoseHeader } from "./JoseHeader.js";
|
|
14
|
+
import type { PublicJsonWebKey } from "./PublicJsonWebKey.js";
|
|
12
15
|
|
|
13
16
|
/**
|
|
14
17
|
* RFC 9449 DPoP proof JWT payload claims.
|
|
@@ -38,57 +41,34 @@ export type DpopTokenProofParams = {
|
|
|
38
41
|
* @internal
|
|
39
42
|
*/
|
|
40
43
|
export type DpopResourceProofParams = {
|
|
41
|
-
|
|
44
|
+
htu: string;
|
|
42
45
|
htm: string;
|
|
43
46
|
ath: string;
|
|
44
47
|
nonce?: string;
|
|
45
48
|
};
|
|
46
49
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* RFC 9449 DPoP proof JWT header.
|
|
55
|
-
* @internal
|
|
56
|
-
*/
|
|
57
|
-
export type DpopProofHeader = {
|
|
58
|
-
typ: typeof DPOP_JWT_HEADER_TYPE;
|
|
59
|
-
alg: string;
|
|
60
|
-
jwk: DpopPublicJwk;
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Signs the ASCII DPoP JWT signing input with the declared JOSE alg
|
|
65
|
-
* and returns a base64url-encoded signature.
|
|
66
|
-
* @internal
|
|
67
|
-
*/
|
|
68
|
-
export type DpopProofSigner = {
|
|
69
|
-
alg: string;
|
|
70
|
-
sign: (signingInput: string, correlationId: string) => Promise<string>;
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Parameters shared by token and resource DPoP proof generation.
|
|
75
|
-
* @internal
|
|
76
|
-
*/
|
|
77
|
-
export type DpopProofGenerationParams = {
|
|
78
|
-
publicJwk: DpopPublicJwk;
|
|
79
|
-
signer: DpopProofSigner;
|
|
50
|
+
export type GenerateDpopResourceProofParams = {
|
|
51
|
+
htu?: string;
|
|
52
|
+
htm?: string;
|
|
53
|
+
nonce?: string;
|
|
54
|
+
accessToken: string;
|
|
80
55
|
};
|
|
81
56
|
|
|
82
57
|
const DPOP_HTM_REGEX = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
function buildProofHeader(
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
58
|
+
const DPOP_TOKEN_BINDING_KEY_TYPE = "dpop";
|
|
59
|
+
const DPOP_JWT_HEADER_ALGORITHM = JsonWebTokenAlgorithms.ES256;
|
|
60
|
+
|
|
61
|
+
function buildProofHeader(
|
|
62
|
+
publicJwk: PublicJsonWebKey,
|
|
63
|
+
correlationId: string
|
|
64
|
+
): JoseHeader {
|
|
65
|
+
return JoseHeader.getDpopHeader(
|
|
66
|
+
{
|
|
67
|
+
alg: DPOP_JWT_HEADER_ALGORITHM,
|
|
68
|
+
jwk: publicJwk,
|
|
69
|
+
},
|
|
70
|
+
correlationId
|
|
71
|
+
);
|
|
92
72
|
}
|
|
93
73
|
|
|
94
74
|
function normalizeHtm(htm: string, correlationId: string): string {
|
|
@@ -136,6 +116,18 @@ function normalizeHtu(url: string, correlationId: string): string {
|
|
|
136
116
|
return parsedUrl.href;
|
|
137
117
|
}
|
|
138
118
|
|
|
119
|
+
function validateDpopNonce(
|
|
120
|
+
nonce: string | undefined,
|
|
121
|
+
correlationId: string
|
|
122
|
+
): void {
|
|
123
|
+
if (nonce !== undefined && nonce.trim().length === 0) {
|
|
124
|
+
throw createClientConfigurationError(
|
|
125
|
+
ClientConfigurationErrorCodes.invalidDpopNonce,
|
|
126
|
+
correlationId
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
139
131
|
/**
|
|
140
132
|
* Builds RFC 9449 DPoP proof JWT payloads for token-endpoint and
|
|
141
133
|
* resource-endpoint proof bindings.
|
|
@@ -149,9 +141,26 @@ function normalizeHtu(url: string, correlationId: string): string {
|
|
|
149
141
|
*/
|
|
150
142
|
export class DpopProofGenerator {
|
|
151
143
|
private cryptoUtils: ICrypto;
|
|
144
|
+
private tokenBindingKeyManager: ITokenBindingKeyManager;
|
|
152
145
|
|
|
153
|
-
constructor(
|
|
146
|
+
constructor(
|
|
147
|
+
cryptoUtils: ICrypto,
|
|
148
|
+
tokenBindingKeyManager: ITokenBindingKeyManager
|
|
149
|
+
) {
|
|
154
150
|
this.cryptoUtils = cryptoUtils;
|
|
151
|
+
this.tokenBindingKeyManager = tokenBindingKeyManager;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Provisions a fresh DPoP key and returns the RFC 7638 JWK thumbprint used
|
|
156
|
+
* as `dpop_jkt`.
|
|
157
|
+
*/
|
|
158
|
+
async generateJkt(correlationId: string = ""): Promise<string> {
|
|
159
|
+
return this.tokenBindingKeyManager.provisionTokenBindingKey({
|
|
160
|
+
tokenBindingKeyType: DPOP_TOKEN_BINDING_KEY_TYPE,
|
|
161
|
+
tokenBindingKeyAlgorithm: DPOP_JWT_HEADER_ALGORITHM,
|
|
162
|
+
correlationId,
|
|
163
|
+
});
|
|
155
164
|
}
|
|
156
165
|
|
|
157
166
|
/**
|
|
@@ -164,6 +173,7 @@ export class DpopProofGenerator {
|
|
|
164
173
|
params: DpopTokenProofParams,
|
|
165
174
|
correlationId: string = ""
|
|
166
175
|
): DpopProofClaims {
|
|
176
|
+
validateDpopNonce(params.nonce, correlationId);
|
|
167
177
|
const claims: DpopProofClaims = {
|
|
168
178
|
jti: this.cryptoUtils.createNewGuid(),
|
|
169
179
|
htm: "POST",
|
|
@@ -180,12 +190,13 @@ export class DpopProofGenerator {
|
|
|
180
190
|
* Builds and signs a compact DPoP proof JWT for a token-endpoint request.
|
|
181
191
|
*/
|
|
182
192
|
async generateTokenProof(
|
|
183
|
-
params: DpopTokenProofParams
|
|
193
|
+
params: DpopTokenProofParams,
|
|
194
|
+
keyId: string,
|
|
184
195
|
correlationId: string = ""
|
|
185
196
|
): Promise<string> {
|
|
186
197
|
return this.generateProof(
|
|
187
198
|
this.buildTokenProofClaims(params, correlationId),
|
|
188
|
-
|
|
199
|
+
keyId,
|
|
189
200
|
correlationId
|
|
190
201
|
);
|
|
191
202
|
}
|
|
@@ -201,10 +212,11 @@ export class DpopProofGenerator {
|
|
|
201
212
|
params: DpopResourceProofParams,
|
|
202
213
|
correlationId: string = ""
|
|
203
214
|
): DpopProofClaims {
|
|
215
|
+
validateDpopNonce(params.nonce, correlationId);
|
|
204
216
|
const claims: DpopProofClaims = {
|
|
205
217
|
jti: this.cryptoUtils.createNewGuid(),
|
|
206
218
|
htm: normalizeHtm(params.htm, correlationId),
|
|
207
|
-
htu: normalizeHtu(params.
|
|
219
|
+
htu: normalizeHtu(params.htu, correlationId),
|
|
208
220
|
ath: params.ath,
|
|
209
221
|
iat: TimeUtils.nowSeconds(),
|
|
210
222
|
};
|
|
@@ -218,30 +230,50 @@ export class DpopProofGenerator {
|
|
|
218
230
|
* Builds and signs a compact DPoP proof JWT for a resource request.
|
|
219
231
|
*/
|
|
220
232
|
async generateResourceProof(
|
|
221
|
-
params:
|
|
233
|
+
params: GenerateDpopResourceProofParams,
|
|
234
|
+
keyId: string,
|
|
222
235
|
correlationId: string = ""
|
|
223
236
|
): Promise<string> {
|
|
237
|
+
const { htu, htm, nonce } = params;
|
|
238
|
+
if (!htu || !htm) {
|
|
239
|
+
throw createClientConfigurationError(
|
|
240
|
+
ClientConfigurationErrorCodes.dpopMissingResourceContext,
|
|
241
|
+
correlationId
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const ath = await this.cryptoUtils.hashString(params.accessToken);
|
|
224
246
|
return this.generateProof(
|
|
225
|
-
this.buildResourceProofClaims(
|
|
226
|
-
|
|
247
|
+
this.buildResourceProofClaims(
|
|
248
|
+
{
|
|
249
|
+
htu,
|
|
250
|
+
htm,
|
|
251
|
+
ath,
|
|
252
|
+
nonce,
|
|
253
|
+
},
|
|
254
|
+
correlationId
|
|
255
|
+
),
|
|
256
|
+
keyId,
|
|
227
257
|
correlationId
|
|
228
258
|
);
|
|
229
259
|
}
|
|
230
260
|
|
|
231
261
|
private async generateProof(
|
|
232
262
|
claims: DpopProofClaims,
|
|
233
|
-
|
|
263
|
+
keyId: string,
|
|
234
264
|
correlationId: string
|
|
235
265
|
): Promise<string> {
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
);
|
|
242
|
-
const signingInput = `${encodedHeader}.${encodedClaims}`;
|
|
243
|
-
const signature = await params.signer.sign(signingInput, correlationId);
|
|
266
|
+
const publicJwk =
|
|
267
|
+
await this.tokenBindingKeyManager.getTokenBindingPublicKeyJwk(
|
|
268
|
+
keyId,
|
|
269
|
+
correlationId
|
|
270
|
+
);
|
|
244
271
|
|
|
245
|
-
return
|
|
272
|
+
return this.cryptoUtils.signTokenBindingJwt(
|
|
273
|
+
buildProofHeader(publicJwk, correlationId),
|
|
274
|
+
claims,
|
|
275
|
+
keyId,
|
|
276
|
+
correlationId
|
|
277
|
+
);
|
|
246
278
|
}
|
|
247
279
|
}
|
package/src/crypto/ICrypto.ts
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
createClientAuthError,
|
|
9
9
|
} from "../error/ClientAuthError.js";
|
|
10
10
|
import type { BaseAuthRequest } from "../request/BaseAuthRequest.js";
|
|
11
|
-
import type {
|
|
11
|
+
import type { JoseHeader } from "./JoseHeader.js";
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* PKCE code verifier and challenge pair used by authorization code flows.
|
|
@@ -35,9 +35,11 @@ export type SignedHttpRequestParameters = Pick<
|
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
37
|
* Shared JOSE algorithm literals used by MSAL package internals.
|
|
38
|
+
* @internal
|
|
38
39
|
*/
|
|
39
40
|
export const JsonWebTokenAlgorithms = {
|
|
40
41
|
ES256: "ES256",
|
|
42
|
+
RS256: "RS256",
|
|
41
43
|
} as const;
|
|
42
44
|
/**
|
|
43
45
|
* Interface for crypto functions used by library
|
|
@@ -67,13 +69,6 @@ export interface ICrypto {
|
|
|
67
69
|
* @returns Base64Url encoded public key
|
|
68
70
|
*/
|
|
69
71
|
encodeKid(inputKid: string): string;
|
|
70
|
-
/**
|
|
71
|
-
* Generates an JWK RSA S256 Thumbprint
|
|
72
|
-
* @param request
|
|
73
|
-
*/
|
|
74
|
-
getPublicKeyThumbprint(
|
|
75
|
-
request: SignedHttpRequestParameters
|
|
76
|
-
): Promise<string>;
|
|
77
72
|
/**
|
|
78
73
|
* Removes cryptographic keypair from key store matching the keyId passed in
|
|
79
74
|
* @param kid
|
|
@@ -86,14 +81,18 @@ export interface ICrypto {
|
|
|
86
81
|
*/
|
|
87
82
|
clearKeystore(correlationId: string): Promise<boolean>;
|
|
88
83
|
/**
|
|
89
|
-
*
|
|
90
|
-
* @
|
|
84
|
+
* Signs a compact JWT with the token-binding key identified by kid.
|
|
85
|
+
* @internal
|
|
86
|
+
* @param header
|
|
87
|
+
* @param payload
|
|
88
|
+
* @param kid
|
|
89
|
+
* @param correlationId
|
|
91
90
|
*/
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
signTokenBindingJwt(
|
|
92
|
+
header: JoseHeader,
|
|
93
|
+
payload: object,
|
|
94
94
|
kid: string,
|
|
95
|
-
|
|
96
|
-
correlationId?: string
|
|
95
|
+
correlationId: string
|
|
97
96
|
): Promise<string>;
|
|
98
97
|
/**
|
|
99
98
|
* Returns the SHA-256 hash of an input string
|
|
@@ -137,28 +136,34 @@ export const DEFAULT_CRYPTO_IMPLEMENTATION: ICrypto = {
|
|
|
137
136
|
""
|
|
138
137
|
);
|
|
139
138
|
},
|
|
140
|
-
async
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
},
|
|
146
|
-
async removeTokenBindingKey(): Promise<void> {
|
|
139
|
+
async removeTokenBindingKey(
|
|
140
|
+
kid: string,
|
|
141
|
+
correlationId: string
|
|
142
|
+
): Promise<void> {
|
|
143
|
+
void kid;
|
|
147
144
|
throw createClientAuthError(
|
|
148
145
|
ClientAuthErrorCodes.methodNotImplemented,
|
|
149
|
-
|
|
146
|
+
correlationId
|
|
150
147
|
);
|
|
151
148
|
},
|
|
152
|
-
async clearKeystore(): Promise<boolean> {
|
|
149
|
+
async clearKeystore(correlationId: string): Promise<boolean> {
|
|
153
150
|
throw createClientAuthError(
|
|
154
151
|
ClientAuthErrorCodes.methodNotImplemented,
|
|
155
|
-
|
|
152
|
+
correlationId
|
|
156
153
|
);
|
|
157
154
|
},
|
|
158
|
-
async
|
|
155
|
+
async signTokenBindingJwt(
|
|
156
|
+
header: JoseHeader,
|
|
157
|
+
payload: object,
|
|
158
|
+
kid: string,
|
|
159
|
+
correlationId: string
|
|
160
|
+
): Promise<string> {
|
|
161
|
+
void header;
|
|
162
|
+
void payload;
|
|
163
|
+
void kid;
|
|
159
164
|
throw createClientAuthError(
|
|
160
165
|
ClientAuthErrorCodes.methodNotImplemented,
|
|
161
|
-
|
|
166
|
+
correlationId
|
|
162
167
|
);
|
|
163
168
|
},
|
|
164
169
|
async hashString(): Promise<string> {
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
ClientAuthErrorCodes,
|
|
8
|
+
createClientAuthError,
|
|
9
|
+
} from "../error/ClientAuthError.js";
|
|
10
|
+
import type { PublicJsonWebKey } from "./PublicJsonWebKey.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Parameters used by token-binding key managers to provision browser-managed
|
|
14
|
+
* token-binding keys. Callers own the protocol policy (key type and JOSE
|
|
15
|
+
* algorithm); implementations generate, store, retrieve, and use the requested
|
|
16
|
+
* key material by key identifier.
|
|
17
|
+
*/
|
|
18
|
+
export type TokenBindingKeyProvisioningParameters = {
|
|
19
|
+
tokenBindingKeyType: string;
|
|
20
|
+
tokenBindingKeyAlgorithm: string;
|
|
21
|
+
correlationId: string;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Internal key lifecycle abstraction for browser token-binding keys.
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
export interface ITokenBindingKeyManager {
|
|
29
|
+
/**
|
|
30
|
+
* Provisions a token-binding key and returns the key identifier.
|
|
31
|
+
* @param request - Key provisioning policy.
|
|
32
|
+
*/
|
|
33
|
+
provisionTokenBindingKey(
|
|
34
|
+
request: TokenBindingKeyProvisioningParameters
|
|
35
|
+
): Promise<string>;
|
|
36
|
+
/**
|
|
37
|
+
* Removes a token-binding key by identifier.
|
|
38
|
+
* @param kid - Token-binding key identifier.
|
|
39
|
+
* @param correlationId - Request correlation identifier.
|
|
40
|
+
*/
|
|
41
|
+
removeTokenBindingKey(kid: string, correlationId: string): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Gets a token-binding public key as a JWK by identifier.
|
|
44
|
+
* @param kid - Token-binding key identifier.
|
|
45
|
+
* @param correlationId - Request correlation identifier.
|
|
46
|
+
*/
|
|
47
|
+
getTokenBindingPublicKeyJwk(
|
|
48
|
+
kid: string,
|
|
49
|
+
correlationId: string
|
|
50
|
+
): Promise<PublicJsonWebKey>;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Default token-binding key manager used when a platform-specific implementation
|
|
55
|
+
* has not been provided.
|
|
56
|
+
* @internal
|
|
57
|
+
*/
|
|
58
|
+
export const DEFAULT_TOKEN_BINDING_KEY_MANAGER: ITokenBindingKeyManager = {
|
|
59
|
+
async provisionTokenBindingKey(
|
|
60
|
+
request: TokenBindingKeyProvisioningParameters
|
|
61
|
+
): Promise<string> {
|
|
62
|
+
throw createClientAuthError(
|
|
63
|
+
ClientAuthErrorCodes.methodNotImplemented,
|
|
64
|
+
request.correlationId
|
|
65
|
+
);
|
|
66
|
+
},
|
|
67
|
+
async removeTokenBindingKey(
|
|
68
|
+
_kid: string,
|
|
69
|
+
correlationId: string
|
|
70
|
+
): Promise<void> {
|
|
71
|
+
throw createClientAuthError(
|
|
72
|
+
ClientAuthErrorCodes.methodNotImplemented,
|
|
73
|
+
correlationId
|
|
74
|
+
);
|
|
75
|
+
},
|
|
76
|
+
async getTokenBindingPublicKeyJwk(
|
|
77
|
+
_kid: string,
|
|
78
|
+
correlationId: string
|
|
79
|
+
): Promise<PublicJsonWebKey> {
|
|
80
|
+
throw createClientAuthError(
|
|
81
|
+
ClientAuthErrorCodes.methodNotImplemented,
|
|
82
|
+
correlationId
|
|
83
|
+
);
|
|
84
|
+
},
|
|
85
|
+
};
|
package/src/crypto/JoseHeader.ts
CHANGED
|
@@ -7,40 +7,58 @@ import {
|
|
|
7
7
|
JoseHeaderErrorCodes,
|
|
8
8
|
createJoseHeaderError,
|
|
9
9
|
} from "../error/JoseHeaderError.js";
|
|
10
|
+
import { isPlainObject } from "../utils/ObjectUtils.js";
|
|
10
11
|
import { JsonWebTokenTypes } from "../utils/Constants.js";
|
|
12
|
+
import type { PublicJsonWebKey } from "./PublicJsonWebKey.js";
|
|
11
13
|
|
|
12
14
|
export type JoseHeaderOptions = {
|
|
13
15
|
typ?: JsonWebTokenTypes;
|
|
14
16
|
alg?: string;
|
|
15
17
|
kid?: string;
|
|
18
|
+
jwk?: PublicJsonWebKey;
|
|
16
19
|
};
|
|
17
20
|
|
|
18
21
|
/** @internal */
|
|
19
22
|
export class JoseHeader {
|
|
20
23
|
public typ?: JsonWebTokenTypes;
|
|
21
|
-
public alg
|
|
24
|
+
public alg: string;
|
|
22
25
|
public kid?: string;
|
|
26
|
+
public jwk?: PublicJsonWebKey;
|
|
27
|
+
|
|
28
|
+
constructor(
|
|
29
|
+
options: JoseHeaderOptions & { alg: string },
|
|
30
|
+
correlationId: string
|
|
31
|
+
) {
|
|
32
|
+
if (typeof options.alg !== "string" || !options.alg) {
|
|
33
|
+
throw createJoseHeaderError(
|
|
34
|
+
JoseHeaderErrorCodes.missingAlgError,
|
|
35
|
+
correlationId
|
|
36
|
+
);
|
|
37
|
+
}
|
|
23
38
|
|
|
24
|
-
constructor(options: JoseHeaderOptions) {
|
|
25
39
|
this.typ = options.typ;
|
|
26
40
|
this.alg = options.alg;
|
|
27
41
|
this.kid = options.kid;
|
|
42
|
+
this.jwk = options.jwk;
|
|
28
43
|
}
|
|
29
44
|
|
|
30
45
|
/**
|
|
31
46
|
* Builds SignedHttpRequest formatted JOSE Header from the
|
|
32
|
-
* JOSE Header options provided or previously set on the object
|
|
33
|
-
* the stringified header object.
|
|
47
|
+
* JOSE Header options provided or previously set on the object.
|
|
34
48
|
* Throws if keyId or algorithm aren't provided since they are required for Access Token Binding.
|
|
35
49
|
* @param shrHeaderOptions
|
|
50
|
+
* @param correlationId
|
|
36
51
|
* @returns
|
|
37
52
|
*/
|
|
38
|
-
static
|
|
53
|
+
static getShrHeader(
|
|
54
|
+
shrHeaderOptions: JoseHeaderOptions,
|
|
55
|
+
correlationId: string
|
|
56
|
+
): JoseHeader {
|
|
39
57
|
// KeyID is required on the SHR header
|
|
40
58
|
if (!shrHeaderOptions.kid) {
|
|
41
59
|
throw createJoseHeaderError(
|
|
42
60
|
JoseHeaderErrorCodes.missingKidError,
|
|
43
|
-
|
|
61
|
+
correlationId
|
|
44
62
|
);
|
|
45
63
|
}
|
|
46
64
|
|
|
@@ -48,17 +66,60 @@ export class JoseHeader {
|
|
|
48
66
|
if (!shrHeaderOptions.alg) {
|
|
49
67
|
throw createJoseHeaderError(
|
|
50
68
|
JoseHeaderErrorCodes.missingAlgError,
|
|
51
|
-
|
|
69
|
+
correlationId
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return new JoseHeader(
|
|
74
|
+
{
|
|
75
|
+
// Access Token PoP headers must have type pop, but the type header can be overriden for special cases
|
|
76
|
+
typ: shrHeaderOptions.typ || JsonWebTokenTypes.Pop,
|
|
77
|
+
kid: shrHeaderOptions.kid,
|
|
78
|
+
alg: shrHeaderOptions.alg,
|
|
79
|
+
},
|
|
80
|
+
correlationId
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Builds a DPoP formatted JOSE Header from the JOSE Header options provided.
|
|
86
|
+
* Throws if public JWK or algorithm aren't provided since they are required for DPoP.
|
|
87
|
+
* @param dpopHeaderOptions
|
|
88
|
+
* @param correlationId
|
|
89
|
+
* @returns
|
|
90
|
+
*/
|
|
91
|
+
static getDpopHeader(
|
|
92
|
+
dpopHeaderOptions: JoseHeaderOptions,
|
|
93
|
+
correlationId: string
|
|
94
|
+
): JoseHeader {
|
|
95
|
+
if (!isPlainObject(dpopHeaderOptions.jwk)) {
|
|
96
|
+
throw createJoseHeaderError(
|
|
97
|
+
JoseHeaderErrorCodes.missingJwkError,
|
|
98
|
+
correlationId
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (!dpopHeaderOptions.alg) {
|
|
103
|
+
throw createJoseHeaderError(
|
|
104
|
+
JoseHeaderErrorCodes.missingAlgError,
|
|
105
|
+
correlationId
|
|
52
106
|
);
|
|
53
107
|
}
|
|
54
108
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
109
|
+
if (Object.keys(dpopHeaderOptions.jwk).length === 0) {
|
|
110
|
+
throw createJoseHeaderError(
|
|
111
|
+
JoseHeaderErrorCodes.invalidJwkError,
|
|
112
|
+
correlationId
|
|
113
|
+
);
|
|
114
|
+
}
|
|
61
115
|
|
|
62
|
-
return
|
|
116
|
+
return new JoseHeader(
|
|
117
|
+
{
|
|
118
|
+
typ: JsonWebTokenTypes.Dpop,
|
|
119
|
+
alg: dpopHeaderOptions.alg,
|
|
120
|
+
jwk: dpopHeaderOptions.jwk,
|
|
121
|
+
},
|
|
122
|
+
correlationId
|
|
123
|
+
);
|
|
63
124
|
}
|
|
64
125
|
}
|
|
@@ -3,13 +3,20 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
ICrypto,
|
|
8
|
+
JsonWebTokenAlgorithms,
|
|
9
|
+
SignedHttpRequestParameters,
|
|
10
|
+
} from "./ICrypto.js";
|
|
7
11
|
import * as TimeUtils from "../utils/TimeUtils.js";
|
|
8
12
|
import { UrlString } from "../url/UrlString.js";
|
|
9
13
|
import { IPerformanceClient } from "../telemetry/performance/IPerformanceClient.js";
|
|
10
14
|
import * as PerformanceEvents from "../telemetry/performance/PerformanceEvents.js";
|
|
11
15
|
import { invokeAsync } from "../utils/FunctionWrappers.js";
|
|
12
16
|
import { Logger } from "../logger/Logger.js";
|
|
17
|
+
import { JoseHeader } from "./JoseHeader.js";
|
|
18
|
+
import { SignedHttpRequest } from "./SignedHttpRequest.js";
|
|
19
|
+
import { ITokenBindingKeyManager } from "./ITokenBindingKeyManager.js";
|
|
13
20
|
|
|
14
21
|
/**
|
|
15
22
|
* See eSTS docs for more info.
|
|
@@ -34,13 +41,22 @@ const KeyLocation = {
|
|
|
34
41
|
} as const;
|
|
35
42
|
export type KeyLocation = (typeof KeyLocation)[keyof typeof KeyLocation];
|
|
36
43
|
|
|
44
|
+
const SHR_TOKEN_BINDING_KEY_TYPE = "shr";
|
|
45
|
+
const SHR_TOKEN_BINDING_KEY_ALGORITHM = JsonWebTokenAlgorithms.RS256;
|
|
46
|
+
|
|
37
47
|
/** @internal */
|
|
38
48
|
export class PopTokenGenerator {
|
|
39
49
|
private cryptoUtils: ICrypto;
|
|
50
|
+
private tokenBindingKeyManager: ITokenBindingKeyManager;
|
|
40
51
|
private performanceClient: IPerformanceClient;
|
|
41
52
|
|
|
42
|
-
constructor(
|
|
53
|
+
constructor(
|
|
54
|
+
cryptoUtils: ICrypto,
|
|
55
|
+
tokenBindingKeyManager: ITokenBindingKeyManager,
|
|
56
|
+
performanceClient: IPerformanceClient
|
|
57
|
+
) {
|
|
43
58
|
this.cryptoUtils = cryptoUtils;
|
|
59
|
+
this.tokenBindingKeyManager = tokenBindingKeyManager;
|
|
44
60
|
this.performanceClient = performanceClient;
|
|
45
61
|
}
|
|
46
62
|
|
|
@@ -77,9 +93,12 @@ export class PopTokenGenerator {
|
|
|
77
93
|
* @returns
|
|
78
94
|
*/
|
|
79
95
|
async generateKid(request: SignedHttpRequestParameters): Promise<ReqCnf> {
|
|
80
|
-
const kidThumbprint =
|
|
81
|
-
|
|
82
|
-
|
|
96
|
+
const kidThumbprint =
|
|
97
|
+
await this.tokenBindingKeyManager.provisionTokenBindingKey({
|
|
98
|
+
correlationId: request.correlationId,
|
|
99
|
+
tokenBindingKeyType: SHR_TOKEN_BINDING_KEY_TYPE,
|
|
100
|
+
tokenBindingKeyAlgorithm: SHR_TOKEN_BINDING_KEY_ALGORITHM,
|
|
101
|
+
});
|
|
83
102
|
|
|
84
103
|
return {
|
|
85
104
|
kid: kidThumbprint,
|
|
@@ -128,22 +147,47 @@ export class PopTokenGenerator {
|
|
|
128
147
|
? new UrlString(resourceRequestUri, request.correlationId)
|
|
129
148
|
: undefined;
|
|
130
149
|
const resourceUrlComponents = resourceUrlString?.getUrlComponents();
|
|
131
|
-
|
|
150
|
+
const publicKeyJwk =
|
|
151
|
+
await this.tokenBindingKeyManager.getTokenBindingPublicKeyJwk(
|
|
152
|
+
keyId,
|
|
153
|
+
request.correlationId
|
|
154
|
+
);
|
|
155
|
+
const encodedKeyIdThumbprint = this.cryptoUtils.base64UrlEncode(
|
|
156
|
+
JSON.stringify({ kid: keyId })
|
|
157
|
+
);
|
|
158
|
+
const shrAlgorithm =
|
|
159
|
+
shrOptions?.header?.alg ||
|
|
160
|
+
publicKeyJwk.alg ||
|
|
161
|
+
SHR_TOKEN_BINDING_KEY_ALGORITHM;
|
|
162
|
+
const shrHeader = JoseHeader.getShrHeader(
|
|
132
163
|
{
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
u: resourceUrlComponents?.HostNameAndPort,
|
|
137
|
-
nonce: shrNonce || this.cryptoUtils.createNewGuid(),
|
|
138
|
-
p: resourceUrlComponents?.AbsolutePath,
|
|
139
|
-
q: resourceUrlComponents?.QueryString
|
|
140
|
-
? [[], resourceUrlComponents.QueryString]
|
|
141
|
-
: undefined,
|
|
142
|
-
client_claims: shrClaims || undefined,
|
|
143
|
-
...claims,
|
|
164
|
+
...shrOptions?.header,
|
|
165
|
+
alg: shrAlgorithm,
|
|
166
|
+
kid: encodedKeyIdThumbprint,
|
|
144
167
|
},
|
|
168
|
+
request.correlationId
|
|
169
|
+
);
|
|
170
|
+
const shrPayload: SignedHttpRequest = {
|
|
171
|
+
at: payload,
|
|
172
|
+
ts: TimeUtils.nowSeconds(),
|
|
173
|
+
m: resourceRequestMethod?.toUpperCase(),
|
|
174
|
+
u: resourceUrlComponents?.HostNameAndPort,
|
|
175
|
+
nonce: shrNonce || this.cryptoUtils.createNewGuid(),
|
|
176
|
+
p: resourceUrlComponents?.AbsolutePath,
|
|
177
|
+
q: resourceUrlComponents?.QueryString
|
|
178
|
+
? [[], resourceUrlComponents.QueryString]
|
|
179
|
+
: undefined,
|
|
180
|
+
client_claims: shrClaims || undefined,
|
|
181
|
+
...claims,
|
|
182
|
+
cnf: {
|
|
183
|
+
jwk: publicKeyJwk,
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
return this.cryptoUtils.signTokenBindingJwt(
|
|
188
|
+
shrHeader,
|
|
189
|
+
shrPayload,
|
|
145
190
|
keyId,
|
|
146
|
-
shrOptions,
|
|
147
191
|
request.correlationId
|
|
148
192
|
);
|
|
149
193
|
}
|