@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.
Files changed (300) hide show
  1. package/dist/account/AccountInfo.mjs +1 -1
  2. package/dist/account/AuthToken.mjs +1 -1
  3. package/dist/account/CcsCredential.mjs +1 -1
  4. package/dist/account/ClientInfo.mjs +1 -1
  5. package/dist/account/TokenClaims.mjs +1 -1
  6. package/dist/authority/Authority.mjs +2 -4
  7. package/dist/authority/Authority.mjs.map +1 -1
  8. package/dist/authority/AuthorityFactory.mjs +1 -1
  9. package/dist/authority/AuthorityMetadata.mjs +2 -14
  10. package/dist/authority/AuthorityMetadata.mjs.map +1 -1
  11. package/dist/authority/AuthorityOptions.mjs +1 -3
  12. package/dist/authority/AuthorityOptions.mjs.map +1 -1
  13. package/dist/authority/AuthorityType.mjs +1 -2
  14. package/dist/authority/AuthorityType.mjs.map +1 -1
  15. package/dist/authority/CloudInstanceDiscoveryErrorResponse.mjs +1 -1
  16. package/dist/authority/CloudInstanceDiscoveryResponse.mjs +1 -1
  17. package/dist/authority/OpenIdConfigResponse.mjs +1 -1
  18. package/dist/authority/ProtocolMode.mjs +1 -1
  19. package/dist/authority/RegionDiscovery.mjs +1 -1
  20. package/dist/cache/CacheManager.mjs +45 -23
  21. package/dist/cache/CacheManager.mjs.map +1 -1
  22. package/dist/cache/persistence/TokenCacheContext.mjs +1 -1
  23. package/dist/cache/utils/AccountEntityUtils.mjs +3 -3
  24. package/dist/cache/utils/AccountEntityUtils.mjs.map +1 -1
  25. package/dist/cache/utils/CacheHelpers.mjs +10 -3
  26. package/dist/cache/utils/CacheHelpers.mjs.map +1 -1
  27. package/dist/client/AuthorizationCodeClient.mjs +5 -4
  28. package/dist/client/AuthorizationCodeClient.mjs.map +1 -1
  29. package/dist/client/RefreshTokenClient.mjs +12 -4
  30. package/dist/client/RefreshTokenClient.mjs.map +1 -1
  31. package/dist/client/SilentFlowClient.mjs +22 -3
  32. package/dist/client/SilentFlowClient.mjs.map +1 -1
  33. package/dist/config/ClientConfiguration.mjs +6 -3
  34. package/dist/config/ClientConfiguration.mjs.map +1 -1
  35. package/dist/constants/AADServerParamKeys.mjs +3 -2
  36. package/dist/constants/AADServerParamKeys.mjs.map +1 -1
  37. package/dist/crypto/DpopProofGenerator.mjs +153 -0
  38. package/dist/crypto/DpopProofGenerator.mjs.map +1 -0
  39. package/dist/crypto/ICrypto.mjs +16 -11
  40. package/dist/crypto/ICrypto.mjs.map +1 -1
  41. package/dist/crypto/ITokenBindingKeyManager.mjs +28 -0
  42. package/dist/crypto/ITokenBindingKeyManager.mjs.map +1 -0
  43. package/dist/crypto/JoseHeader.mjs +38 -11
  44. package/dist/crypto/JoseHeader.mjs.map +1 -1
  45. package/dist/crypto/PopTokenGenerator.mjs +28 -5
  46. package/dist/crypto/PopTokenGenerator.mjs.map +1 -1
  47. package/dist/error/AuthError.mjs +1 -1
  48. package/dist/error/AuthErrorCodes.mjs +1 -1
  49. package/dist/error/CacheError.mjs +1 -1
  50. package/dist/error/CacheErrorCodes.mjs +1 -1
  51. package/dist/error/ClientAuthError.mjs +1 -1
  52. package/dist/error/ClientAuthErrorCodes.mjs +3 -2
  53. package/dist/error/ClientAuthErrorCodes.mjs.map +1 -1
  54. package/dist/error/ClientConfigurationError.mjs +1 -1
  55. package/dist/error/ClientConfigurationErrorCodes.mjs +6 -3
  56. package/dist/error/ClientConfigurationErrorCodes.mjs.map +1 -1
  57. package/dist/error/InteractionRequiredAuthError.mjs +1 -1
  58. package/dist/error/InteractionRequiredAuthErrorCodes.mjs +1 -1
  59. package/dist/error/JoseHeaderError.mjs +1 -1
  60. package/dist/error/JoseHeaderErrorCodes.mjs +5 -3
  61. package/dist/error/JoseHeaderErrorCodes.mjs.map +1 -1
  62. package/dist/error/NetworkError.mjs +1 -1
  63. package/dist/error/PlatformBrokerError.mjs +1 -1
  64. package/dist/error/ServerError.mjs +1 -1
  65. package/dist/index-node.mjs +3 -2
  66. package/dist/index-node.mjs.map +1 -1
  67. package/dist/index.mjs +3 -2
  68. package/dist/index.mjs.map +1 -1
  69. package/dist/logger/Logger.mjs +1 -1
  70. package/dist/network/INetworkModule.mjs +1 -1
  71. package/dist/network/RequestThumbprint.mjs +1 -1
  72. package/dist/network/ThrottlingUtils.mjs +1 -1
  73. package/dist/packageMetadata.mjs +2 -2
  74. package/dist/protocol/Authorize.mjs +1 -1
  75. package/dist/protocol/Token.mjs +22 -4
  76. package/dist/protocol/Token.mjs.map +1 -1
  77. package/dist/request/AuthenticationHeaderParser.mjs +1 -1
  78. package/dist/request/BaseAuthRequest.mjs +1 -1
  79. package/dist/request/BaseAuthRequest.mjs.map +1 -1
  80. package/dist/request/RequestParameterBuilder.mjs +8 -4
  81. package/dist/request/RequestParameterBuilder.mjs.map +1 -1
  82. package/dist/request/ScopeSet.mjs +1 -1
  83. package/dist/response/ResponseHandler.mjs +65 -9
  84. package/dist/response/ResponseHandler.mjs.map +1 -1
  85. package/dist/telemetry/performance/PerformanceClient.mjs +1 -1
  86. package/dist/telemetry/performance/PerformanceEvent.mjs +1 -1
  87. package/dist/telemetry/performance/PerformanceEvent.mjs.map +1 -1
  88. package/dist/telemetry/performance/PerformanceEvents.mjs +1 -1
  89. package/dist/telemetry/performance/StubPerformanceClient.mjs +1 -1
  90. package/dist/telemetry/server/ServerTelemetryManager.mjs +1 -1
  91. package/dist/url/UrlString.mjs +1 -1
  92. package/dist/utils/ClientAssertionUtils.mjs +1 -1
  93. package/dist/utils/Constants.mjs +6 -3
  94. package/dist/utils/Constants.mjs.map +1 -1
  95. package/dist/utils/FunctionWrappers.mjs +1 -1
  96. package/dist/utils/ObjectUtils.mjs +28 -0
  97. package/dist/utils/ObjectUtils.mjs.map +1 -0
  98. package/dist/utils/ProtocolUtils.mjs +1 -1
  99. package/dist/utils/StringUtils.mjs +1 -1
  100. package/dist/utils/TimeUtils.mjs +1 -1
  101. package/dist/utils/UrlUtils.mjs +1 -1
  102. package/dist-browser/account/AccountInfo.mjs +1 -1
  103. package/dist-browser/account/AuthToken.mjs +1 -1
  104. package/dist-browser/account/CcsCredential.mjs +1 -1
  105. package/dist-browser/account/ClientInfo.mjs +1 -1
  106. package/dist-browser/account/TokenClaims.mjs +1 -1
  107. package/dist-browser/authority/Authority.mjs +2 -4
  108. package/dist-browser/authority/Authority.mjs.map +1 -1
  109. package/dist-browser/authority/AuthorityFactory.mjs +1 -1
  110. package/dist-browser/authority/AuthorityMetadata.mjs +2 -14
  111. package/dist-browser/authority/AuthorityMetadata.mjs.map +1 -1
  112. package/dist-browser/authority/AuthorityOptions.mjs +1 -3
  113. package/dist-browser/authority/AuthorityOptions.mjs.map +1 -1
  114. package/dist-browser/authority/AuthorityType.mjs +1 -2
  115. package/dist-browser/authority/AuthorityType.mjs.map +1 -1
  116. package/dist-browser/authority/CloudInstanceDiscoveryErrorResponse.mjs +1 -1
  117. package/dist-browser/authority/CloudInstanceDiscoveryResponse.mjs +1 -1
  118. package/dist-browser/authority/OpenIdConfigResponse.mjs +1 -1
  119. package/dist-browser/authority/ProtocolMode.mjs +1 -1
  120. package/dist-browser/authority/RegionDiscovery.mjs +1 -1
  121. package/dist-browser/cache/CacheManager.mjs +45 -23
  122. package/dist-browser/cache/CacheManager.mjs.map +1 -1
  123. package/dist-browser/cache/persistence/TokenCacheContext.mjs +1 -1
  124. package/dist-browser/cache/utils/AccountEntityUtils.mjs +3 -3
  125. package/dist-browser/cache/utils/AccountEntityUtils.mjs.map +1 -1
  126. package/dist-browser/cache/utils/CacheHelpers.mjs +10 -3
  127. package/dist-browser/cache/utils/CacheHelpers.mjs.map +1 -1
  128. package/dist-browser/client/AuthorizationCodeClient.mjs +5 -4
  129. package/dist-browser/client/AuthorizationCodeClient.mjs.map +1 -1
  130. package/dist-browser/client/RefreshTokenClient.mjs +12 -4
  131. package/dist-browser/client/RefreshTokenClient.mjs.map +1 -1
  132. package/dist-browser/client/SilentFlowClient.mjs +22 -3
  133. package/dist-browser/client/SilentFlowClient.mjs.map +1 -1
  134. package/dist-browser/config/ClientConfiguration.mjs +6 -3
  135. package/dist-browser/config/ClientConfiguration.mjs.map +1 -1
  136. package/dist-browser/constants/AADServerParamKeys.mjs +3 -2
  137. package/dist-browser/constants/AADServerParamKeys.mjs.map +1 -1
  138. package/dist-browser/crypto/DpopProofGenerator.mjs +153 -0
  139. package/dist-browser/crypto/DpopProofGenerator.mjs.map +1 -0
  140. package/dist-browser/crypto/ICrypto.mjs +16 -11
  141. package/dist-browser/crypto/ICrypto.mjs.map +1 -1
  142. package/dist-browser/crypto/ITokenBindingKeyManager.mjs +28 -0
  143. package/dist-browser/crypto/ITokenBindingKeyManager.mjs.map +1 -0
  144. package/dist-browser/crypto/JoseHeader.mjs +38 -11
  145. package/dist-browser/crypto/JoseHeader.mjs.map +1 -1
  146. package/dist-browser/crypto/PopTokenGenerator.mjs +28 -5
  147. package/dist-browser/crypto/PopTokenGenerator.mjs.map +1 -1
  148. package/dist-browser/error/AuthError.mjs +1 -1
  149. package/dist-browser/error/AuthErrorCodes.mjs +1 -1
  150. package/dist-browser/error/CacheError.mjs +1 -1
  151. package/dist-browser/error/CacheErrorCodes.mjs +1 -1
  152. package/dist-browser/error/ClientAuthError.mjs +1 -1
  153. package/dist-browser/error/ClientAuthErrorCodes.mjs +3 -2
  154. package/dist-browser/error/ClientAuthErrorCodes.mjs.map +1 -1
  155. package/dist-browser/error/ClientConfigurationError.mjs +1 -1
  156. package/dist-browser/error/ClientConfigurationErrorCodes.mjs +6 -3
  157. package/dist-browser/error/ClientConfigurationErrorCodes.mjs.map +1 -1
  158. package/dist-browser/error/InteractionRequiredAuthError.mjs +1 -1
  159. package/dist-browser/error/InteractionRequiredAuthErrorCodes.mjs +1 -1
  160. package/dist-browser/error/JoseHeaderError.mjs +1 -1
  161. package/dist-browser/error/JoseHeaderErrorCodes.mjs +5 -3
  162. package/dist-browser/error/JoseHeaderErrorCodes.mjs.map +1 -1
  163. package/dist-browser/error/NetworkError.mjs +1 -1
  164. package/dist-browser/error/PlatformBrokerError.mjs +1 -1
  165. package/dist-browser/error/ServerError.mjs +1 -1
  166. package/dist-browser/index-browser.mjs +3 -2
  167. package/dist-browser/index-browser.mjs.map +1 -1
  168. package/dist-browser/index.mjs +3 -2
  169. package/dist-browser/index.mjs.map +1 -1
  170. package/dist-browser/log-strings-mapping.json +13 -5
  171. package/dist-browser/logger/Logger.mjs +1 -1
  172. package/dist-browser/network/INetworkModule.mjs +1 -1
  173. package/dist-browser/network/RequestThumbprint.mjs +1 -1
  174. package/dist-browser/network/ThrottlingUtils.mjs +1 -1
  175. package/dist-browser/packageMetadata.mjs +2 -2
  176. package/dist-browser/protocol/Authorize.mjs +1 -1
  177. package/dist-browser/protocol/Token.mjs +22 -4
  178. package/dist-browser/protocol/Token.mjs.map +1 -1
  179. package/dist-browser/request/AuthenticationHeaderParser.mjs +1 -1
  180. package/dist-browser/request/BaseAuthRequest.mjs +1 -1
  181. package/dist-browser/request/BaseAuthRequest.mjs.map +1 -1
  182. package/dist-browser/request/RequestParameterBuilder.mjs +8 -4
  183. package/dist-browser/request/RequestParameterBuilder.mjs.map +1 -1
  184. package/dist-browser/request/ScopeSet.mjs +1 -1
  185. package/dist-browser/response/ResponseHandler.mjs +65 -9
  186. package/dist-browser/response/ResponseHandler.mjs.map +1 -1
  187. package/dist-browser/telemetry/performance/PerformanceClient.mjs +1 -1
  188. package/dist-browser/telemetry/performance/PerformanceEvent.mjs +1 -1
  189. package/dist-browser/telemetry/performance/PerformanceEvent.mjs.map +1 -1
  190. package/dist-browser/telemetry/performance/PerformanceEvents.mjs +1 -1
  191. package/dist-browser/telemetry/performance/StubPerformanceClient.mjs +1 -1
  192. package/dist-browser/telemetry/server/ServerTelemetryManager.mjs +1 -1
  193. package/dist-browser/url/UrlString.mjs +1 -1
  194. package/dist-browser/utils/ClientAssertionUtils.mjs +1 -1
  195. package/dist-browser/utils/Constants.mjs +6 -3
  196. package/dist-browser/utils/Constants.mjs.map +1 -1
  197. package/dist-browser/utils/FunctionWrappers.mjs +1 -1
  198. package/dist-browser/utils/ObjectUtils.mjs +28 -0
  199. package/dist-browser/utils/ObjectUtils.mjs.map +1 -0
  200. package/dist-browser/utils/ProtocolUtils.mjs +1 -1
  201. package/dist-browser/utils/StringUtils.mjs +1 -1
  202. package/dist-browser/utils/TimeUtils.mjs +1 -1
  203. package/dist-browser/utils/UrlUtils.mjs +1 -1
  204. package/lib/index-browser.cjs +5 -67
  205. package/lib/index-browser.cjs.map +1 -1
  206. package/lib/{index-node-3p7V__ym.js → index-node-l_NIe8t5.js} +520 -83
  207. package/lib/index-node-l_NIe8t5.js.map +1 -0
  208. package/lib/index-node.cjs +4 -2
  209. package/lib/index-node.cjs.map +1 -1
  210. package/lib/index.cjs +5 -3
  211. package/lib/index.cjs.map +1 -1
  212. package/package.json +1 -1
  213. package/src/authority/Authority.ts +0 -2
  214. package/src/authority/AuthorityMetadata.ts +1 -13
  215. package/src/authority/AuthorityOptions.ts +0 -3
  216. package/src/authority/AuthorityType.ts +0 -1
  217. package/src/cache/CacheManager.ts +73 -35
  218. package/src/cache/utils/AccountEntityUtils.ts +2 -2
  219. package/src/cache/utils/CacheHelpers.ts +11 -1
  220. package/src/client/AuthorizationCodeClient.ts +11 -1
  221. package/src/client/RefreshTokenClient.ts +25 -1
  222. package/src/client/SilentFlowClient.ts +44 -2
  223. package/src/config/ClientConfiguration.ts +14 -1
  224. package/src/constants/AADServerParamKeys.ts +1 -0
  225. package/src/crypto/DpopProofGenerator.ts +92 -60
  226. package/src/crypto/ICrypto.ts +31 -26
  227. package/src/crypto/ITokenBindingKeyManager.ts +85 -0
  228. package/src/crypto/JoseHeader.ts +75 -14
  229. package/src/crypto/PopTokenGenerator.ts +62 -18
  230. package/src/crypto/PublicJsonWebKey.ts +24 -0
  231. package/src/error/ClientAuthErrorCodes.ts +1 -0
  232. package/src/error/ClientConfigurationErrorCodes.ts +4 -0
  233. package/src/error/JoseHeaderErrorCodes.ts +2 -0
  234. package/src/exports-common.ts +8 -0
  235. package/src/packageMetadata.ts +1 -1
  236. package/src/protocol/Token.ts +44 -1
  237. package/src/request/BaseAuthRequest.ts +5 -0
  238. package/src/request/CommonAuthorizationUrlRequest.ts +5 -0
  239. package/src/request/RequestParameterBuilder.ts +7 -3
  240. package/src/response/AuthenticationResult.ts +2 -0
  241. package/src/response/ResponseHandler.ts +115 -16
  242. package/src/telemetry/performance/PerformanceEvent.ts +22 -0
  243. package/src/utils/Constants.ts +4 -1
  244. package/src/utils/ObjectUtils.ts +31 -0
  245. package/types/authority/Authority.d.ts.map +1 -1
  246. package/types/authority/AuthorityMetadata.d.ts.map +1 -1
  247. package/types/authority/AuthorityOptions.d.ts +0 -1
  248. package/types/authority/AuthorityOptions.d.ts.map +1 -1
  249. package/types/authority/AuthorityType.d.ts +0 -1
  250. package/types/authority/AuthorityType.d.ts.map +1 -1
  251. package/types/cache/CacheManager.d.ts +5 -1
  252. package/types/cache/CacheManager.d.ts.map +1 -1
  253. package/types/cache/utils/CacheHelpers.d.ts.map +1 -1
  254. package/types/client/AuthorizationCodeClient.d.ts.map +1 -1
  255. package/types/client/RefreshTokenClient.d.ts.map +1 -1
  256. package/types/client/SilentFlowClient.d.ts.map +1 -1
  257. package/types/config/ClientConfiguration.d.ts +5 -1
  258. package/types/config/ClientConfiguration.d.ts.map +1 -1
  259. package/types/constants/AADServerParamKeys.d.ts +1 -0
  260. package/types/constants/AADServerParamKeys.d.ts.map +1 -1
  261. package/types/crypto/DpopProofGenerator.d.ts +16 -36
  262. package/types/crypto/DpopProofGenerator.d.ts.map +1 -1
  263. package/types/crypto/ICrypto.d.ts +10 -9
  264. package/types/crypto/ICrypto.d.ts.map +1 -1
  265. package/types/crypto/ITokenBindingKeyManager.d.ts +42 -0
  266. package/types/crypto/ITokenBindingKeyManager.d.ts.map +1 -0
  267. package/types/crypto/JoseHeader.d.ts +18 -5
  268. package/types/crypto/JoseHeader.d.ts.map +1 -1
  269. package/types/crypto/PopTokenGenerator.d.ts +3 -1
  270. package/types/crypto/PopTokenGenerator.d.ts.map +1 -1
  271. package/types/crypto/PublicJsonWebKey.d.ts +20 -0
  272. package/types/crypto/PublicJsonWebKey.d.ts.map +1 -0
  273. package/types/error/ClientAuthErrorCodes.d.ts +1 -0
  274. package/types/error/ClientAuthErrorCodes.d.ts.map +1 -1
  275. package/types/error/ClientConfigurationErrorCodes.d.ts +3 -0
  276. package/types/error/ClientConfigurationErrorCodes.d.ts.map +1 -1
  277. package/types/error/JoseHeaderErrorCodes.d.ts +2 -0
  278. package/types/error/JoseHeaderErrorCodes.d.ts.map +1 -1
  279. package/types/exports-common.d.ts +4 -2
  280. package/types/exports-common.d.ts.map +1 -1
  281. package/types/packageMetadata.d.ts +1 -1
  282. package/types/protocol/Token.d.ts +7 -0
  283. package/types/protocol/Token.d.ts.map +1 -1
  284. package/types/request/BaseAuthRequest.d.ts +5 -0
  285. package/types/request/BaseAuthRequest.d.ts.map +1 -1
  286. package/types/request/CommonAuthorizationUrlRequest.d.ts +5 -0
  287. package/types/request/CommonAuthorizationUrlRequest.d.ts.map +1 -1
  288. package/types/request/RequestParameterBuilder.d.ts +2 -2
  289. package/types/request/RequestParameterBuilder.d.ts.map +1 -1
  290. package/types/response/AuthenticationResult.d.ts +2 -0
  291. package/types/response/AuthenticationResult.d.ts.map +1 -1
  292. package/types/response/ResponseHandler.d.ts +12 -2
  293. package/types/response/ResponseHandler.d.ts.map +1 -1
  294. package/types/telemetry/performance/PerformanceEvent.d.ts +18 -0
  295. package/types/telemetry/performance/PerformanceEvent.d.ts.map +1 -1
  296. package/types/utils/Constants.d.ts +4 -1
  297. package/types/utils/Constants.d.ts.map +1 -1
  298. package/types/utils/ObjectUtils.d.ts +6 -0
  299. package/types/utils/ObjectUtils.d.ts.map +1 -0
  300. 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
