oidc-spa 7.2.0-rc.1 → 7.2.0-rc.2

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 (282) hide show
  1. package/backend.js.map +1 -1
  2. package/core/AuthResponse.js.map +1 -1
  3. package/core/Oidc.js.map +1 -1
  4. package/core/OidcInitializationError.d.ts +0 -13
  5. package/core/OidcInitializationError.js +0 -243
  6. package/core/OidcInitializationError.js.map +1 -1
  7. package/core/OidcMetadata.js.map +1 -1
  8. package/core/StateData.js.map +1 -1
  9. package/core/configId.js.map +1 -1
  10. package/core/createOidc.js +38 -5
  11. package/core/createOidc.js.map +1 -1
  12. package/core/diagnostic.d.ts +14 -0
  13. package/core/diagnostic.js +214 -0
  14. package/core/diagnostic.js.map +1 -0
  15. package/core/evtIsUserActive.js.map +1 -1
  16. package/core/handleOidcCallback.js.map +1 -1
  17. package/core/iframeMessageProtection.js.map +1 -1
  18. package/core/index.js.map +1 -1
  19. package/core/initialLocationHref.js.map +1 -1
  20. package/core/isNewBrowserSession.js.map +1 -1
  21. package/core/loginOrGoToAuthServer.js.map +1 -1
  22. package/core/loginPropagationToOtherTabs.js.map +1 -1
  23. package/core/loginSilent.js.map +1 -1
  24. package/core/logoutPropagationToOtherTabs.js.map +1 -1
  25. package/core/oidcClientTsUserToTokens.js.map +1 -1
  26. package/core/ongoingLoginOrRefreshProcesses.js.map +1 -1
  27. package/core/persistedAuthState.js.map +1 -1
  28. package/entrypoint.js.map +1 -1
  29. package/esm/core/AuthResponse.d.ts +5 -0
  30. package/{src/core/AuthResponse.ts → esm/core/AuthResponse.js} +2 -10
  31. package/esm/core/AuthResponse.js.map +1 -0
  32. package/esm/core/Oidc.d.ts +126 -0
  33. package/esm/core/Oidc.js +2 -0
  34. package/esm/core/Oidc.js.map +1 -0
  35. package/esm/core/OidcInitializationError.d.ts +7 -0
  36. package/esm/core/OidcInitializationError.js +17 -0
  37. package/esm/core/OidcInitializationError.js.map +1 -0
  38. package/{src/core/OidcMetadata.ts → esm/core/OidcMetadata.d.ts} +0 -5
  39. package/esm/core/OidcMetadata.js +3 -0
  40. package/esm/core/OidcMetadata.js.map +1 -0
  41. package/esm/core/StateData.d.ts +42 -0
  42. package/esm/core/StateData.js +55 -0
  43. package/esm/core/StateData.js.map +1 -0
  44. package/esm/core/configId.d.ts +4 -0
  45. package/esm/core/configId.js +4 -0
  46. package/esm/core/configId.js.map +1 -0
  47. package/esm/core/createOidc.d.ts +132 -0
  48. package/{src/core/createOidc.ts → esm/core/createOidc.js} +269 -806
  49. package/esm/core/createOidc.js.map +1 -0
  50. package/esm/core/diagnostic.d.ts +14 -0
  51. package/{src/core/OidcInitializationError.ts → esm/core/diagnostic.js} +32 -109
  52. package/esm/core/diagnostic.js.map +1 -0
  53. package/esm/core/evtIsUserActive.d.ts +5 -0
  54. package/{src/core/evtIsUserActive.ts → esm/core/evtIsUserActive.js} +14 -46
  55. package/esm/core/evtIsUserActive.js.map +1 -0
  56. package/esm/core/handleOidcCallback.d.ts +13 -0
  57. package/{src/core/handleOidcCallback.ts → esm/core/handleOidcCallback.js} +25 -121
  58. package/esm/core/handleOidcCallback.js.map +1 -0
  59. package/esm/core/iframeMessageProtection.d.ts +20 -0
  60. package/{src/core/iframeMessageProtection.ts → esm/core/iframeMessageProtection.js} +10 -45
  61. package/esm/core/iframeMessageProtection.js.map +1 -0
  62. package/esm/core/index.js +4 -0
  63. package/esm/core/index.js.map +1 -0
  64. package/esm/core/initialLocationHref.d.ts +1 -0
  65. package/{src/core/initialLocationHref.ts → esm/core/initialLocationHref.js} +1 -1
  66. package/esm/core/initialLocationHref.js.map +1 -0
  67. package/esm/core/isNewBrowserSession.d.ts +9 -0
  68. package/{src/core/isNewBrowserSession.ts → esm/core/isNewBrowserSession.js} +3 -15
  69. package/esm/core/isNewBrowserSession.js.map +1 -0
  70. package/esm/core/loginOrGoToAuthServer.d.ts +40 -0
  71. package/{src/core/loginOrGoToAuthServer.ts → esm/core/loginOrGoToAuthServer.js} +60 -168
  72. package/esm/core/loginOrGoToAuthServer.js.map +1 -0
  73. package/esm/core/loginPropagationToOtherTabs.d.ts +8 -0
  74. package/{src/core/loginPropagationToOtherTabs.ts → esm/core/loginPropagationToOtherTabs.js} +7 -25
  75. package/esm/core/loginPropagationToOtherTabs.js.map +1 -0
  76. package/esm/core/loginSilent.d.ts +28 -0
  77. package/esm/core/loginSilent.js +125 -0
  78. package/esm/core/loginSilent.js.map +1 -0
  79. package/esm/core/logoutPropagationToOtherTabs.d.ts +10 -0
  80. package/{src/core/logoutPropagationToOtherTabs.ts → esm/core/logoutPropagationToOtherTabs.js} +8 -28
  81. package/esm/core/logoutPropagationToOtherTabs.js.map +1 -0
  82. package/esm/core/oidcClientTsUserToTokens.d.ts +11 -0
  83. package/esm/core/oidcClientTsUserToTokens.js +155 -0
  84. package/esm/core/oidcClientTsUserToTokens.js.map +1 -0
  85. package/esm/core/ongoingLoginOrRefreshProcesses.d.ts +6 -0
  86. package/{src/core/ongoingLoginOrRefreshProcesses.ts → esm/core/ongoingLoginOrRefreshProcesses.js} +6 -24
  87. package/esm/core/ongoingLoginOrRefreshProcesses.js.map +1 -0
  88. package/esm/core/persistedAuthState.d.ts +28 -0
  89. package/esm/core/persistedAuthState.js +64 -0
  90. package/esm/core/persistedAuthState.js.map +1 -0
  91. package/esm/entrypoint.d.ts +7 -0
  92. package/{src/entrypoint.ts → esm/entrypoint.js} +3 -26
  93. package/esm/entrypoint.js.map +1 -0
  94. package/esm/index.js +2 -0
  95. package/esm/index.js.map +1 -0
  96. package/esm/keycloak/index.d.ts +3 -0
  97. package/esm/keycloak/index.js +3 -0
  98. package/esm/keycloak/index.js.map +1 -0
  99. package/esm/keycloak/isKeycloak.d.ts +3 -0
  100. package/{src/keycloak/isKeycloak.ts → esm/keycloak/isKeycloak.js} +2 -8
  101. package/esm/keycloak/isKeycloak.js.map +1 -0
  102. package/esm/keycloak/keycloak-js/Keycloak.d.ts +284 -0
  103. package/{src/keycloak/keycloak-js/Keycloak.ts → esm/keycloak/keycloak-js/Keycloak.js} +116 -439
  104. package/esm/keycloak/keycloak-js/Keycloak.js.map +1 -0
  105. package/esm/keycloak/keycloak-js/index.js +2 -0
  106. package/esm/keycloak/keycloak-js/index.js.map +1 -0
  107. package/{src/keycloak/keycloak-js/types.ts → esm/keycloak/keycloak-js/types.d.ts} +3 -84
  108. package/esm/keycloak/keycloak-js/types.js +2 -0
  109. package/esm/keycloak/keycloak-js/types.js.map +1 -0
  110. package/esm/keycloak/keycloakIssuerUriParsed.d.ts +9 -0
  111. package/{src/keycloak/keycloakIssuerUriParsed.ts → esm/keycloak/keycloakIssuerUriParsed.js} +2 -15
  112. package/esm/keycloak/keycloakIssuerUriParsed.js.map +1 -0
  113. package/esm/keycloak/keycloakUtils.d.ts +37 -0
  114. package/esm/keycloak/keycloakUtils.js +44 -0
  115. package/esm/keycloak/keycloakUtils.js.map +1 -0
  116. package/esm/keycloak-js.js +2 -0
  117. package/esm/keycloak-js.js.map +1 -0
  118. package/esm/mock/index.js +2 -0
  119. package/esm/mock/index.js.map +1 -0
  120. package/esm/mock/oidc.d.ts +19 -0
  121. package/{src/mock/oidc.ts → esm/mock/oidc.js} +28 -88
  122. package/esm/mock/oidc.js.map +1 -0
  123. package/esm/mock/react.d.ts +58 -0
  124. package/esm/mock/react.js +7 -0
  125. package/esm/mock/react.js.map +1 -0
  126. package/esm/react/index.js +2 -0
  127. package/esm/react/index.js.map +1 -0
  128. package/esm/react/react.d.ts +102 -0
  129. package/esm/react/react.js +221 -0
  130. package/esm/react/react.js.map +1 -0
  131. package/esm/tools/Deferred.d.ts +14 -0
  132. package/esm/tools/Deferred.js +23 -0
  133. package/esm/tools/Deferred.js.map +1 -0
  134. package/esm/tools/EphemeralSessionStorage.d.ts +12 -0
  135. package/{src/tools/EphemeralSessionStorage.ts → esm/tools/EphemeralSessionStorage.js} +30 -112
  136. package/esm/tools/EphemeralSessionStorage.js.map +1 -0
  137. package/esm/tools/Evt.d.ts +11 -0
  138. package/{src/tools/Evt.ts → esm/tools/Evt.js} +7 -25
  139. package/esm/tools/Evt.js.map +1 -0
  140. package/esm/tools/StatefulEvt.d.ts +12 -0
  141. package/esm/tools/StatefulEvt.js +21 -0
  142. package/esm/tools/StatefulEvt.js.map +1 -0
  143. package/esm/tools/ValueOrAsyncGetter.js +2 -0
  144. package/esm/tools/ValueOrAsyncGetter.js.map +1 -0
  145. package/esm/tools/asymmetricEncryption.d.ts +18 -0
  146. package/esm/tools/asymmetricEncryption.js +85 -0
  147. package/esm/tools/asymmetricEncryption.js.map +1 -0
  148. package/esm/tools/base64.d.ts +2 -0
  149. package/{src/tools/base64.ts → esm/tools/base64.js} +3 -3
  150. package/esm/tools/base64.js.map +1 -0
  151. package/esm/tools/createObjectThatThrowsIfAccessed.d.ts +8 -0
  152. package/{src/tools/createObjectThatThrowsIfAccessed.ts → esm/tools/createObjectThatThrowsIfAccessed.js} +7 -18
  153. package/esm/tools/createObjectThatThrowsIfAccessed.js.map +1 -0
  154. package/esm/tools/decodeJwt.d.ts +25 -0
  155. package/esm/tools/decodeJwt.js +60 -0
  156. package/esm/tools/decodeJwt.js.map +1 -0
  157. package/esm/tools/generateUrlSafeRandom.d.ts +3 -0
  158. package/{src/tools/generateUrlSafeRandom.ts → esm/tools/generateUrlSafeRandom.js} +5 -8
  159. package/esm/tools/generateUrlSafeRandom.js.map +1 -0
  160. package/esm/tools/getDownlinkAndRtt.d.ts +4 -0
  161. package/{src/tools/getDownlinkAndRtt.ts → esm/tools/getDownlinkAndRtt.js} +6 -10
  162. package/esm/tools/getDownlinkAndRtt.js.map +1 -0
  163. package/esm/tools/getIsOnline.d.ts +7 -0
  164. package/{src/tools/getIsOnline.ts → esm/tools/getIsOnline.js} +3 -9
  165. package/esm/tools/getIsOnline.js.map +1 -0
  166. package/esm/tools/getIsValidRemoteJson.d.ts +1 -0
  167. package/esm/tools/getIsValidRemoteJson.js +15 -0
  168. package/esm/tools/getIsValidRemoteJson.js.map +1 -0
  169. package/esm/tools/getPrUserInteraction.d.ts +4 -0
  170. package/{src/tools/getPrUserInteraction.ts → esm/tools/getPrUserInteraction.js} +2 -6
  171. package/esm/tools/getPrUserInteraction.js.map +1 -0
  172. package/esm/tools/getUserEnvironmentInfo.d.ts +1 -0
  173. package/esm/tools/getUserEnvironmentInfo.js +50 -0
  174. package/esm/tools/getUserEnvironmentInfo.js.map +1 -0
  175. package/esm/tools/haveSharedParentDomain.d.ts +4 -0
  176. package/{src/tools/haveSharedParentDomain.ts → esm/tools/haveSharedParentDomain.js} +3 -5
  177. package/esm/tools/haveSharedParentDomain.js.map +1 -0
  178. package/esm/tools/isDev.d.ts +1 -0
  179. package/{src/tools/isDev.ts → esm/tools/isDev.js} +5 -12
  180. package/esm/tools/isDev.js.map +1 -0
  181. package/esm/tools/parseKeycloakIssuerUri.d.ts +30 -0
  182. package/{src/tools/parseKeycloakIssuerUri.ts → esm/tools/parseKeycloakIssuerUri.js} +2 -18
  183. package/esm/tools/parseKeycloakIssuerUri.js.map +1 -0
  184. package/esm/tools/readExpirationTimeInJwt.d.ts +1 -0
  185. package/{src/tools/readExpirationTimeInJwt.ts → esm/tools/readExpirationTimeInJwt.js} +6 -7
  186. package/esm/tools/readExpirationTimeInJwt.js.map +1 -0
  187. package/esm/tools/startCountdown.d.ts +11 -0
  188. package/{src/tools/startCountdown.ts → esm/tools/startCountdown.js} +6 -17
  189. package/esm/tools/startCountdown.js.map +1 -0
  190. package/esm/tools/subscribeToUserInteraction.d.ts +6 -0
  191. package/{src/tools/subscribeToUserInteraction.ts → esm/tools/subscribeToUserInteraction.js} +4 -13
  192. package/esm/tools/subscribeToUserInteraction.js.map +1 -0
  193. package/esm/tools/toFullyQualifiedUrl.d.ts +10 -0
  194. package/{src/tools/toFullyQualifiedUrl.ts → esm/tools/toFullyQualifiedUrl.js} +7 -25
  195. package/esm/tools/toFullyQualifiedUrl.js.map +1 -0
  196. package/esm/tools/toHumanReadableDuration.d.ts +1 -0
  197. package/{src/tools/toHumanReadableDuration.ts → esm/tools/toHumanReadableDuration.js} +8 -5
  198. package/esm/tools/toHumanReadableDuration.js.map +1 -0
  199. package/esm/tools/urlSearchParams.d.ts +19 -0
  200. package/{src/tools/urlSearchParams.ts → esm/tools/urlSearchParams.js} +24 -70
  201. package/esm/tools/urlSearchParams.js.map +1 -0
  202. package/esm/tools/workerTimers.d.ts +5 -0
  203. package/{src/tools/workerTimers.ts → esm/tools/workerTimers.js} +7 -27
  204. package/esm/tools/workerTimers.js.map +1 -0
  205. package/esm/vendor/frontend/oidc-client-ts.js +3636 -0
  206. package/esm/vendor/frontend/tsafe.js +1 -0
  207. package/esm/vendor/frontend/worker-timers.js +1 -0
  208. package/index.js.map +1 -1
  209. package/keycloak/index.js.map +1 -1
  210. package/keycloak/isKeycloak.js.map +1 -1
  211. package/keycloak/keycloak-js/Keycloak.js.map +1 -1
  212. package/keycloak/keycloak-js/index.js.map +1 -1
  213. package/keycloak/keycloak-js/types.js.map +1 -1
  214. package/keycloak/keycloakIssuerUriParsed.js.map +1 -1
  215. package/keycloak/keycloakUtils.js.map +1 -1
  216. package/keycloak-js.js.map +1 -1
  217. package/mock/index.js.map +1 -1
  218. package/mock/oidc.js.map +1 -1
  219. package/mock/react.js.map +1 -1
  220. package/package.json +74 -328
  221. package/react/index.js.map +1 -1
  222. package/react/react.js.map +1 -1
  223. package/tools/Deferred.js.map +1 -1
  224. package/tools/EphemeralSessionStorage.js.map +1 -1
  225. package/tools/Evt.js.map +1 -1
  226. package/tools/StatefulEvt.js.map +1 -1
  227. package/tools/ValueOrAsyncGetter.js.map +1 -1
  228. package/tools/asymmetricEncryption.js.map +1 -1
  229. package/tools/base64.js.map +1 -1
  230. package/tools/createObjectThatThrowsIfAccessed.js.map +1 -1
  231. package/tools/decodeJwt.js.map +1 -1
  232. package/tools/generateUrlSafeRandom.js.map +1 -1
  233. package/tools/getDownlinkAndRtt.js.map +1 -1
  234. package/tools/getIsOnline.js.map +1 -1
  235. package/tools/getIsValidRemoteJson.js.map +1 -1
  236. package/tools/getPrUserInteraction.js.map +1 -1
  237. package/tools/getUserEnvironmentInfo.js.map +1 -1
  238. package/tools/haveSharedParentDomain.js.map +1 -1
  239. package/tools/isDev.js.map +1 -1
  240. package/tools/parseKeycloakIssuerUri.js.map +1 -1
  241. package/tools/readExpirationTimeInJwt.js.map +1 -1
  242. package/tools/startCountdown.js.map +1 -1
  243. package/tools/subscribeToUserInteraction.js.map +1 -1
  244. package/tools/toFullyQualifiedUrl.js.map +1 -1
  245. package/tools/toHumanReadableDuration.js.map +1 -1
  246. package/tools/urlSearchParams.js.map +1 -1
  247. package/tools/workerTimers.js.map +1 -1
  248. package/LICENSE +0 -21
  249. package/README.md +0 -185
  250. package/src/backend.ts +0 -391
  251. package/src/core/Oidc.ts +0 -140
  252. package/src/core/StateData.ts +0 -118
  253. package/src/core/configId.ts +0 -3
  254. package/src/core/loginSilent.ts +0 -209
  255. package/src/core/oidcClientTsUserToTokens.ts +0 -229
  256. package/src/core/persistedAuthState.ts +0 -122
  257. package/src/keycloak/index.ts +0 -8
  258. package/src/keycloak/keycloakUtils.ts +0 -90
  259. package/src/mock/react.tsx +0 -11
  260. package/src/react/react.tsx +0 -476
  261. package/src/tools/Deferred.ts +0 -39
  262. package/src/tools/StatefulEvt.ts +0 -38
  263. package/src/tools/asymmetricEncryption.ts +0 -184
  264. package/src/tools/decodeJwt.ts +0 -95
  265. package/src/tools/getIsValidRemoteJson.ts +0 -18
  266. package/src/tools/getUserEnvironmentInfo.ts +0 -42
  267. package/src/vendor/backend/evt.ts +0 -2
  268. package/src/vendor/backend/jsonwebtoken.ts +0 -1
  269. package/src/vendor/backend/node-fetch.ts +0 -2
  270. package/src/vendor/backend/node-jose.ts +0 -1
  271. package/src/vendor/backend/tsafe.ts +0 -5
  272. package/src/vendor/backend/zod.ts +0 -1
  273. /package/{src/core/index.ts → esm/core/index.d.ts} +0 -0
  274. /package/{src/index.ts → esm/index.d.ts} +0 -0
  275. /package/{src/keycloak/keycloak-js/index.ts → esm/keycloak/keycloak-js/index.d.ts} +0 -0
  276. /package/{src/keycloak-js.ts → esm/keycloak-js.d.ts} +0 -0
  277. /package/{src/mock/index.ts → esm/mock/index.d.ts} +0 -0
  278. /package/{src/react/index.ts → esm/react/index.d.ts} +0 -0
  279. /package/{src/tools/ValueOrAsyncGetter.ts → esm/tools/ValueOrAsyncGetter.d.ts} +0 -0
  280. /package/{src/vendor/frontend/oidc-client-ts.ts → esm/vendor/frontend/oidc-client-ts.d.ts} +0 -0
  281. /package/{src/vendor/frontend/tsafe.ts → esm/vendor/frontend/tsafe.d.ts} +0 -0
  282. /package/{src/vendor/frontend/worker-timers.ts → esm/vendor/frontend/worker-timers.d.ts} +0 -0
