@bmc-soft/keycloak-auth 2.0.1 → 2.0.3

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 (117) hide show
  1. package/README.md +8 -1
  2. package/dist/_lib/index.d.ts +1 -0
  3. package/dist/_lib/index.d.ts.map +1 -1
  4. package/dist/_lib/types/authStage.d.ts +1 -0
  5. package/dist/_lib/types/authStage.d.ts.map +1 -1
  6. package/dist/_lib/types/authStage.js +1 -0
  7. package/dist/_lib/types/authStage.js.map +1 -1
  8. package/dist/_lib/types/confirmAuthPhase.d.ts +1 -0
  9. package/dist/_lib/types/confirmAuthPhase.d.ts.map +1 -1
  10. package/dist/_lib/types/confirmAuthPhase.js +1 -0
  11. package/dist/_lib/types/confirmAuthPhase.js.map +1 -1
  12. package/dist/_lib/types/index.d.ts +1 -0
  13. package/dist/_lib/types/index.d.ts.map +1 -1
  14. package/dist/_lib/types/successFeedback.d.ts +6 -0
  15. package/dist/_lib/types/successFeedback.d.ts.map +1 -0
  16. package/dist/_lib/types/successFeedback.js +2 -0
  17. package/dist/_lib/types/successFeedback.js.map +1 -0
  18. package/dist/axios/adapters/KeycloakTokenProvider.js +1 -1
  19. package/dist/axios/adapters/KeycloakTokenProvider.js.map +1 -1
  20. package/dist/context/KeycloakConfigContext.d.ts +4 -1
  21. package/dist/context/KeycloakConfigContext.d.ts.map +1 -1
  22. package/dist/context/KeycloakConfigContext.js +24 -6
  23. package/dist/context/KeycloakConfigContext.js.map +1 -1
  24. package/dist/context/KeycloakInstanceContext.d.ts.map +1 -1
  25. package/dist/context/KeycloakInstanceContext.js +65 -9
  26. package/dist/context/KeycloakInstanceContext.js.map +1 -1
  27. package/dist/context/KeycloakProvider.d.ts +1 -0
  28. package/dist/context/KeycloakProvider.d.ts.map +1 -1
  29. package/dist/context/KeycloakProvider.js +2 -2
  30. package/dist/context/KeycloakProvider.js.map +1 -1
  31. package/dist/context/TokenContext.d.ts.map +1 -1
  32. package/dist/context/TokenContext.js +33 -15
  33. package/dist/context/TokenContext.js.map +1 -1
  34. package/dist/core/adapter.d.ts.map +1 -1
  35. package/dist/core/adapter.js +25 -9
  36. package/dist/core/adapter.js.map +1 -1
  37. package/dist/core/index.d.ts +1 -1
  38. package/dist/core/index.d.ts.map +1 -1
  39. package/dist/core/sessionTermination.d.ts +2 -0
  40. package/dist/core/sessionTermination.d.ts.map +1 -0
  41. package/dist/core/sessionTermination.js +38 -0
  42. package/dist/core/sessionTermination.js.map +1 -0
  43. package/dist/core/types.d.ts +3 -0
  44. package/dist/core/types.d.ts.map +1 -1
  45. package/dist/hooks/useKeycloakAuthScreen.d.ts +1 -1
  46. package/dist/hooks/useKeycloakAuthScreen.d.ts.map +1 -1
  47. package/dist/hooks/useKeycloakAuthScreen.js +5 -3
  48. package/dist/hooks/useKeycloakAuthScreen.js.map +1 -1
  49. package/dist/index.d.ts +3 -2
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +1 -1
  52. package/dist/index.js.map +1 -1
  53. package/dist/screens/AuthPage/AuthPage.d.ts +2 -1
  54. package/dist/screens/AuthPage/AuthPage.d.ts.map +1 -1
  55. package/dist/screens/AuthPage/AuthPage.js +29 -9
  56. package/dist/screens/AuthPage/AuthPage.js.map +1 -1
  57. package/dist/screens/ConfirmAuthPage/ConfirmAuthPage.d.ts +4 -0
  58. package/dist/screens/ConfirmAuthPage/ConfirmAuthPage.d.ts.map +1 -1
  59. package/dist/screens/ConfirmAuthPage/ConfirmAuthPage.js +119 -19
  60. package/dist/screens/ConfirmAuthPage/ConfirmAuthPage.js.map +1 -1
  61. package/dist/storage/credentialStorage.d.ts +2 -0
  62. package/dist/storage/credentialStorage.d.ts.map +1 -1
  63. package/dist/storage/credentialStorage.js +55 -0
  64. package/dist/storage/credentialStorage.js.map +1 -1
  65. package/dist/storage/index.d.ts +1 -0
  66. package/dist/storage/index.d.ts.map +1 -1
  67. package/dist/storage/index.js +1 -0
  68. package/dist/storage/index.js.map +1 -1
  69. package/dist/storage/installStorage.d.ts +3 -0
  70. package/dist/storage/installStorage.d.ts.map +1 -0
  71. package/dist/storage/installStorage.js +91 -0
  72. package/dist/storage/installStorage.js.map +1 -0
  73. package/dist/storage/tokenStorage.d.ts.map +1 -1
  74. package/dist/storage/tokenStorage.js.map +1 -1
  75. package/dist/ui/LogoutConfirmSheet/LogoutConfirmSheet.d.ts.map +1 -1
  76. package/dist/ui/LogoutConfirmSheet/LogoutConfirmSheet.js +6 -5
  77. package/dist/ui/LogoutConfirmSheet/LogoutConfirmSheet.js.map +1 -1
  78. package/dist/ui/NumberPad/NumberPad.d.ts +1 -0
  79. package/dist/ui/NumberPad/NumberPad.d.ts.map +1 -1
  80. package/dist/ui/NumberPad/NumberPad.js +12 -6
  81. package/dist/ui/NumberPad/NumberPad.js.map +1 -1
  82. package/dist/ui/PINConfirm/PINConfirm.d.ts +2 -1
  83. package/dist/ui/PINConfirm/PINConfirm.d.ts.map +1 -1
  84. package/dist/ui/PINConfirm/PINConfirm.js +85 -23
  85. package/dist/ui/PINConfirm/PINConfirm.js.map +1 -1
  86. package/dist/ui/PINIndicator/PINIndicator.d.ts +1 -0
  87. package/dist/ui/PINIndicator/PINIndicator.d.ts.map +1 -1
  88. package/dist/ui/PINIndicator/PINIndicator.js +52 -13
  89. package/dist/ui/PINIndicator/PINIndicator.js.map +1 -1
  90. package/dist/ui/PINSetup/PINSetup.d.ts.map +1 -1
  91. package/dist/ui/PINSetup/PINSetup.js +4 -2
  92. package/dist/ui/PINSetup/PINSetup.js.map +1 -1
  93. package/dist/ui/PINSetup/stages/BiometryStage.d.ts.map +1 -1
  94. package/dist/ui/PINSetup/stages/BiometryStage.js +1 -1
  95. package/dist/ui/PINSetup/stages/BiometryStage.js.map +1 -1
  96. package/dist/ui/SuccessAuthAnimation/SuccessAuthAnimation.d.ts +11 -0
  97. package/dist/ui/SuccessAuthAnimation/SuccessAuthAnimation.d.ts.map +1 -0
  98. package/dist/ui/SuccessAuthAnimation/SuccessAuthAnimation.js +86 -0
  99. package/dist/ui/SuccessAuthAnimation/SuccessAuthAnimation.js.map +1 -0
  100. package/dist/ui/SuccessAuthAnimation/index.d.ts +2 -0
  101. package/dist/ui/SuccessAuthAnimation/index.d.ts.map +1 -0
  102. package/dist/ui/SuccessAuthAnimation/index.js +2 -0
  103. package/dist/ui/SuccessAuthAnimation/index.js.map +1 -0
  104. package/dist/ui/WebViewLogin/WebViewLogin.d.ts.map +1 -1
  105. package/dist/ui/WebViewLogin/WebViewLogin.js +117 -10
  106. package/dist/ui/WebViewLogin/WebViewLogin.js.map +1 -1
  107. package/dist/ui/WebViewLogout/WebViewLogout.js +4 -4
  108. package/dist/ui/WebViewLogout/WebViewLogout.js.map +1 -1
  109. package/dist/ui/index.d.ts +1 -0
  110. package/dist/ui/index.d.ts.map +1 -1
  111. package/dist/ui/index.js +1 -0
  112. package/dist/ui/index.js.map +1 -1
  113. package/dist/widgets/ReauthBottomSheet/ReauthBottomSheet.d.ts +4 -0
  114. package/dist/widgets/ReauthBottomSheet/ReauthBottomSheet.d.ts.map +1 -1
  115. package/dist/widgets/ReauthBottomSheet/ReauthBottomSheet.js +39 -7
  116. package/dist/widgets/ReauthBottomSheet/ReauthBottomSheet.js.map +1 -1
  117. package/package.json +7 -3