- resourceUrl: string;
44
+ htu: string;
42
45
  htm: string;
43
46
  ath: string;
44
47
  nonce?: string;
45
48
  };
46
49
 
47
- /**
48
- * Public JWK embedded in the DPoP proof header.
49
- * @internal
50
- */
51
- export type DpopPublicJwk = Record<string, unknown>;
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
- export const DPOP_JWT_HEADER_TYPE = "dpop+jwt";
84
- export const DPOP_JWT_HEADER_ALGORITHM = JsonWebTokenAlgorithms.ES256;
85
-
86
- function buildProofHeader(params: DpopProofGenerationParams): DpopProofHeader {
87
- return {
88
- typ: DPOP_JWT_HEADER_TYPE,
89
- alg: params.signer.alg,
90
- jwk: params.publicJwk,
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(cryptoUtils: ICrypto) {
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 & DpopProofGenerationParams,
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
- params,
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.resourceUrl, correlationId),
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: DpopResourceProofParams & DpopProofGenerationParams,
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(params, correlationId),
226
- params,
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
- params: DpopProofGenerationParams,
263
+ keyId: string,
234
264
  correlationId: string
235
265
  ): Promise<string> {
236
- const encodedHeader = this.cryptoUtils.base64UrlEncode(
237
- JSON.stringify(buildProofHeader(params))
238
- );
239
- const encodedClaims = this.cryptoUtils.base64UrlEncode(
240
- JSON.stringify(claims)
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 `${signingInput}.${signature}`;
272
+ return this.cryptoUtils.signTokenBindingJwt(
273
+ buildProofHeader(publicJwk, correlationId),
274
+ claims,
275
+ keyId,
276
+ correlationId
277
+ );
246
278
  }
247
279
  }
@@ -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 { ShrOptions, SignedHttpRequest } from "./SignedHttpRequest.js";
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
- * Returns a signed proof-of-possession token with a given acces token that contains a cnf claim with the required kid.
90
- * @param accessToken
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
- signJwt(
93
- payload: SignedHttpRequest,
91
+ signTokenBindingJwt(
92
+ header: JoseHeader,
93
+ payload: object,
94
94
  kid: string,
95
- shrOptions?: ShrOptions,
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 getPublicKeyThumbprint(): Promise<string> {
141
- throw createClientAuthError(
142
- ClientAuthErrorCodes.methodNotImplemented,
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 signJwt(): Promise<string> {
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
+ };
@@ -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?: string;
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 and returns
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 getShrHeaderString(shrHeaderOptions: JoseHeaderOptions): string {
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
- const shrHeader = new JoseHeader({
56
- // Access Token PoP headers must have type pop, but the type header can be overriden for special cases
57
- typ: shrHeaderOptions.typ || JsonWebTokenTypes.Pop,
58
- kid: shrHeaderOptions.kid,
59
- alg: shrHeaderOptions.alg,
60
- });
109
+ if (Object.keys(dpopHeaderOptions.jwk).length === 0) {
110
+ throw createJoseHeaderError(
111
+ JoseHeaderErrorCodes.invalidJwkError,
112
+ correlationId
113
+ );
114
+ }
61
115
 
62
- return JSON.stringify(shrHeader);
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 { ICrypto, SignedHttpRequestParameters } from "./ICrypto.js";
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(cryptoUtils: ICrypto, performanceClient: IPerformanceClient) {
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 = await this.cryptoUtils.getPublicKeyThumbprint(
81
- request
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
- return this.cryptoUtils.signJwt(
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
- at: payload,
134
- ts: TimeUtils.nowSeconds(),
135
- m: resourceRequestMethod?.toUpperCase(),
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
  }