oidc-spa 8.6.19 → 8.7.1

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 (140) hide show
  1. package/backend.d.ts +3 -20
  2. package/backend.js +50 -242
  3. package/backend.js.map +1 -1
  4. package/core/OidcMetadata.d.ts +2 -2
  5. package/core/OidcMetadata.js.map +1 -1
  6. package/core/createOidc.d.ts +2 -4
  7. package/core/createOidc.js +49 -3
  8. package/core/createOidc.js.map +1 -1
  9. package/core/dpop.d.ts +20 -0
  10. package/core/dpop.js +389 -0
  11. package/core/dpop.js.map +1 -0
  12. package/core/earlyInit.js +2 -0
  13. package/core/earlyInit.js.map +1 -1
  14. package/core/oidcClientTsUserToTokens.d.ts +1 -0
  15. package/core/oidcClientTsUserToTokens.js +15 -5
  16. package/core/oidcClientTsUserToTokens.js.map +1 -1
  17. package/core/tokenExfiltrationDefense.js +49 -6
  18. package/core/tokenExfiltrationDefense.js.map +1 -1
  19. package/esm/angular.d.ts +2 -0
  20. package/esm/angular.mjs.map +1 -1
  21. package/esm/backend.d.ts +3 -20
  22. package/esm/backend.mjs +50 -242
  23. package/esm/backend.mjs.map +1 -1
  24. package/esm/core/OidcMetadata.d.ts +2 -2
  25. package/esm/core/OidcMetadata.mjs.map +1 -1
  26. package/esm/core/createOidc.d.ts +2 -4
  27. package/esm/core/createOidc.mjs +49 -3
  28. package/esm/core/createOidc.mjs.map +1 -1
  29. package/esm/core/dpop.d.ts +20 -0
  30. package/esm/core/dpop.mjs +384 -0
  31. package/esm/core/dpop.mjs.map +1 -0
  32. package/esm/core/earlyInit.mjs +2 -0
  33. package/esm/core/earlyInit.mjs.map +1 -1
  34. package/esm/core/oidcClientTsUserToTokens.d.ts +1 -0
  35. package/esm/core/oidcClientTsUserToTokens.mjs +15 -5
  36. package/esm/core/oidcClientTsUserToTokens.mjs.map +1 -1
  37. package/esm/core/tokenExfiltrationDefense.mjs +49 -6
  38. package/esm/core/tokenExfiltrationDefense.mjs.map +1 -1
  39. package/esm/react-spa/createOidcSpaApi.mjs +2 -1
  40. package/esm/react-spa/createOidcSpaApi.mjs.map +1 -1
  41. package/esm/react-spa/types.d.ts +2 -0
  42. package/esm/server/createOidcSpaUtils.d.ts +5 -0
  43. package/esm/server/createOidcSpaUtils.mjs +639 -0
  44. package/esm/server/createOidcSpaUtils.mjs.map +1 -0
  45. package/esm/server/index.d.ts +2 -0
  46. package/esm/server/index.mjs +3 -0
  47. package/esm/server/index.mjs.map +1 -0
  48. package/esm/server/types.d.ts +79 -0
  49. package/esm/server/types.mjs +2 -0
  50. package/esm/server/types.mjs.map +1 -0
  51. package/esm/server/utilsBuilder.d.ts +10 -0
  52. package/esm/server/utilsBuilder.mjs +13 -0
  53. package/esm/server/utilsBuilder.mjs.map +1 -0
  54. package/esm/tanstack-start/react/accessTokenValidation_rfc9068.d.ts +1 -1
  55. package/esm/tanstack-start/react/accessTokenValidation_rfc9068.mjs +102 -94
  56. package/esm/tanstack-start/react/accessTokenValidation_rfc9068.mjs.map +1 -1
  57. package/esm/tanstack-start/react/createOidcSpaApi.d.ts +2 -2
  58. package/esm/tanstack-start/react/createOidcSpaApi.mjs +60 -51
  59. package/esm/tanstack-start/react/createOidcSpaApi.mjs.map +1 -1
  60. package/esm/tanstack-start/react/index.d.ts +1 -1
  61. package/esm/tanstack-start/react/index.mjs +2 -2
  62. package/esm/tanstack-start/react/index.mjs.map +1 -1
  63. package/esm/tanstack-start/react/types.d.ts +36 -11
  64. package/esm/tanstack-start/react/{apiBuilder.d.ts → utilsBuilder.d.ts} +9 -9
  65. package/esm/tanstack-start/react/{apiBuilder.mjs → utilsBuilder.mjs} +6 -6
  66. package/esm/tanstack-start/react/utilsBuilder.mjs.map +1 -0
  67. package/esm/tools/generateES256DPoPProof.d.ts +8 -0
  68. package/esm/tools/generateES256DPoPProof.mjs +48 -0
  69. package/esm/tools/generateES256DPoPProof.mjs.map +1 -0
  70. package/esm/tools/getServerDateNow.d.ts +5 -0
  71. package/esm/tools/getServerDateNow.mjs +7 -0
  72. package/esm/tools/getServerDateNow.mjs.map +1 -0
  73. package/esm/vendor/{backend → server}/evt.mjs +84 -140
  74. package/esm/vendor/{backend → server}/jose.mjs +5 -27
  75. package/esm/vendor/{backend → server}/tsafe.d.ts +1 -0
  76. package/esm/vendor/{backend → server}/tsafe.mjs +6 -0
  77. package/esm/vendor/{backend → server}/zod.mjs +196 -50
  78. package/package.json +6 -1
  79. package/react-spa/createOidcSpaApi.js +2 -1
  80. package/react-spa/createOidcSpaApi.js.map +1 -1
  81. package/react-spa/types.d.ts +2 -0
  82. package/server/createOidcSpaUtils.d.ts +5 -0
  83. package/server/createOidcSpaUtils.js +642 -0
  84. package/server/createOidcSpaUtils.js.map +1 -0
  85. package/server/index.d.ts +2 -0
  86. package/server/index.js +6 -0
  87. package/server/index.js.map +1 -0
  88. package/server/types.d.ts +79 -0
  89. package/server/types.js +3 -0
  90. package/server/types.js.map +1 -0
  91. package/server/utilsBuilder.d.ts +10 -0
  92. package/server/utilsBuilder.js +16 -0
  93. package/server/utilsBuilder.js.map +1 -0
  94. package/src/angular.ts +3 -0
  95. package/src/backend.ts +63 -364
  96. package/src/core/OidcMetadata.ts +4 -2
  97. package/src/core/createOidc.ts +62 -6
  98. package/src/core/dpop.ts +583 -0
  99. package/src/core/earlyInit.ts +3 -0
  100. package/src/core/oidcClientTsUserToTokens.ts +18 -4
  101. package/src/core/tokenExfiltrationDefense.ts +60 -5
  102. package/src/react-spa/createOidcSpaApi.ts +2 -1
  103. package/src/react-spa/types.tsx +3 -0
  104. package/src/server/createOidcSpaUtils.ts +848 -0
  105. package/src/server/index.ts +4 -0
  106. package/src/server/types.tsx +99 -0
  107. package/src/server/utilsBuilder.ts +41 -0
  108. package/src/tanstack-start/react/accessTokenValidation_rfc9068.ts +134 -124
  109. package/src/tanstack-start/react/createOidcSpaApi.ts +73 -69
  110. package/src/tanstack-start/react/index.ts +2 -2
  111. package/src/tanstack-start/react/types.tsx +44 -12
  112. package/src/tanstack-start/react/{apiBuilder.ts → utilsBuilder.ts} +14 -14
  113. package/src/tools/generateES256DPoPProof.ts +74 -0
  114. package/src/tools/getServerDateNow.ts +11 -0
  115. package/src/vendor/{backend → server}/tsafe.ts +1 -0
  116. package/tools/generateES256DPoPProof.d.ts +8 -0
  117. package/tools/generateES256DPoPProof.js +51 -0
  118. package/tools/generateES256DPoPProof.js.map +1 -0
  119. package/tools/getServerDateNow.d.ts +5 -0
  120. package/tools/getServerDateNow.js +10 -0
  121. package/tools/getServerDateNow.js.map +1 -0
  122. package/vendor/server/evt.js +3 -0
  123. package/vendor/server/jose.js +3 -0
  124. package/vendor/{backend → server}/tsafe.d.ts +1 -0
  125. package/vendor/server/tsafe.js +2 -0
  126. package/vendor/server/zod.js +3 -0
  127. package/esm/tanstack-start/react/apiBuilder.mjs.map +0 -1
  128. package/vendor/backend/evt.js +0 -3
  129. package/vendor/backend/jose.js +0 -3
  130. package/vendor/backend/tsafe.js +0 -2
  131. package/vendor/backend/zod.js +0 -3
  132. /package/esm/vendor/{backend → server}/evt.d.ts +0 -0
  133. /package/esm/vendor/{backend → server}/jose.d.ts +0 -0
  134. /package/esm/vendor/{backend → server}/zod.d.ts +0 -0
  135. /package/src/vendor/{backend → server}/evt.ts +0 -0
  136. /package/src/vendor/{backend → server}/jose.ts +0 -0
  137. /package/src/vendor/{backend → server}/zod.ts +0 -0
  138. /package/vendor/{backend → server}/evt.d.ts +0 -0
  139. /package/vendor/{backend → server}/jose.d.ts +0 -0
  140. /package/vendor/{backend → server}/zod.d.ts +0 -0