package/README.md CHANGED
@@ -101,10 +101,16 @@ const LoginScreen = () => (
101
101
  | `onTokens` | (tokens: KeycloakTokens) => void | нет | Вызывается при изменении токенов (логин, refresh, logout) |
102
102
  | `offlineAccessEnabled` | boolean | нет | Запрашивать `offline_access` в login URL; по умолчанию `true` |
103
103
  | `backgroundReauth` | `{ enabled?: boolean; thresholdMs?: number; internalNetworkMode?: 'ip-host-is-internal' }` | нет | Настройки PIN/биометрии после возврата из background; по умолчанию `enabled: true`, `thresholdMs: 60000` |
104
+ | `clientSecret` | string | нет | Секрет confidential client для legacy-конфигураций; для новых мобильных flows предпочтителен public client + PKCE |
105
+ | `getClientSecret` | () => string \| undefined \| Promise<string \| undefined> | нет | Ленивый резолвер секрета; имеет приоритет над `clientSecret` |
106
+ | `initRecoveryStrategy` | `'none' \| 'clear-tokens-and-retry'` | нет | Что делать, если init со stored tokens упал; по умолчанию `none` |
107
+ | `deferStoredTokensUntilRefresh` | boolean | нет | Не передавать persisted tokens в `keycloak.init()` до локального PIN/биометрии; по умолчанию `false` |
104
108
  | `autoRefreshToken` | boolean | нет | По умолчанию `true` |
105
109
  | `autoRefreshTokenMinValidity` | number | нет | За сколько секунд до истечения вызывать refresh; по умолчанию `5` |
106
110
  | `onReauthRequired` | () => void | нет | Вызывается при ошибке обновления токена (например показать экран реавторизации) |
107
111
 
112
+ `deferStoredTokensUntilRefresh` полезен для mobile unlock flow: приложение может сначала показать PIN/биометрию, а уже после успешного локального подтверждения выполнить refresh через сохранённый offline token. Это предотвращает преждевременный расход refresh/offline token при старте приложения.
113
+
108
114
  ### KeycloakTheme
109
115
 
110
116
  Все поля опциональны; недостающие подставляются из дефолтной темы. Передаётся в KeycloakProvider как `theme`.
@@ -157,6 +163,7 @@ const LoginScreen = () => (
157
163
  | `pinLength` | number | 4 | Длина PIN |
158
164
  | `allowBiometry`, `autoShowBiometry` | boolean | true | Биометрия |
159
165
  | `title`, `description` | string | — | Заголовок и описание блока PIN |
166
+ | `layout` | `'screen' \| 'sheet'` | `"screen"` | Компактная раскладка `sheet` для встраивания в BottomSheet |
160
167
  | `style` | ViewStyle | — | Стиль контейнера |
161
168
 
162
169
  ### Виджеты
@@ -173,7 +180,7 @@ BottomSheet с подтверждением PIN для реавторизаци
173
180
  | `pinLength` | number | 4 | Длина PIN |
174
181
  | `allowBiometry`, `autoShowBiometry` | boolean | true | Биометрия |
175
182
  | `mode` | `'login' \| 'unlock' \| 'reauth'` | авто | Если не передан, `background` открывается как `unlock`, остальные причины как `reauth` |
176
- | `title` | string | "Подтвердите вход" | Заголовок |
183
+ | `title` | string | "Введите PIN" | Заголовок |
177
184
  | `description` | string | "Введите PIN-код" | Описание |
178
185
 
179
186
  ### Кнопки выхода
@@ -4,4 +4,5 @@ export { getInjectedJSForLogout } from './getInjectedJSForLogout';
4
4
  export { AUTH_STAGE, type AuthStage } from './types';
5
5
  export { CONFIRM_AUTH_PHASE, type ConfirmAuthPhase } from './types';
6
6
  export { SETUP_STAGE, type SetupStage } from './types';
7
+ export type { SuccessFeedbackConfig } from './types';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/_lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAC,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAC,sBAAsB,EAAC,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAC,UAAU,EAAE,KAAK,SAAS,EAAC,MAAM,SAAS,CAAC;AACnD,OAAO,EAAC,kBAAkB,EAAE,KAAK,gBAAgB,EAAC,MAAM,SAAS,CAAC;AAClE,OAAO,EAAC,WAAW,EAAE,KAAK,UAAU,EAAC,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/_lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAC,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAC,sBAAsB,EAAC,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAC,UAAU,EAAE,KAAK,SAAS,EAAC,MAAM,SAAS,CAAC;AACnD,OAAO,EAAC,kBAAkB,EAAE,KAAK,gBAAgB,EAAC,MAAM,SAAS,CAAC;AAClE,OAAO,EAAC,WAAW,EAAE,KAAK,UAAU,EAAC,MAAM,SAAS,CAAC;AACrD,YAAY,EAAC,qBAAqB,EAAC,MAAM,SAAS,CAAC"}
@@ -2,6 +2,7 @@ export declare const AUTH_STAGE: {
2
2
  readonly LOGIN: "LOGIN";
3
3
  readonly SETUP_PIN: "SETUP_PIN";
4
4
  readonly PROCESSING: "PROCESSING";
5
+ readonly SUCCESS: "SUCCESS";
5
6
  };
6
7
  export type AuthStage = (typeof AUTH_STAGE)[keyof typeof AUTH_STAGE];
7
8
  //# sourceMappingURL=authStage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"authStage.d.ts","sourceRoot":"","sources":["../../../src/_lib/types/authStage.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,UAAU;;;;CAIb,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC"}
1
+ {"version":3,"file":"authStage.d.ts","sourceRoot":"","sources":["../../../src/_lib/types/authStage.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,UAAU;;;;;CAKb,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC"}
@@ -2,5 +2,6 @@ export const AUTH_STAGE = {
2
2
  LOGIN: 'LOGIN',
3
3
  SETUP_PIN: 'SETUP_PIN',
4
4
  PROCESSING: 'PROCESSING',
5
+ SUCCESS: 'SUCCESS',
5
6
  };
6
7
  //# sourceMappingURL=authStage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"authStage.js","sourceRoot":"","sources":["../../../src/_lib/types/authStage.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,UAAU,EAAE,YAAY;CAChB,CAAC"}
1
+ {"version":3,"file":"authStage.js","sourceRoot":"","sources":["../../../src/_lib/types/authStage.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,SAAS;CACV,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export declare const CONFIRM_AUTH_PHASE: {
2
2
  readonly PIN: "pin";
3
3
  readonly WEBVIEW_LOGIN: "webview_login";
4
+ readonly SUCCESS: "success";
4
5
  };
5
6
  export type ConfirmAuthPhase = (typeof CONFIRM_AUTH_PHASE)[keyof typeof CONFIRM_AUTH_PHASE];
6
7
  //# sourceMappingURL=confirmAuthPhase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"confirmAuthPhase.d.ts","sourceRoot":"","sources":["../../../src/_lib/types/confirmAuthPhase.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB;;;CAGrB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAC"}
1
+ {"version":3,"file":"confirmAuthPhase.d.ts","sourceRoot":"","sources":["../../../src/_lib/types/confirmAuthPhase.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB;;;;CAIrB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAC"}
@@ -1,5 +1,6 @@
1
1
  export const CONFIRM_AUTH_PHASE = {
2
2
  PIN: 'pin',
3
3
  WEBVIEW_LOGIN: 'webview_login',
4
+ SUCCESS: 'success',
4
5
  };
5
6
  //# sourceMappingURL=confirmAuthPhase.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"confirmAuthPhase.js","sourceRoot":"","sources":["../../../src/_lib/types/confirmAuthPhase.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,GAAG,EAAE,KAAK;IACV,aAAa,EAAE,eAAe;CACtB,CAAC"}
1
+ {"version":3,"file":"confirmAuthPhase.js","sourceRoot":"","sources":["../../../src/_lib/types/confirmAuthPhase.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,GAAG,EAAE,KAAK;IACV,aAAa,EAAE,eAAe;IAC9B,OAAO,EAAE,SAAS;CACV,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { AUTH_STAGE, type AuthStage } from './authStage';
2
2
  export { CONFIRM_AUTH_PHASE, type ConfirmAuthPhase } from './confirmAuthPhase';
3
3
  export { SETUP_STAGE, type SetupStage } from './pinSetupStage';
4
+ export type { SuccessFeedbackConfig } from './successFeedback';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_lib/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,KAAK,SAAS,EAAC,MAAM,aAAa,CAAC;AACvD,OAAO,EAAC,kBAAkB,EAAE,KAAK,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAC,WAAW,EAAE,KAAK,UAAU,EAAC,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_lib/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,KAAK,SAAS,EAAC,MAAM,aAAa,CAAC;AACvD,OAAO,EAAC,kBAAkB,EAAE,KAAK,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAC,WAAW,EAAE,KAAK,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAC7D,YAAY,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface SuccessFeedbackConfig {
2
+ enabled?: boolean;
3
+ title?: string;
4
+ durationMs?: number;
5
+ }
6
+ //# sourceMappingURL=successFeedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"successFeedback.d.ts","sourceRoot":"","sources":["../../../src/_lib/types/successFeedback.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,qBAAqB;IAKpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAMlB,KAAK,CAAC,EAAE,MAAM,CAAC;IAMf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=successFeedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"successFeedback.js","sourceRoot":"","sources":["../../../src/_lib/types/successFeedback.ts"],"names":[],"mappings":""}
@@ -19,7 +19,7 @@ export class KeycloakTokenProvider {
19
19
  }
20
20
  async refreshToken() {
21
21
  try {
22
- const updated = await this.keycloakClient.updateToken(-1);
22
+ const updated = await this.keycloakClient.updateToken(60);
23
23
  const { token, refreshToken, idToken } = this.keycloakClient;
24
24
  if (token) {
25
25
  if (!updated) {
@@ -1 +1 @@
1
- {"version":3,"file":"KeycloakTokenProvider.js","sourceRoot":"","sources":["../../../src/axios/adapters/KeycloakTokenProvider.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AAuBxD,MAAM,OAAO,qBAAqB;IAGhC,YAAY,cAAyC;QACnD,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAMD,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC;YAEH,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC;YACf,CAAC;YAGD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC;YAC9C,OAAO,MAAM,EAAE,WAAW,IAAI,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IASD,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAG1D,MAAM,EAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAC,GAAG,IAAI,CAAC,cAAc,CAAC;YAC3D,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,KAAK,CAAC;gBACf,CAAC;gBAED,MAAM,YAAY,CAAC,UAAU,CAAC;oBAC5B,WAAW,EAAE,KAAK;oBAClB,YAAY,EAAE,YAAY,IAAI,SAAS;oBACvC,OAAO,EAAE,OAAO,IAAI,SAAS;iBAC9B,CAAC,CAAC;gBACH,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAKD,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC;YAEH,IAAI,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;gBACrC,OAAO,IAAI,CAAC;YACd,CAAC;YAGD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC;YAC9C,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,YAAY,IAAI,MAAM,EAAE,YAAY,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;YACzE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CAOF"}
1
+ {"version":3,"file":"KeycloakTokenProvider.js","sourceRoot":"","sources":["../../../src/axios/adapters/KeycloakTokenProvider.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AAuBxD,MAAM,OAAO,qBAAqB;IAGhC,YAAY,cAAyC;QACnD,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAMD,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC;YAEH,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC;YACf,CAAC;YAGD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC;YAC9C,OAAO,MAAM,EAAE,WAAW,IAAI,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IASD,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAG1D,MAAM,EAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAC,GAAG,IAAI,CAAC,cAAc,CAAC;YAC3D,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,KAAK,CAAC;gBACf,CAAC;gBAED,MAAM,YAAY,CAAC,UAAU,CAAC;oBAC5B,WAAW,EAAE,KAAK;oBAClB,YAAY,EAAE,YAAY,IAAI,SAAS;oBACvC,OAAO,EAAE,OAAO,IAAI,SAAS;iBAC9B,CAAC,CAAC;gBACH,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAKD,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC;YAEH,IAAI,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;gBACrC,OAAO,IAAI,CAAC;YACd,CAAC;YAGD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC;YAC9C,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,YAAY,IAAI,MAAM,EAAE,YAAY,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;YACzE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CAOF"}
@@ -2,11 +2,13 @@ import React, { type ReactNode } from 'react';
2
2
  import type { BackgroundReauthConfig, InitRecoveryStrategy, KeycloakConfig, KeycloakConfigWith2FA } from '../core';
3
3
  interface KeycloakConfigContextValue {
4
4
  config: KeycloakConfig;
5
+ isConfigReady: boolean;
5
6
  offlineAccessEnabled: boolean;
6
7
  backgroundReauth: BackgroundReauthConfig;
7
8
  clientSecret?: string;
8
9
  getClientSecret?: () => string | undefined | Promise<string | undefined>;
9
10
  initRecoveryStrategy: InitRecoveryStrategy;
11
+ deferStoredTokensUntilRefresh: boolean;
10
12
  refreshPinCheck: () => Promise<void>;
11
13
  }
12
14
  export interface KeycloakConfigProviderProps {
@@ -17,10 +19,11 @@ export interface KeycloakConfigProviderProps {
17
19
  clientSecret?: string;
18
20
  getClientSecret?: () => string | undefined | Promise<string | undefined>;
19
21
  initRecoveryStrategy?: InitRecoveryStrategy;
22
+ deferStoredTokensUntilRefresh?: boolean;
20
23
  }
21
24
  export declare const KeycloakConfigProvider: React.NamedExoticComponent<KeycloakConfigProviderProps>;
22
25
  export declare const useKeycloakConfig: () => KeycloakConfig;
23
- export declare const useKeycloakSessionOptions: () => Pick<KeycloakConfigContextValue, "offlineAccessEnabled" | "backgroundReauth" | "clientSecret" | "getClientSecret" | "initRecoveryStrategy">;
26
+ export declare const useKeycloakSessionOptions: () => Pick<KeycloakConfigContextValue, "offlineAccessEnabled" | "isConfigReady" | "backgroundReauth" | "clientSecret" | "getClientSecret" | "initRecoveryStrategy" | "deferStoredTokensUntilRefresh">;
24
27
  export declare const useKeycloakConfigRefresh: () => (() => Promise<void>);
25
28
  export {};
26
29
  //# sourceMappingURL=KeycloakConfigContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"KeycloakConfigContext.d.ts","sourceRoot":"","sources":["../../src/context/KeycloakConfigContext.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,EAEZ,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EACV,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,EACd,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAGjB,UAAU,0BAA0B;IAClC,MAAM,EAAE,cAAc,CAAC;IACvB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,EAAE,sBAAsB,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACzE,oBAAoB,EAAE,oBAAoB,CAAC;IAE3C,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAID,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,SAAS,CAAC;IAEpB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACzE,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAiBD,eAAO,MAAM,sBAAsB,yDAoElC,CAAC;AASF,eAAO,MAAM,iBAAiB,QAAO,cAQpC,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAO,IAAI,CAC/C,0BAA0B,EACxB,sBAAsB,GACtB,kBAAkB,GAClB,cAAc,GACd,iBAAiB,GACjB,sBAAsB,CAezB,CAAC;AAKF,eAAO,MAAM,wBAAwB,QAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAM/D,CAAC"}
1
+ {"version":3,"file":"KeycloakConfigContext.d.ts","sourceRoot":"","sources":["../../src/context/KeycloakConfigContext.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,EAEZ,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EACV,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,EACd,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAGjB,UAAU,0BAA0B;IAClC,MAAM,EAAE,cAAc,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,EAAE,sBAAsB,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACzE,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,6BAA6B,EAAE,OAAO,CAAC;IAEvC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAID,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,SAAS,CAAC;IAEpB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACzE,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,6BAA6B,CAAC,EAAE,OAAO,CAAC;CACzC;AAiBD,eAAO,MAAM,sBAAsB,yDAuFlC,CAAC;AASF,eAAO,MAAM,iBAAiB,QAAO,cAQpC,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAO,IAAI,CAC/C,0BAA0B,EACxB,sBAAsB,GACtB,eAAe,GACf,kBAAkB,GAClB,cAAc,GACd,iBAAiB,GACjB,sBAAsB,GACtB,+BAA+B,CAiBlC,CAAC;AAKF,eAAO,MAAM,wBAAwB,QAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAM/D,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import React, { createContext, useCallback, useContext, useEffect, useMemo, useState, } from 'react';
2
- import { credentialStorage } from '../storage';
2
+ import { credentialStorage, ensureFreshInstallStorage } from '../storage';
3
3
  const KeycloakConfigContext = createContext(null);
4
4
  function getEffectiveConfig(config, pinSet) {
5
5
  const use2faClient = config.clientId2fa != null && (pinSet === false || pinSet === null);
@@ -11,15 +11,26 @@ function getEffectiveConfig(config, pinSet) {
11
11
  ...(config.oidcProvider != null && { oidcProvider: config.oidcProvider }),
12
12
  };
13
13
  }
14
- export const KeycloakConfigProvider = React.memo(({ children, config, offlineAccessEnabled, backgroundReauth, clientSecret, getClientSecret, initRecoveryStrategy, }) => {
14
+ export const KeycloakConfigProvider = React.memo(({ children, config, offlineAccessEnabled, backgroundReauth, clientSecret, getClientSecret, initRecoveryStrategy, deferStoredTokensUntilRefresh, }) => {
15
15
  const [pinSet, setPinSet] = useState(null);
16
16
  useEffect(() => {
17
17
  let mounted = true;
18
- credentialStorage.hasPIN().then(hasPin => {
19
- if (mounted) {
20
- setPinSet(hasPin);
18
+ const prepareConfig = async () => {
19
+ try {
20
+ await ensureFreshInstallStorage();
21
+ const hasPin = await credentialStorage.hasPIN();
22
+ if (mounted) {
23
+ setPinSet(hasPin);
24
+ }
21
25
  }
22
- });
26
+ catch (error) {
27
+ console.error('[KeycloakConfigProvider] PIN check error:', error);
28
+ if (mounted) {
29
+ setPinSet(false);
30
+ }
31
+ }
32
+ };
33
+ prepareConfig();
23
34
  return () => {
24
35
  mounted = false;
25
36
  };
@@ -33,22 +44,27 @@ export const KeycloakConfigProvider = React.memo(({ children, config, offlineAcc
33
44
  const resolvedClientSecret = clientSecret ?? config.clientSecret;
34
45
  const resolvedGetClientSecret = getClientSecret ?? config.getClientSecret;
35
46
  const resolvedInitRecoveryStrategy = initRecoveryStrategy ?? 'none';
47
+ const resolvedDeferStoredTokensUntilRefresh = deferStoredTokensUntilRefresh ?? false;
36
48
  const resolvedBackgroundReauth = useMemo(() => backgroundReauth ?? config.backgroundReauth ?? {}, [backgroundReauth, config.backgroundReauth]);
37
49
  const value = useMemo(() => ({
38
50
  config: effectiveConfig,
51
+ isConfigReady: pinSet !== null,
39
52
  offlineAccessEnabled: resolvedOfflineAccessEnabled,
40
53
  backgroundReauth: resolvedBackgroundReauth,
41
54
  clientSecret: resolvedClientSecret,
42
55
  getClientSecret: resolvedGetClientSecret,
43
56
  initRecoveryStrategy: resolvedInitRecoveryStrategy,
57
+ deferStoredTokensUntilRefresh: resolvedDeferStoredTokensUntilRefresh,
44
58
  refreshPinCheck,
45
59
  }), [
46
60
  effectiveConfig,
61
+ pinSet,
47
62
  resolvedOfflineAccessEnabled,
48
63
  resolvedBackgroundReauth,
49
64
  resolvedClientSecret,
50
65
  resolvedGetClientSecret,
51
66
  resolvedInitRecoveryStrategy,
67
+ resolvedDeferStoredTokensUntilRefresh,
52
68
  refreshPinCheck,
53
69
  ]);
54
70
  return (<KeycloakConfigContext.Provider value={value}>{children}</KeycloakConfigContext.Provider>);
@@ -68,10 +84,12 @@ export const useKeycloakSessionOptions = () => {
68
84
  }
69
85
  return {
70
86
  offlineAccessEnabled: context.offlineAccessEnabled,
87
+ isConfigReady: context.isConfigReady,
71
88
  backgroundReauth: context.backgroundReauth,
72
89
  clientSecret: context.clientSecret,
73
90
  getClientSecret: context.getClientSecret,
74
91
  initRecoveryStrategy: context.initRecoveryStrategy,
92
+ deferStoredTokensUntilRefresh: context.deferStoredTokensUntilRefresh,
75
93
  };
76
94
  };
77
95
  export const useKeycloakConfigRefresh = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"KeycloakConfigContext.js","sourceRoot":"","sources":["../../src/context/KeycloakConfigContext.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"KeycloakConfigContext.js","sourceRoot":"","sources":["../../src/context/KeycloakConfigContext.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"KeycloakInstanceContext.d.ts","sourceRoot":"","sources":["../../src/context/KeycloakInstanceContext.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,EAEZ,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AAGf,OAAO,yBAAyB,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,SAAS,CAAC;AAMnD,UAAU,4BAA4B;IACpC,QAAQ,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC3C,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IAEpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IAEpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAErC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAE9B,UAAU,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;CAC9C;AAID,eAAO,MAAM,wBAAwB,2DA2LpC,CAAC;AAQF,eAAO,MAAM,mBAAmB,QAAO,4BAQtC,CAAC"}
1
+ {"version":3,"file":"KeycloakInstanceContext.d.ts","sourceRoot":"","sources":["../../src/context/KeycloakInstanceContext.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,EAEZ,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AAGf,OAAO,yBAAyB,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,SAAS,CAAC;AAMnD,UAAU,4BAA4B;IACpC,QAAQ,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC3C,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IAEpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IAEpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAErC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAE9B,UAAU,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;CAC9C;AAGD,eAAO,MAAM,wBAAwB,2DAuPpC,CAAC;AAQF,eAAO,MAAM,mBAAmB,QAAO,4BAQtC,CAAC"}
@@ -6,7 +6,7 @@ import { tokenStorage } from '../storage';
6
6
  import { useKeycloakConfig, useKeycloakSessionOptions } from './KeycloakConfigContext';
7
7
  import { reauthRequiredRef } from './reauthRequiredRef';
8
8
  const KeycloakInstanceContext = createContext(null);
9
- const MIN_VALIDITY_ON_APP_RESUME = -1;
9
+ const MIN_VALIDITY_ON_APP_RESUME = 60;
10
10
  export const KeycloakInstanceProvider = React.memo(({ children, redirectUri, autoRefreshToken = true, autoRefreshTokenMinValidity = 5, onReauthRequired, initOnLoad, }) => {
11
11
  const config = useKeycloakConfig();
12
12
  const [keycloak, setKeycloak] = useState(null);
@@ -16,16 +16,29 @@ export const KeycloakInstanceProvider = React.memo(({ children, redirectUri, aut
16
16
  const [tokenVersion, setTokenVersion] = useState(0);
17
17
  const appStateRef = useRef(AppState.currentState);
18
18
  const backgroundedAtRef = useRef(null);
19
- const { backgroundReauth, clientSecret, getClientSecret, initRecoveryStrategy, } = useKeycloakSessionOptions();
19
+ const hasStoredSessionRef = useRef(false);
20
+ const { backgroundReauth, clientSecret, deferStoredTokensUntilRefresh, getClientSecret, initRecoveryStrategy, isConfigReady, } = useKeycloakSessionOptions();
20
21
  const resolvedBackgroundReauth = useMemo(() => resolveBackgroundReauthConfig(backgroundReauth), [backgroundReauth]);
21
22
  useEffect(() => {
23
+ if (!isConfigReady) {
24
+ setIsLoading(true);
25
+ setIsInitialized(false);
26
+ return undefined;
27
+ }
22
28
  let mounted = true;
23
29
  const buildInitOptions = async () => {
24
30
  const { accessToken = undefined, token = undefined, idToken = undefined, offlineToken = undefined, refreshToken = undefined, } = await tokenStorage.getTokens();
31
+ const storedAccessToken = accessToken ?? token;
32
+ const storedRefreshToken = offlineToken ?? refreshToken;
33
+ hasStoredSessionRef.current = Boolean(storedAccessToken && storedRefreshToken);
25
34
  return {
26
- token: accessToken ?? token,
27
- refreshToken: offlineToken ?? refreshToken,
28
- idToken,
35
+ ...(deferStoredTokensUntilRefresh
36
+ ? {}
37
+ : {
38
+ token: storedAccessToken,
39
+ refreshToken: storedRefreshToken,
40
+ idToken,
41
+ }),
29
42
  ...(initOnLoad != null && { onLoad: initOnLoad }),
30
43
  flow: 'standard',
31
44
  pkceMethod: 'S256',
@@ -81,13 +94,34 @@ export const KeycloakInstanceProvider = React.memo(({ children, redirectUri, aut
81
94
  return () => {
82
95
  mounted = false;
83
96
  };
84
- }, [clientSecret, config, getClientSecret, initOnLoad, initRecoveryStrategy, redirectUri]);
97
+ }, [
98
+ clientSecret,
99
+ config,
100
+ deferStoredTokensUntilRefresh,
101
+ getClientSecret,
102
+ initOnLoad,
103
+ initRecoveryStrategy,
104
+ isConfigReady,
105
+ redirectUri,
106
+ ]);
85
107
  useEffect(() => {
86
108
  if (!keycloak || autoRefreshToken === false)
87
109
  return;
88
110
  const minValidity = autoRefreshTokenMinValidity ?? 5;
89
111
  keycloak.onTokenExpired = () => {
90
- keycloak.updateToken(minValidity).catch(err => {
112
+ keycloak
113
+ .updateToken(minValidity)
114
+ .then(async (refreshed) => {
115
+ if (refreshed) {
116
+ await tokenStorage.saveTokens({
117
+ accessToken: keycloak.token,
118
+ offlineToken: keycloak.refreshToken,
119
+ idToken: keycloak.idToken,
120
+ });
121
+ setTokenVersion(v => v + 1);
122
+ }
123
+ })
124
+ .catch(err => {
91
125
  const message = err === true
92
126
  ? 'Token refresh failed (session expired or refresh token invalid)'
93
127
  : err === 'missing refreshToken'
@@ -115,6 +149,10 @@ export const KeycloakInstanceProvider = React.memo(({ children, redirectUri, aut
115
149
  if (prev.match(/inactive|background/) && nextAppState === 'active') {
116
150
  const backgroundedAt = backgroundedAtRef.current;
117
151
  backgroundedAtRef.current = null;
152
+ const hasKeycloakSession = keycloak?.authenticated ||
153
+ (deferStoredTokensUntilRefresh && hasStoredSessionRef.current);
154
+ if (!hasKeycloakSession)
155
+ return;
118
156
  if (shouldShowBackgroundReauth({
119
157
  enabled: resolvedBackgroundReauth.enabled,
120
158
  thresholdMs: resolvedBackgroundReauth.thresholdMs,
@@ -127,7 +165,19 @@ export const KeycloakInstanceProvider = React.memo(({ children, redirectUri, aut
127
165
  }
128
166
  if (!keycloak || !onReauthRequired || !keycloak?.authenticated)
129
167
  return;
130
- keycloak.updateToken(MIN_VALIDITY_ON_APP_RESUME).catch(err => {
168
+ keycloak
169
+ .updateToken(MIN_VALIDITY_ON_APP_RESUME)
170
+ .then(async (refreshed) => {
171
+ if (refreshed) {
172
+ await tokenStorage.saveTokens({
173
+ accessToken: keycloak.token,
174
+ offlineToken: keycloak.refreshToken,
175
+ idToken: keycloak.idToken,
176
+ });
177
+ setTokenVersion(v => v + 1);
178
+ }
179
+ })
180
+ .catch(err => {
131
181
  const message = err === true
132
182
  ? 'Token refresh failed on app resume (session expired or refresh token invalid)'
133
183
  : err instanceof Error
@@ -140,7 +190,13 @@ export const KeycloakInstanceProvider = React.memo(({ children, redirectUri, aut
140
190
  }
141
191
  });
142
192
  return () => subscription.remove();
143
- }, [config.url, keycloak, onReauthRequired, resolvedBackgroundReauth]);
193
+ }, [
194
+ config.url,
195
+ deferStoredTokensUntilRefresh,
196
+ keycloak,
197
+ onReauthRequired,
198
+ resolvedBackgroundReauth,
199
+ ]);
144
200
  const value = useMemo(() => ({
145
201
  keycloak,
146
202
  isInitialized,
@@ -1 +1 @@
1
- {"version":3,"file":"KeycloakInstanceContext.js","sourceRoot":"","sources":["../../src/context/KeycloakInstanceContext.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"KeycloakInstanceContext.js","sourceRoot":"","sources":["../../src/context/KeycloakInstanceContext.tsx"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ export interface KeycloakProviderProps {
12
12
  clientSecret?: string;
13
13
  getClientSecret?: () => string | undefined | Promise<string | undefined>;
14
14
  initRecoveryStrategy?: InitRecoveryStrategy;
15
+ deferStoredTokensUntilRefresh?: boolean;
15
16
  initOnLoad?: RNKeycloakInitOptions['onLoad'];
16
17
  autoRefreshToken?: boolean;
17
18
  autoRefreshTokenMinValidity?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"KeycloakProvider.d.ts","sourceRoot":"","sources":["../../src/context/KeycloakProvider.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,EAAC,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAE5C,OAAO,KAAK,EACV,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAIjB,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,wBAAwB,CAAC;AAI1D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IAEpB,KAAK,CAAC,EAAE,aAAa,CAAC;IAEtB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IAE5C,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAE1C,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAEzE,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAE5C,UAAU,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAE7C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAErC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAwBD,eAAO,MAAM,gBAAgB,mDAwC5B,CAAC"}
1
+ {"version":3,"file":"KeycloakProvider.d.ts","sourceRoot":"","sources":["../../src/context/KeycloakProvider.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,EAAC,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAE5C,OAAO,KAAK,EACV,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAIjB,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,wBAAwB,CAAC;AAI1D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IAEpB,KAAK,CAAC,EAAE,aAAa,CAAC;IAEtB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IAE5C,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAE1C,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAEzE,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAK5C,6BAA6B,CAAC,EAAE,OAAO,CAAC;IAExC,UAAU,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAE7C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAErC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAwBD,eAAO,MAAM,gBAAgB,mDA0C5B,CAAC"}
@@ -4,8 +4,8 @@ import { KeycloakInstanceProvider } from './KeycloakInstanceContext';
4
4
  import { KeycloakThemeProvider } from './KeycloakThemeContext';
5
5
  import { ReauthProvider } from './ReauthContext';
6
6
  import { TokenProvider } from './TokenContext';
7
- export const KeycloakProvider = React.memo(({ children, config, redirectUri, theme, onTokens, offlineAccessEnabled, backgroundReauth, clientSecret, getClientSecret, initRecoveryStrategy, initOnLoad, autoRefreshToken = true, autoRefreshTokenMinValidity = 5, onReauthRequired, }) => {
8
- return (<KeycloakConfigProvider config={config} offlineAccessEnabled={offlineAccessEnabled} backgroundReauth={backgroundReauth} clientSecret={clientSecret} getClientSecret={getClientSecret} initRecoveryStrategy={initRecoveryStrategy}>
7
+ export const KeycloakProvider = React.memo(({ children, config, redirectUri, theme, onTokens, offlineAccessEnabled, backgroundReauth, clientSecret, getClientSecret, initRecoveryStrategy, deferStoredTokensUntilRefresh, initOnLoad, autoRefreshToken = true, autoRefreshTokenMinValidity = 5, onReauthRequired, }) => {
8
+ return (<KeycloakConfigProvider config={config} offlineAccessEnabled={offlineAccessEnabled} backgroundReauth={backgroundReauth} clientSecret={clientSecret} getClientSecret={getClientSecret} deferStoredTokensUntilRefresh={deferStoredTokensUntilRefresh} initRecoveryStrategy={initRecoveryStrategy}>
9
9
  <KeycloakInstanceProvider redirectUri={redirectUri} autoRefreshToken={autoRefreshToken} autoRefreshTokenMinValidity={autoRefreshTokenMinValidity} initOnLoad={initOnLoad} onReauthRequired={onReauthRequired}>
10
10
  <KeycloakThemeProvider theme={theme}>
11
11
  <TokenProvider onTokens={onTokens}>
@@ -1 +1 @@
1
- {"version":3,"file":"KeycloakProvider.js","sourceRoot":"","sources":["../../src/context/KeycloakProvider.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAuB,MAAM,OAAO,CAAC;AAS5C,OAAO,EAAC,sBAAsB,EAAC,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAC,wBAAwB,EAAC,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAC,qBAAqB,EAAC,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAC,cAAc,EAAC,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAC,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAoD7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CACxC,CAAC,EACC,QAAQ,EACR,MAAM,EACN,WAAW,EACX,KAAK,EACL,QAAQ,EACR,oBAAoB,EACpB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,UAAU,EACV,gBAAgB,GAAG,IAAI,EACvB,2BAA2B,GAAG,CAAC,EAC/B,gBAAgB,GACjB,EAAE,EAAE;IACH,OAAO,CACL,CAAC,sBAAsB,CACrB,MAAM,CAAC,CAAC,MAAM,CAAC,CACf,oBAAoB,CAAC,CAAC,oBAAoB,CAAC,CAC3C,gBAAgB,CAAC,CAAC,gBAAgB,CAAC,CACnC,YAAY,CAAC,CAAC,YAAY,CAAC,CAC3B,eAAe,CAAC,CAAC,eAAe,CAAC,CACjC,oBAAoB,CAAC,CAAC,oBAAoB,CAAC,CAC3C;QAAA,CAAC,wBAAwB,CACvB,WAAW,CAAC,CAAC,WAAW,CAAC,CACzB,gBAAgB,CAAC,CAAC,gBAAgB,CAAC,CACnC,2BAA2B,CAAC,CAAC,2BAA2B,CAAC,CACzD,UAAU,CAAC,CAAC,UAAU,CAAC,CACvB,gBAAgB,CAAC,CAAC,gBAAgB,CAAC,CACnC;UAAA,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAClC;YAAA,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAChC;cAAA,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,EAAE,cAAc,CAC5C;YAAA,EAAE,aAAa,CACjB;UAAA,EAAE,qBAAqB,CACzB;QAAA,EAAE,wBAAwB,CAC5B;MAAA,EAAE,sBAAsB,CAAC,CAC1B,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,gBAAgB,CAAC,WAAW,GAAG,kBAAkB,CAAC"}
1
+ {"version":3,"file":"KeycloakProvider.js","sourceRoot":"","sources":["../../src/context/KeycloakProvider.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAuB,MAAM,OAAO,CAAC;AAS5C,OAAO,EAAC,sBAAsB,EAAC,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAC,wBAAwB,EAAC,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAC,qBAAqB,EAAC,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAC,cAAc,EAAC,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAC,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAyD7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CACxC,CAAC,EACC,QAAQ,EACR,MAAM,EACN,WAAW,EACX,KAAK,EACL,QAAQ,EACR,oBAAoB,EACpB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,6BAA6B,EAC7B,UAAU,EACV,gBAAgB,GAAG,IAAI,EACvB,2BAA2B,GAAG,CAAC,EAC/B,gBAAgB,GACjB,EAAE,EAAE;IACH,OAAO,CACL,CAAC,sBAAsB,CACrB,MAAM,CAAC,CAAC,MAAM,CAAC,CACf,oBAAoB,CAAC,CAAC,oBAAoB,CAAC,CAC3C,gBAAgB,CAAC,CAAC,gBAAgB,CAAC,CACnC,YAAY,CAAC,CAAC,YAAY,CAAC,CAC3B,eAAe,CAAC,CAAC,eAAe,CAAC,CACjC,6BAA6B,CAAC,CAAC,6BAA6B,CAAC,CAC7D,oBAAoB,CAAC,CAAC,oBAAoB,CAAC,CAC3C;QAAA,CAAC,wBAAwB,CACvB,WAAW,CAAC,CAAC,WAAW,CAAC,CACzB,gBAAgB,CAAC,CAAC,gBAAgB,CAAC,CACnC,2BAA2B,CAAC,CAAC,2BAA2B,CAAC,CACzD,UAAU,CAAC,CAAC,UAAU,CAAC,CACvB,gBAAgB,CAAC,CAAC,gBAAgB,CAAC,CACnC;UAAA,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAClC;YAAA,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAChC;cAAA,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,EAAE,cAAc,CAC5C;YAAA,EAAE,aAAa,CACjB;UAAA,EAAE,qBAAqB,CACzB;QAAA,EAAE,wBAAwB,CAC5B;MAAA,EAAE,sBAAsB,CAAC,CAC1B,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,gBAAgB,CAAC,WAAW,GAAG,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TokenContext.d.ts","sourceRoot":"","sources":["../../src/context/TokenContext.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,EAEZ,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,eAAe,CAAC;AAIlD,UAAU,iBAAiB;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAC;IAEpB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;CAC7C;AAED,eAAO,MAAM,aAAa,gDAsJxB,CAAC;AASH,eAAO,MAAM,QAAQ,QAAO,iBAQ3B,CAAC"}
1
+ {"version":3,"file":"TokenContext.d.ts","sourceRoot":"","sources":["../../src/context/TokenContext.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,EAEZ,KAAK,SAAS,EAOf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,eAAe,CAAC;AAQlD,UAAU,iBAAiB;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAC;IAEpB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;CAC7C;AAED,eAAO,MAAM,aAAa,gDAyKxB,CAAC;AASH,eAAO,MAAM,QAAQ,QAAO,iBAQ3B,CAAC"}
@@ -1,12 +1,13 @@
1
- import React, { createContext, useCallback, useContext, useEffect, useMemo, useState, } from 'react';
1
+ import React, { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, } from 'react';
2
2
  import { tokenStorage } from '../storage';
3
3
  import { useKeycloakInstance } from './KeycloakInstanceContext';
4
4
  const TokenContext = createContext(null);
5
5
  export const TokenProvider = React.memo(({ children, onTokens }) => {
6
- const { keycloak, isInitialized } = useKeycloakInstance();
6
+ const { keycloak, isInitialized, tokenVersion } = useKeycloakInstance();
7
7
  const [token, setToken] = useState(null);
8
8
  const [refreshToken, setRefreshToken] = useState(null);
9
9
  const [idToken, setIdToken] = useState(null);
10
+ const updateTokenPromiseRef = useRef(null);
10
11
  useEffect(() => {
11
12
  onTokens?.({
12
13
  accessToken: token,
@@ -40,28 +41,32 @@ export const TokenProvider = React.memo(({ children, onTokens }) => {
40
41
  const currentIdToken = keycloak.idToken;
41
42
  if (currentToken !== token) {
42
43
  setToken(currentToken || null);
43
- if (currentToken) {
44
- tokenStorage.saveToken(currentToken).catch(console.error);
45
- }
46
44
  }
47
45
  if (currentRefreshToken !== refreshToken) {
48
46
  setRefreshToken(currentRefreshToken || null);
49
- if (currentRefreshToken) {
50
- tokenStorage.saveRefreshToken(currentRefreshToken).catch(console.error);
51
- }
52
47
  }
53
48
  if (currentIdToken !== idToken) {
54
49
  setIdToken(currentIdToken || null);
55
- if (currentIdToken) {
56
- tokenStorage.saveIdToken(currentIdToken).catch(console.error);
57
- }
58
50
  }
59
- }, [keycloak?.token, keycloak?.refreshToken, keycloak?.idToken]);
51
+ }, [
52
+ keycloak,
53
+ keycloak?.token,
54
+ keycloak?.refreshToken,
55
+ keycloak?.idToken,
56
+ idToken,
57
+ isInitialized,
58
+ refreshToken,
59
+ token,
60
+ tokenVersion,
61
+ ]);
60
62
  const updateToken = useCallback(async (minValidity = 120) => {
63
+ if (updateTokenPromiseRef.current) {
64
+ return updateTokenPromiseRef.current;
65
+ }
61
66
  if (!keycloak || !isInitialized) {
62
67
  throw new Error('[TokenContext] Keycloak not initialized');
63
68
  }
64
- try {
69
+ const updatePromise = (async () => {
65
70
  const updated = await keycloak.updateToken(minValidity);
66
71
  if (updated && keycloak.token) {
67
72
  setToken(keycloak.token);
@@ -75,10 +80,23 @@ export const TokenProvider = React.memo(({ children, onTokens }) => {
75
80
  return keycloak.token;
76
81
  }
77
82
  return keycloak.token || token || '';
83
+ })();
84
+ updateTokenPromiseRef.current = updatePromise;
85
+ try {
86
+ return await updatePromise;
78
87
  }
79
88
  catch (error) {
80
- console.error('[TokenContext] Update token error:', error);
81
- throw error;
89
+ const refreshError = error === true
90
+ ? keycloak.__lastTokenRefreshError ??
91
+ new Error('Keycloak token refresh failed')
92
+ : error;
93
+ console.error('[TokenContext] Update token error:', refreshError);
94
+ throw refreshError;
95
+ }
96
+ finally {
97
+ if (updateTokenPromiseRef.current === updatePromise) {
98
+ updateTokenPromiseRef.current = null;
99
+ }
82
100
  }
83
101
  }, [keycloak, isInitialized, token]);
84
102
  const clearTokens = useCallback(async () => {