@@ -1,209 +0,0 @@
1
- import type {
2
- UserManager as OidcClientTsUserManager,
3
- User as OidcClientTsUser
4
- } from "../vendor/frontend/oidc-client-ts";
5
- import { Deferred } from "../tools/Deferred";
6
- import { id, assert, noUndefined } from "../vendor/frontend/tsafe";
7
- import { getStateData, clearStateStore, type StateData } from "./StateData";
8
- import { getDownlinkAndRtt } from "../tools/getDownlinkAndRtt";
9
- import { getIsDev } from "../tools/isDev";
10
- import { type AuthResponse } from "./AuthResponse";
11
- import { addOrUpdateSearchParam } from "../tools/urlSearchParams";
12
- import { initIframeMessageProtection } from "./iframeMessageProtection";
13
-
14
- type ResultOfLoginSilent =
15
- | {
16
- outcome: "got auth response from iframe";
17
- authResponse: AuthResponse;
18
- }
19
- | {
20
- outcome: "failure";
21
- cause: "timeout" | "can't reach well-known oidc endpoint";
22
- }
23
- | {
24
- outcome: "token refreshed using refresh token";
25
- oidcClientTsUser: OidcClientTsUser;
26
- };
27
-
28
- export async function loginSilent(params: {
29
- oidcClientTsUserManager: OidcClientTsUserManager;
30
- stateUrlParamValue_instance: string;
31
- configId: string;
32
-
33
- transformUrlBeforeRedirect:
34
- | ((params: { authorizationUrl: string; isSilent: true }) => string)
35
- | undefined;
36
-
37
- getExtraQueryParams:
38
- | ((params: { isSilent: true; url: string }) => Record<string, string | undefined>)
39
- | undefined;
40
-
41
- getExtraTokenParams: (() => Record<string, string | undefined>) | undefined;
42
- autoLogin: boolean;
43
- }): Promise<ResultOfLoginSilent> {
44
- const {
45
- oidcClientTsUserManager,
46
- stateUrlParamValue_instance,
47
- configId,
48
- transformUrlBeforeRedirect,
49
- getExtraQueryParams,
50
- getExtraTokenParams,
51
- autoLogin
52
- } = params;
53
-
54
- const dResult = new Deferred<ResultOfLoginSilent>();
55
-
56
- const timeoutDelayMs: number = (() => {
57
- if (autoLogin) {
58
- return 25_000;
59
- }
60
-
61
- const downlinkAndRtt = getDownlinkAndRtt();
62
- const isDev = getIsDev();
63
-
64
- // Base delay is the minimum delay we should wait in any case
65
- const BASE_DELAY_MS = isDev ? 9_000 : 7_000;
66
-
67
- if (downlinkAndRtt === undefined) {
68
- return BASE_DELAY_MS;
69
- }
70
-
71
- const { downlink, rtt } = downlinkAndRtt;
72
-
73
- // Calculate dynamic delay based on RTT and downlink
74
- // Add 1 to downlink to avoid division by zero
75
- const dynamicDelay = rtt * 2.5 + BASE_DELAY_MS / (downlink + 1);
76
-
77
- return Math.max(BASE_DELAY_MS, dynamicDelay);
78
- })();
79
-
80
- const { decodeEncryptedAuth, getIsEncryptedAuthResponse, clearSessionStoragePublicKey } =
81
- await initIframeMessageProtection({
82
- stateUrlParamValue: stateUrlParamValue_instance
83
- });
84
-
85
- const timer = setTimeout(async () => {
86
- dResult.resolve({
87
- outcome: "failure",
88
- cause: "timeout"
89
- });
90
- }, timeoutDelayMs);
91
-
92
- const listener = async (event: MessageEvent) => {
93
- if (event.origin !== window.location.origin) {
94
- return;
95
- }
96
-
97
- if (
98
- !getIsEncryptedAuthResponse({
99
- message: event.data
100
- })
101
- ) {
102
- return;
103
- }
104
-
105
- const { authResponse } = await decodeEncryptedAuth({ encryptedAuthResponse: event.data });
106
-
107
- const stateData = getStateData({ stateUrlParamValue: authResponse.state });
108
-
109
- assert(stateData !== undefined, "765645");
110
- assert(stateData.context === "iframe", "250711");
111
-
112
- if (stateData.configId !== configId) {
113
- return;
114
- }
115
-
116
- clearTimeout(timer);
117
-
118
- window.removeEventListener("message", listener);
119
-
120
- dResult.resolve({
121
- outcome: "got auth response from iframe",
122
- authResponse
123
- });
124
- };
125
-
126
- window.addEventListener("message", listener, false);
127
-
128
- const transformUrl_oidcClientTs = (url: string) => {
129
- add_extra_query_params: {
130
- if (getExtraQueryParams === undefined) {
131
- break add_extra_query_params;
132
- }
133
-
134
- const extraQueryParams = getExtraQueryParams({ isSilent: true, url });
135
-
136
- for (const [name, value] of Object.entries(extraQueryParams)) {
137
- if (value === undefined) {
138
- continue;
139
- }
140
- url = addOrUpdateSearchParam({ url, name, value, encodeMethod: "www-form" });
141
- }
142
- }
143
-
144
- apply_transform_url: {
145
- if (transformUrlBeforeRedirect === undefined) {
146
- break apply_transform_url;
147
- }
148
- url = transformUrlBeforeRedirect({ authorizationUrl: url, isSilent: true });
149
- }
150
-
151
- return url;
152
- };
153
-
154
- oidcClientTsUserManager
155
- .signinSilent({
156
- state: id<StateData.IFrame>({
157
- context: "iframe",
158
- configId
159
- }),
160
- silentRequestTimeoutInSeconds: timeoutDelayMs / 1000,
161
- extraTokenParams:
162
- getExtraTokenParams === undefined ? undefined : noUndefined(getExtraTokenParams()),
163
- transformUrl: transformUrl_oidcClientTs
164
- })
165
- .then(
166
- oidcClientTsUser => {
167
- assert(oidcClientTsUser !== null, "oidcClientTsUser is not supposed to be null here");
168
-
169
- clearTimeout(timer);
170
- window.removeEventListener("message", listener);
171
-
172
- dResult.resolve({
173
- outcome: "token refreshed using refresh token",
174
- oidcClientTsUser
175
- });
176
- },
177
- (error: Error) => {
178
- if (error.message === "Failed to fetch") {
179
- // NOTE: If we got an error here it means that the fetch to the
180
- // well-known oidc endpoint failed.
181
- // This usually means that the server is down or that the issuerUri
182
- // is not pointing to a valid oidc server.
183
- // It could be a CORS error on the well-known endpoint but it's unlikely.
184
-
185
- clearTimeout(timer);
186
-
187
- dResult.resolve({
188
- outcome: "failure",
189
- cause: "can't reach well-known oidc endpoint"
190
- });
191
-
192
- return;
193
- }
194
-
195
- // NOTE: Here, except error on our understanding there can't be any other
196
- // error than timeout so we fail silently and let the timeout expire.
197
- }
198
- );
199
-
200
- dResult.pr.then(result => {
201
- clearSessionStoragePublicKey();
202
-
203
- if (result.outcome === "failure") {
204
- clearStateStore({ stateUrlParamValue: stateUrlParamValue_instance });
205
- }
206
- });
207
-
208
- return dResult.pr;
209
- }
@@ -1,229 +0,0 @@
1
- import type { User as OidcClientTsUser } from "../vendor/frontend/oidc-client-ts";
2
- import { assert, id } from "../vendor/frontend/tsafe";
3
- import { readExpirationTimeInJwt } from "../tools/readExpirationTimeInJwt";
4
- import { decodeJwt } from "../tools/decodeJwt";
5
- import type { Oidc } from "./Oidc";
6
-
7
- export function oidcClientTsUserToTokens<DecodedIdToken extends Record<string, unknown>>(params: {
8
- oidcClientTsUser: OidcClientTsUser;
9
- decodedIdTokenSchema?: {
10
- parse: (decodedIdToken_original: Oidc.Tokens.DecodedIdToken_base) => DecodedIdToken;
11
- };
12
- __unsafe_useIdTokenAsAccessToken: boolean;
13
- decodedIdToken_previous: DecodedIdToken | undefined;
14
- log: typeof console.log | undefined;
15
- }): Oidc.Tokens<DecodedIdToken> {
16
- const {
17
- oidcClientTsUser,
18
- decodedIdTokenSchema,
19
- __unsafe_useIdTokenAsAccessToken,
20
- decodedIdToken_previous,
21
- log
22
- } = params;
23
-
24
- const isFirstInit = decodedIdToken_previous === undefined;
25
-
26
- const accessToken = oidcClientTsUser.access_token;
27
-
28
- const refreshToken = oidcClientTsUser.refresh_token;
29
-
30
- const idToken = oidcClientTsUser.id_token;
31
-
32
- assert(idToken !== undefined, "No id token provided by the oidc server");
33
-
34
- const decodedIdToken_original = decodeJwt<Oidc.Tokens.DecodedIdToken_base>(idToken);
35
-
36
- if (isFirstInit) {
37
- log?.(
38
- [
39
- `Decoded ID token`,
40
- decodedIdTokenSchema === undefined ? "" : " before `decodedIdTokenSchema.parse()`\n",
41
- JSON.stringify(decodedIdToken_original, null, 2)
42
- ].join("")
43
- );
44
- }
45
-
46
- const decodedIdToken = (() => {
47
- let decodedIdToken: DecodedIdToken;
48
-
49
- if (decodedIdTokenSchema !== undefined) {
50
- decodedIdToken = decodedIdTokenSchema.parse(decodedIdToken_original);
51
-
52
- if (isFirstInit) {
53
- log?.(
54
- [
55
- "Decoded ID token after `decodedIdTokenSchema.parse()`\n",
56
- JSON.stringify(decodedIdToken, null, 2)
57
- ].join("")
58
- );
59
- }
60
- } else {
61
- // @ts-expect-error
62
- decodedIdToken = decodedIdToken_original;
63
- }
64
-
65
- if (
66
- decodedIdToken_previous !== undefined &&
67
- JSON.stringify(decodedIdToken) === JSON.stringify(decodedIdToken_previous)
68
- ) {
69
- // NOTE: For stable ref, prevent re-render for component that would memoize
70
- return decodedIdToken_previous;
71
- }
72
-
73
- return decodedIdToken;
74
- })();
75
-
76
- const issuedAtTime = (() => {
77
- // NOTE: The id_token is always a JWT as per the protocol.
78
- // We don't use Date.now() due to network latency.
79
- const id_token_iat = (() => {
80
- let iat: number | undefined;
81
-
82
- try {
83
- const iat_claimValue = decodedIdToken_original.iat;
84
- assert(iat_claimValue === undefined || typeof iat_claimValue === "number");
85
- iat = iat_claimValue;
86
- } catch {
87
- iat = undefined;
88
- }
89
-
90
- if (iat === undefined) {
91
- return undefined;
92
- }
93
-
94
- return iat;
95
- })();
96
-
97
- if (id_token_iat === undefined) {
98
- return Date.now();
99
- }
100
-
101
- return id_token_iat * 1000;
102
- })();
103
-
104
- const tokens_common: Oidc.Tokens.Common<DecodedIdToken> = {
105
- ...(__unsafe_useIdTokenAsAccessToken
106
- ? {
107
- accessToken: idToken,
108
- accessTokenExpirationTime: (() => {
109
- const expirationTime = readExpirationTimeInJwt(idToken);
110
-
111
- assert(
112
- expirationTime !== undefined,
113
- "Failed to get id token expiration time while trying to substitute the access token by the id token"
114
- );
115
-
116
- return expirationTime;
117
- })()
118
- }
119
- : {
120
- accessToken,
121
- accessTokenExpirationTime: (() => {
122
- read_from_jwt: {
123
- const expirationTime = readExpirationTimeInJwt(accessToken);
124
-
125
- if (expirationTime === undefined) {
126
- break read_from_jwt;
127
- }
128
-
129
- return expirationTime;
130
- }
131
-
132
- read_from_token_response_expires_at: {
133
- const { expires_at } = oidcClientTsUser.__oidc_spa_tokenResponse;
134
-
135
- if (expires_at === undefined) {
136
- break read_from_token_response_expires_at;
137
- }
138
-
139
- assert(typeof expires_at === "number", "2033392");
140
-
141
- return expires_at * 1000;
142
- }
143
-
144
- read_from_token_response_expires_in: {
145
- const { expires_in } = oidcClientTsUser.__oidc_spa_tokenResponse;
146
-
147
- if (expires_in === undefined) {
148
- break read_from_token_response_expires_in;
149
- }
150
-
151
- assert(typeof expires_in === "number", "203333425");
152
-
153
- return issuedAtTime + expires_in * 1_000;
154
- }
155
-
156
- assert(false, "Failed to get access token expiration time");
157
- })()
158
- }),
159
- idToken,
160
- decodedIdToken,
161
- decodedIdToken_original,
162
- issuedAtTime
163
- };
164
-
165
- const tokens: Oidc.Tokens<DecodedIdToken> =
166
- refreshToken === undefined
167
- ? id<Oidc.Tokens.WithoutRefreshToken<DecodedIdToken>>({
168
- ...tokens_common,
169
- hasRefreshToken: false
170
- })
171
- : id<Oidc.Tokens.WithRefreshToken<DecodedIdToken>>({
172
- ...tokens_common,
173
- hasRefreshToken: true,
174
- refreshToken,
175
- refreshTokenExpirationTime: (() => {
176
- read_from_token_response_expires_at: {
177
- const { refresh_expires_at } = oidcClientTsUser.__oidc_spa_tokenResponse;
178
-
179
- if (refresh_expires_at === undefined) {
180
- break read_from_token_response_expires_at;
181
- }
182
-
183
- assert(typeof refresh_expires_at === "number", "2033392");
184
-
185
- return refresh_expires_at * 1000;
186
- }
187
-
188
- read_from_token_response_expires_in: {
189
- const { refresh_expires_in } = oidcClientTsUser.__oidc_spa_tokenResponse;
190
-
191
- if (refresh_expires_in === undefined) {
192
- break read_from_token_response_expires_in;
193
- }
194
-
195
- assert(typeof refresh_expires_in === "number", "2033425330");
196
-
197
- return issuedAtTime + refresh_expires_in * 1000;
198
- }
199
-
200
- read_from_jwt: {
201
- const expirationTime = readExpirationTimeInJwt(refreshToken);
202
-
203
- if (expirationTime === undefined) {
204
- break read_from_jwt;
205
- }
206
-
207
- return expirationTime;
208
- }
209
-
210
- return undefined;
211
- })()
212
- });
213
-
214
- if (
215
- isFirstInit &&
216
- tokens.hasRefreshToken &&
217
- tokens.refreshTokenExpirationTime !== undefined &&
218
- tokens.refreshTokenExpirationTime < tokens.accessTokenExpirationTime
219
- ) {
220
- console.warn(
221
- [
222
- "The OIDC refresh token expirationTime is shorter than the one of the access token.",
223
- "This is very unusual and probably a misconfiguration."
224
- ].join(" ")
225
- );
226
- }
227
-
228
- return tokens;
229
- }
@@ -1,122 +0,0 @@
1
- import { typeGuard, id } from "../vendor/frontend/tsafe";
2
-
3
- function getKey(params: { configId: string }) {
4
- const { configId } = params;
5
-
6
- return `oidc-spa:auth-state:${configId}`;
7
- }
8
-
9
- type PersistedAuthState = PersistedAuthState.LoggedIn | PersistedAuthState.ExplicitlyLoggedOut;
10
- namespace PersistedAuthState {
11
- type Common = {
12
- __brand: "PersistedAuthState-v1";
13
- };
14
-
15
- export type LoggedIn = Common & {
16
- stateDescription: "logged in";
17
- untilTime: number | undefined;
18
- };
19
-
20
- export type ExplicitlyLoggedOut = Common & {
21
- stateDescription: "explicitly logged out";
22
- };
23
- }
24
-
25
- export function persistAuthState(params: {
26
- configId: string;
27
- state:
28
- | {
29
- stateDescription: "logged in";
30
- idleSessionLifetimeInSeconds: number | undefined;
31
- refreshTokenExpirationTime: number | undefined;
32
- }
33
- | {
34
- stateDescription: "explicitly logged out";
35
- }
36
- | undefined;
37
- }) {
38
- const { configId, state } = params;
39
-
40
- const key = getKey({ configId });
41
-
42
- if (state === undefined) {
43
- localStorage.removeItem(key);
44
- return;
45
- }
46
-
47
- localStorage.setItem(
48
- key,
49
- JSON.stringify(
50
- id<PersistedAuthState>(
51
- (() => {
52
- switch (state.stateDescription) {
53
- case "logged in":
54
- return id<PersistedAuthState.LoggedIn>({
55
- __brand: "PersistedAuthState-v1",
56
- stateDescription: "logged in",
57
- untilTime: (() => {
58
- const { idleSessionLifetimeInSeconds, refreshTokenExpirationTime } =
59
- state;
60
-
61
- if (idleSessionLifetimeInSeconds !== undefined) {
62
- return Date.now() + idleSessionLifetimeInSeconds * 1000;
63
- }
64
-
65
- return refreshTokenExpirationTime;
66
- })()
67
- });
68
- case "explicitly logged out":
69
- return id<PersistedAuthState.ExplicitlyLoggedOut>({
70
- __brand: "PersistedAuthState-v1",
71
- stateDescription: "explicitly logged out"
72
- });
73
- }
74
- })()
75
- )
76
- )
77
- );
78
- }
79
-
80
- export function getPersistedAuthState(params: {
81
- configId: string;
82
- }): PersistedAuthState["stateDescription"] | undefined {
83
- const { configId } = params;
84
-
85
- const key = getKey({ configId });
86
-
87
- const value = localStorage.getItem(key);
88
-
89
- if (value === null) {
90
- return undefined;
91
- }
92
-
93
- let state: unknown;
94
-
95
- try {
96
- state = JSON.parse(value);
97
- } catch {
98
- localStorage.removeItem(key);
99
- return undefined;
100
- }
101
-
102
- if (
103
- !typeGuard<PersistedAuthState>(
104
- state,
105
- state instanceof Object &&
106
- "__brand" in state &&
107
- state.__brand === id<PersistedAuthState["__brand"]>("PersistedAuthState-v1")
108
- )
109
- ) {
110
- localStorage.removeItem(key);
111
- return undefined;
112
- }
113
-
114
- if (state.stateDescription === "logged in") {
115
- if (state.untilTime !== undefined && state.untilTime <= Date.now()) {
116
- localStorage.removeItem(key);
117
- return undefined;
118
- }
119
- }
120
-
121
- return state.stateDescription;
122
- }
@@ -1,8 +0,0 @@
1
- export { isKeycloak } from "./isKeycloak";
2
- export type { KeycloakIssuerUriParsed } from "./keycloakIssuerUriParsed";
3
- export {
4
- type KeycloakUtils,
5
- KeycloakProfile,
6
- KeycloakUserInfo,
7
- createKeycloakUtils
8
- } from "./keycloakUtils";
@@ -1,90 +0,0 @@
1
- import { toFullyQualifiedUrl } from "../tools/toFullyQualifiedUrl";
2
-
3
- import { type KeycloakIssuerUriParsed, parseKeycloakIssuerUri } from "./keycloakIssuerUriParsed";
4
-
5
- export type KeycloakUtils = {
6
- issuerUriParsed: KeycloakIssuerUriParsed;
7
- adminConsoleUrl: string;
8
- adminConsoleUrl_master: string;
9
- getAccountUrl: (params: {
10
- clientId: string;
11
- backToAppFromAccountUrl: string;
12
- locale?: string;
13
- }) => string;
14
- fetchUserProfile: (params: { accessToken: string }) => Promise<KeycloakProfile>;
15
- fetchUserInfo: (params: { accessToken: string }) => Promise<KeycloakUserInfo>;
16
- transformUrlBeforeRedirectForRegister: (authorizationUrl: string) => string;
17
- };
18
-
19
- export type KeycloakProfile = {
20
- id?: string;
21
- username?: string;
22
- email?: string;
23
- firstName?: string;
24
- lastName?: string;
25
- enabled?: boolean;
26
- emailVerified?: boolean;
27
- totp?: boolean;
28
- createdTimestamp?: number;
29
- attributes?: Record<string, unknown>;
30
- };
31
-
32
- export type KeycloakUserInfo = {
33
- sub: string;
34
- [key: string]: any;
35
- };
36
-
37
- export function createKeycloakUtils(params: { issuerUri: string }): KeycloakUtils {
38
- const { issuerUri } = params;
39
-
40
- const issuerUriParsed = parseKeycloakIssuerUri({ issuerUri });
41
-
42
- const keycloakServerUrl = `${issuerUriParsed.origin}${issuerUriParsed.kcHttpRelativePath ?? ""}`;
43
-
44
- const getAdminConsoleUrl = (realm: string) =>
45
- `${keycloakServerUrl}/admin/${encodeURIComponent(realm)}/console`;
46
-
47
- const realmUrl = `${keycloakServerUrl}/realms/${encodeURIComponent(issuerUriParsed.realm)}`;
48
-
49
- return {
50
- issuerUriParsed,
51
- adminConsoleUrl: getAdminConsoleUrl(issuerUriParsed.realm),
52
- adminConsoleUrl_master: getAdminConsoleUrl("master"),
53
- getAccountUrl: ({ clientId, backToAppFromAccountUrl, locale }) => {
54
- const accountUrlObj = new URL(
55
- `${keycloakServerUrl}/realms/${issuerUriParsed.realm}/account`
56
- );
57
- accountUrlObj.searchParams.set("referrer", clientId);
58
- accountUrlObj.searchParams.set(
59
- "referrer_uri",
60
- toFullyQualifiedUrl({
61
- urlish: backToAppFromAccountUrl,
62
- doAssertNoQueryParams: false
63
- })
64
- );
65
- if (locale !== undefined) {
66
- accountUrlObj.searchParams.set("kc_locale", locale);
67
- }
68
- return accountUrlObj.href;
69
- },
70
- fetchUserProfile: ({ accessToken }) =>
71
- fetch(`${realmUrl}/account`, {
72
- headers: {
73
- Accept: "application/json",
74
- Authorization: `Bearer ${accessToken}`
75
- }
76
- }).then(r => r.json()),
77
- fetchUserInfo: ({ accessToken }) =>
78
- fetch(`${realmUrl}/protocol/openid-connect/userinfo`, {
79
- headers: {
80
- Accept: "application/json",
81
- Authorization: `Bearer ${accessToken}`
82
- }
83
- }).then(r => r.json()),
84
- transformUrlBeforeRedirectForRegister: authorizationUrl => {
85
- const urlObj = new URL(authorizationUrl);
86
- urlObj.pathname = urlObj.pathname.replace(/\/auth$/, "/registrations");
87
- return urlObj.href;
88
- }
89
- };
90
- }
@@ -1,11 +0,0 @@
1
- import { createOidcReactApi_dependencyInjection } from "../react/react";
2
- import { createMockOidc, type ParamsOfCreateMockOidc } from "./oidc";
3
- import type { ValueOrAsyncGetter } from "../tools/ValueOrAsyncGetter";
4
-
5
- /** @see: https://docs.oidc-spa.dev/v/v7/mock */
6
- export function createMockReactOidc<
7
- DecodedIdToken extends Record<string, unknown> = Record<string, unknown>,
8
- AutoLogin extends boolean = false
9
- >(params: ValueOrAsyncGetter<ParamsOfCreateMockOidc<DecodedIdToken, AutoLogin>>) {
10
- return createOidcReactApi_dependencyInjection(params, createMockOidc);
11
- }