@@ -10,6 +10,7 @@ import {
10
10
  type Params as Params_handleTokenExfiltrationDefense_legacy
11
11
  } from "./tokenExfiltrationDefense_legacy";
12
12
  import { enableTokenExfiltrationDefense } from "./tokenExfiltrationDefense";
13
+ import { implementFetchAndXhrDPoPInterceptor } from "./dpop";
13
14
 
14
15
  let hasEarlyInitBeenCalled = false;
15
16
 
@@ -77,6 +78,8 @@ export function oidcEarlyInit(params: ParamsOfEarlyInit | ParamsOfEarlyInit_lega
77
78
  const { shouldLoadApp } = handleOidcCallback();
78
79
 
79
80
  if (shouldLoadApp) {
81
+ implementFetchAndXhrDPoPInterceptor();
82
+
80
83
  token_exfiltration_defense: {
81
84
  if (!("enableTokenExfiltrationDefense" in params)) {
82
85
  handleTokenExfiltrationDefense_legacy({
@@ -6,6 +6,8 @@ import { decodeJwt } from "../tools/decodeJwt";
6
6
  import type { Oidc } from "./Oidc";
7
7
  import { INFINITY_TIME } from "../tools/INFINITY_TIME";
8
8
  import { getIsTokenSubstitutionEnabled, getTokensPlaceholders } from "./tokenPlaceholderSubstitution";
9
+ import { registerAccessTokenForDPoP } from "./dpop";
10
+ import { createGetServerDateNow, type ParamsOfCreateGetServerDateNow } from "../tools/getServerDateNow";
9
11
 
10
12
  export function oidcClientTsUserToTokens<DecodedIdToken extends Record<string, unknown>>(params: {
11
13
  configId: string;
@@ -15,6 +17,7 @@ export function oidcClientTsUserToTokens<DecodedIdToken extends Record<string, u
15
17
  };
16
18
  __unsafe_useIdTokenAsAccessToken: boolean;
17
19
  decodedIdToken_previous: DecodedIdToken | undefined;
20
+ isDPoPEnabled: boolean;
18
21
  log: typeof console.log | undefined;
19
22
  }): Oidc.Tokens<DecodedIdToken> {
20
23
  const {
@@ -23,6 +26,7 @@ export function oidcClientTsUserToTokens<DecodedIdToken extends Record<string, u
23
26
  decodedIdTokenSchema,
24
27
  __unsafe_useIdTokenAsAccessToken,
25
28
  decodedIdToken_previous,
29
+ isDPoPEnabled,
26
30
  log
27
31
  } = params;
28
32
 
@@ -107,6 +111,11 @@ export function oidcClientTsUserToTokens<DecodedIdToken extends Record<string, u
107
111
  return id_token_iat * 1000;
108
112
  })();
109
113
 
114
+ const paramsOfCreateGetServerDateNow: ParamsOfCreateGetServerDateNow = {
115
+ issuedAtTime_local: oidcClientTsUser.__oidc_spa_localTimeWhenTokenIssued,
116
+ issuedAtTime
117
+ };
118
+
110
119
  const tokens_common: Oidc.Tokens.Common<DecodedIdToken> = {
111
120
  ...(__unsafe_useIdTokenAsAccessToken
112
121
  ? {
@@ -166,10 +175,7 @@ export function oidcClientTsUserToTokens<DecodedIdToken extends Record<string, u
166
175
  decodedIdToken,
167
176
  decodedIdToken_original,
168
177
  issuedAtTime,
169
- getServerDateNow: (() => {
170
- const issuedAtTime_local = oidcClientTsUser.__oidc_spa_localTimeWhenTokenIssued;
171
- return () => Date.now() + (issuedAtTime - issuedAtTime_local);
172
- })()
178
+ getServerDateNow: createGetServerDateNow(paramsOfCreateGetServerDateNow)
173
179
  };
174
180
 
175
181
  const tokens: Oidc.Tokens<DecodedIdToken> =
@@ -229,6 +235,14 @@ export function oidcClientTsUserToTokens<DecodedIdToken extends Record<string, u
229
235
  })()
230
236
  });
231
237
 
238
+ if (isDPoPEnabled) {
239
+ registerAccessTokenForDPoP({
240
+ configId,
241
+ accessToken: tokens.accessToken,
242
+ paramsOfCreateGetServerDateNow
243
+ });
244
+ }
245
+
232
246
  if (getIsTokenSubstitutionEnabled()) {
233
247
  const placeholders = getTokensPlaceholders({
234
248
  configId,
@@ -341,11 +341,7 @@ function patchXMLHttpRequestApiToSubstituteTokenPlaceholder(params: {
341
341
  throw new Error("oidc-spa: Blocked request to hashed static asset.");
342
342
  }
343
343
 
344
- if (async === undefined) {
345
- return open_actual.bind(this)(method, state.url);
346
- } else {
347
- return open_actual.call(this, method, state.url, async, username, password);
348
- }
344
+ return open_actual.call(this, method, state.url, async as true, username, password);
349
345
  };
350
346
 
351
347
  XMLHttpRequest.prototype.setRequestHeader = function setRequestHeader(name, value) {
@@ -911,6 +907,65 @@ function runMonkeyPatchingPrevention() {
911
907
  });
912
908
  }
913
909
 
910
+ crypto_subtle: {
911
+ const { crypto } = window;
912
+
913
+ if (!crypto?.subtle) {
914
+ break crypto_subtle;
915
+ }
916
+
917
+ const subtle = crypto.subtle;
918
+ const prototype = Object.getPrototypeOf(subtle);
919
+
920
+ for (const propertyName of Object.getOwnPropertyNames(prototype)) {
921
+ const pd = Object.getOwnPropertyDescriptor(prototype, propertyName);
922
+
923
+ assert(pd !== undefined);
924
+
925
+ if (!pd.configurable) {
926
+ continue;
927
+ }
928
+
929
+ const target = `window.crypto.subtle.${propertyName}`;
930
+
931
+ Object.defineProperty(prototype, propertyName, {
932
+ enumerable: pd.enumerable,
933
+ configurable: false,
934
+ ...("value" in pd
935
+ ? {
936
+ get: () => pd.value,
937
+ set: () => {
938
+ throw createWriteError(target);
939
+ }
940
+ }
941
+ : {
942
+ get: pd.get,
943
+ set:
944
+ pd.set ??
945
+ (() => {
946
+ throw createWriteError(target);
947
+ })
948
+ })
949
+ });
950
+ }
951
+
952
+ {
953
+ const subtlePd = Object.getOwnPropertyDescriptor(crypto, "subtle");
954
+ if (subtlePd !== undefined && !subtlePd.configurable) {
955
+ break crypto_subtle;
956
+ }
957
+ }
958
+
959
+ Object.defineProperty(crypto, "subtle", {
960
+ configurable: false,
961
+ enumerable: true,
962
+ get: () => subtle,
963
+ set: () => {
964
+ throw createWriteError("window.crypto.subtle");
965
+ }
966
+ });
967
+ }
968
+
914
969
  {
915
970
  const name = "serviceWorker";
916
971
 
@@ -414,7 +414,8 @@ export function createOidcSpaApi<
414
414
  __metadata: paramsOfBootstrap.__metadata,
415
415
  __unsafe_useIdTokenAsAccessToken:
416
416
  paramsOfBootstrap.__unsafe_useIdTokenAsAccessToken,
417
- autoLogoutParams: paramsOfBootstrap.autoLogoutParams
417
+ autoLogoutParams: paramsOfBootstrap.autoLogoutParams,
418
+ dpop: paramsOfBootstrap.dpop
418
419
  });
419
420
  } catch (error) {
420
421
  if (!(error instanceof OidcInitializationError)) {
@@ -289,6 +289,9 @@ export namespace ParamsOfBootstrap {
289
289
  * (if you weren't able to provide it)
290
290
  */
291
291
  BASE_URL?: string;
292
+
293
+ /** See: https://docs.oidc-spa.dev/v/v8/features/dpop */
294
+ dpop?: "disabled" | "enabled" | "auto";
292
295
  } & (AutoLogin extends true ? {} : {});
293
296
 
294
297
  export type Mock<AutoLogin, DecodedIdToken> = {