react-keycloak-wrapper 0.0.1-beta.7 → 0.0.1-beta.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +63 -22
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +63 -22
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -46,6 +46,7 @@ interface KeycloakContextValue {
|
|
|
46
46
|
isAuthenticated: boolean;
|
|
47
47
|
userInfo: KeycloakUser | null;
|
|
48
48
|
accessToken?: string;
|
|
49
|
+
refreshToken?: string;
|
|
49
50
|
idToken?: string;
|
|
50
51
|
error: Error | null;
|
|
51
52
|
sessionLost: boolean;
|
|
@@ -54,7 +55,8 @@ interface KeycloakContextValue {
|
|
|
54
55
|
}
|
|
55
56
|
|
|
56
57
|
interface Props {
|
|
57
|
-
|
|
58
|
+
configurationName?: string;
|
|
59
|
+
logging?: "wrapper" | "keycloak" | "both";
|
|
58
60
|
children: ReactNode;
|
|
59
61
|
config: KeycloakConfig;
|
|
60
62
|
LoadingComponent?: FC<{
|
package/dist/index.d.ts
CHANGED
|
@@ -46,6 +46,7 @@ interface KeycloakContextValue {
|
|
|
46
46
|
isAuthenticated: boolean;
|
|
47
47
|
userInfo: KeycloakUser | null;
|
|
48
48
|
accessToken?: string;
|
|
49
|
+
refreshToken?: string;
|
|
49
50
|
idToken?: string;
|
|
50
51
|
error: Error | null;
|
|
51
52
|
sessionLost: boolean;
|
|
@@ -54,7 +55,8 @@ interface KeycloakContextValue {
|
|
|
54
55
|
}
|
|
55
56
|
|
|
56
57
|
interface Props {
|
|
57
|
-
|
|
58
|
+
configurationName?: string;
|
|
59
|
+
logging?: "wrapper" | "keycloak" | "both";
|
|
58
60
|
children: ReactNode;
|
|
59
61
|
config: KeycloakConfig;
|
|
60
62
|
LoadingComponent?: FC<{
|
package/dist/index.js
CHANGED
|
@@ -59,6 +59,26 @@ var Logger = class {
|
|
|
59
59
|
}
|
|
60
60
|
};
|
|
61
61
|
|
|
62
|
+
// src/store/ConfigurationStore.ts
|
|
63
|
+
function getConfigurationKey(name, realm) {
|
|
64
|
+
return ["keycloak", realm, name].join(".");
|
|
65
|
+
}
|
|
66
|
+
var ConfigurationStore = class {
|
|
67
|
+
static setConfiguration(name, realm, config) {
|
|
68
|
+
sessionStorage.setItem(
|
|
69
|
+
getConfigurationKey(name, realm),
|
|
70
|
+
JSON.stringify(config)
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
static getConfiguration(name, realm) {
|
|
74
|
+
const config = sessionStorage.getItem(getConfigurationKey(name, realm));
|
|
75
|
+
return config ? JSON.parse(config) : {};
|
|
76
|
+
}
|
|
77
|
+
static clearConfiguration(name, realm) {
|
|
78
|
+
sessionStorage.removeItem(getConfigurationKey(name, realm));
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
|
|
62
82
|
// src/provider/keycloak-context.ts
|
|
63
83
|
var import_react = require("react");
|
|
64
84
|
|
|
@@ -78,6 +98,7 @@ function keycloakReducer(state, action) {
|
|
|
78
98
|
return {
|
|
79
99
|
...state,
|
|
80
100
|
accessToken: action.payload.accessToken,
|
|
101
|
+
refreshToken: action.payload.refreshToken,
|
|
81
102
|
idToken: action.payload.idToken,
|
|
82
103
|
isAuthenticated: action.payload.isAuthenticated ?? state.isAuthenticated
|
|
83
104
|
};
|
|
@@ -120,6 +141,7 @@ var import_jsx_runtime = require("react/jsx-runtime");
|
|
|
120
141
|
var keycloak;
|
|
121
142
|
var logger = new Logger(false);
|
|
122
143
|
var KeycloakProvider = ({
|
|
144
|
+
configurationName = "default",
|
|
123
145
|
logging,
|
|
124
146
|
children,
|
|
125
147
|
config,
|
|
@@ -127,7 +149,7 @@ var KeycloakProvider = ({
|
|
|
127
149
|
AuthenticatingErrorComponent,
|
|
128
150
|
SessionLostComponent
|
|
129
151
|
}) => {
|
|
130
|
-
logger.setEnabled(logging ??
|
|
152
|
+
logger.setEnabled(["wrapper", "both"].includes(logging ?? ""));
|
|
131
153
|
const [state, dispatch] = (0, import_react2.useReducer)(
|
|
132
154
|
keycloakReducer,
|
|
133
155
|
initialKeycloakContextValue
|
|
@@ -145,7 +167,12 @@ var KeycloakProvider = ({
|
|
|
145
167
|
keycloak.init({
|
|
146
168
|
onLoad: "check-sso",
|
|
147
169
|
checkLoginIframe: false,
|
|
148
|
-
scope: config.scope
|
|
170
|
+
scope: config.scope,
|
|
171
|
+
enableLogging: ["keycloak", "both"].includes(logging ?? ""),
|
|
172
|
+
...ConfigurationStore.getConfiguration(
|
|
173
|
+
configurationName,
|
|
174
|
+
config.realm
|
|
175
|
+
)
|
|
149
176
|
}).catch((error) => {
|
|
150
177
|
logger.log("Failed to initialize Keycloak", { error });
|
|
151
178
|
dispatch({
|
|
@@ -165,11 +192,17 @@ var KeycloakProvider = ({
|
|
|
165
192
|
};
|
|
166
193
|
keycloak.onAuthSuccess = () => {
|
|
167
194
|
logger.log("Authentication successful");
|
|
195
|
+
ConfigurationStore.setConfiguration(configurationName, config.realm, {
|
|
196
|
+
token: keycloak?.token,
|
|
197
|
+
refreshToken: keycloak?.refreshToken,
|
|
198
|
+
idToken: keycloak?.idToken
|
|
199
|
+
});
|
|
168
200
|
dispatch({
|
|
169
201
|
type: "SET_TOKEN",
|
|
170
202
|
payload: {
|
|
171
203
|
isAuthenticated: true,
|
|
172
204
|
accessToken: keycloak?.token,
|
|
205
|
+
refreshToken: keycloak?.refreshToken,
|
|
173
206
|
idToken: keycloak?.idToken
|
|
174
207
|
}
|
|
175
208
|
});
|
|
@@ -225,11 +258,17 @@ var KeycloakProvider = ({
|
|
|
225
258
|
};
|
|
226
259
|
keycloak.onAuthRefreshSuccess = () => {
|
|
227
260
|
logger.log("Token refresh successful", keycloak?.token);
|
|
261
|
+
ConfigurationStore.setConfiguration(configurationName, config.realm, {
|
|
262
|
+
token: keycloak?.token,
|
|
263
|
+
refreshToken: keycloak?.refreshToken,
|
|
264
|
+
idToken: keycloak?.idToken
|
|
265
|
+
});
|
|
228
266
|
dispatch({
|
|
229
267
|
type: "SET_TOKEN",
|
|
230
268
|
payload: {
|
|
231
269
|
isAuthenticated: true,
|
|
232
270
|
accessToken: keycloak?.token,
|
|
271
|
+
refreshToken: keycloak?.refreshToken,
|
|
233
272
|
idToken: keycloak?.idToken
|
|
234
273
|
}
|
|
235
274
|
});
|
|
@@ -241,17 +280,14 @@ var KeycloakProvider = ({
|
|
|
241
280
|
config.scope,
|
|
242
281
|
config.tokenRefreshIntervalInSeconds,
|
|
243
282
|
config.url,
|
|
244
|
-
config.wellKnownUrlPrefix
|
|
283
|
+
config.wellKnownUrlPrefix,
|
|
284
|
+
configurationName,
|
|
285
|
+
logging
|
|
245
286
|
]);
|
|
246
287
|
(0, import_react2.useLayoutEffect)(() => {
|
|
247
288
|
initiateKeycloak();
|
|
248
289
|
}, [initiateKeycloak]);
|
|
249
290
|
(0, import_react2.useLayoutEffect)(() => {
|
|
250
|
-
logger.log("Checando redirecionamento ap\xF3s autentica\xE7\xE3o", {
|
|
251
|
-
isAuthenticated: state.isAuthenticated,
|
|
252
|
-
isLoading: state.isLoading,
|
|
253
|
-
redirectUri: config.redirectUri
|
|
254
|
-
});
|
|
255
291
|
if (!state.isLoading && state.isAuthenticated && config.redirectUri && window.location.href.startsWith(config.redirectUri)) {
|
|
256
292
|
const returnUrl = sessionStorage.getItem("keycloak_return_url") || "/";
|
|
257
293
|
if (!window.location.href.endsWith(returnUrl)) {
|
|
@@ -281,15 +317,21 @@ var KeycloakProvider = ({
|
|
|
281
317
|
},
|
|
282
318
|
[config.redirectUri]
|
|
283
319
|
);
|
|
284
|
-
const handleLogout = (0, import_react2.useCallback)(
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
320
|
+
const handleLogout = (0, import_react2.useCallback)(
|
|
321
|
+
(redirectUriAfterLogout) => {
|
|
322
|
+
dispatch({
|
|
323
|
+
type: "SET_LOADING",
|
|
324
|
+
payload: true
|
|
325
|
+
});
|
|
326
|
+
ConfigurationStore.clearConfiguration(configurationName, config.realm);
|
|
327
|
+
return keycloak?.logout({
|
|
328
|
+
redirectUri: redirectUriAfterLogout
|
|
329
|
+
}) ?? Promise.reject();
|
|
330
|
+
},
|
|
331
|
+
[config.realm, configurationName]
|
|
332
|
+
);
|
|
333
|
+
const shouldRenderError = state?.error && !state.isLoading && AuthenticatingErrorComponent;
|
|
334
|
+
const shouldRenderSessionLost = state.sessionLost && !state.isLoading && !state?.error && SessionLostComponent;
|
|
293
335
|
const shouldRenderChildren = !state.isLoading && !state.error && !state.sessionLost;
|
|
294
336
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
295
337
|
KeycloakContext.Provider,
|
|
@@ -301,9 +343,9 @@ var KeycloakProvider = ({
|
|
|
301
343
|
},
|
|
302
344
|
children: [
|
|
303
345
|
shouldRenderChildren && children,
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
346
|
+
shouldRenderSessionLost && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SessionLostComponent, {}),
|
|
347
|
+
shouldRenderError && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AuthenticatingErrorComponent, { error: state?.error }),
|
|
348
|
+
LoadingComponent && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoadingComponent, { opened: state?.isLoading })
|
|
307
349
|
]
|
|
308
350
|
}
|
|
309
351
|
);
|
|
@@ -322,7 +364,6 @@ function useKeycloak() {
|
|
|
322
364
|
}
|
|
323
365
|
|
|
324
366
|
// src/components/KeycloakSecure.tsx
|
|
325
|
-
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
326
367
|
var KeycloakSecure = ({
|
|
327
368
|
children
|
|
328
369
|
}) => {
|
|
@@ -336,7 +377,7 @@ var KeycloakSecure = ({
|
|
|
336
377
|
login();
|
|
337
378
|
return null;
|
|
338
379
|
}
|
|
339
|
-
return
|
|
380
|
+
return children;
|
|
340
381
|
};
|
|
341
382
|
|
|
342
383
|
// src/hooks/useKeycloakUser.ts
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/provider/KeycloakProvider.tsx","../src/components/Logger.ts","../src/provider/keycloak-context.ts","../src/provider/keycloak-reducer.ts","../src/hooks/useKeycloak.ts","../src/components/KeycloakSecure.tsx","../src/hooks/useKeycloakUser.ts","../src/hooks/useKeycloakToken.ts"],"sourcesContent":["export * from \"./provider/KeycloakProvider\";\nexport * from \"./components/KeycloakSecure\";\n\nexport * from \"./hooks/useKeycloak\";\nexport * from \"./hooks/useKeycloakUser\";\nexport * from \"./hooks/useKeycloakToken\";\n\nexport * from \"./types\";\n","import Keycloak from \"keycloak-js\";\nimport React, {\n FC,\n ReactNode,\n useCallback,\n useLayoutEffect,\n useReducer,\n} from \"react\";\nimport Logger from \"../components/Logger\";\nimport { KeycloakConfig, KeycloakUser } from \"../types\";\nimport { KeycloakContext } from \"./keycloak-context\";\nimport {\n initialKeycloakContextValue,\n keycloakReducer,\n} from \"./keycloak-reducer\";\n\ninterface Props {\n logging?: boolean;\n children: ReactNode;\n config: KeycloakConfig;\n LoadingComponent?: FC<{ opened: boolean }>;\n AuthenticatingErrorComponent?: FC<{\n error: Error | null;\n }>;\n SessionLostComponent?: FC;\n}\n\nlet keycloak: Keycloak | undefined;\nconst logger = new Logger(false);\nexport const KeycloakProvider: React.FC<Props> = ({\n logging,\n children,\n config,\n LoadingComponent,\n AuthenticatingErrorComponent,\n SessionLostComponent,\n}) => {\n logger.setEnabled(logging ?? false);\n\n const [state, dispatch] = useReducer(\n keycloakReducer,\n initialKeycloakContextValue,\n );\n\n const initiateKeycloak = useCallback(() => {\n if (!keycloak) {\n keycloak = new Keycloak({\n url: config.url,\n realm: config.realm,\n clientId: config.clientId,\n oidcProvider: config.wellKnownUrlPrefix,\n });\n }\n\n if (keycloak && !keycloak.didInitialize) {\n keycloak\n .init({\n onLoad: \"check-sso\",\n checkLoginIframe: false,\n scope: config.scope,\n })\n .catch((error) => {\n logger.log(\"Failed to initialize Keycloak\", { error });\n dispatch({\n type: \"SET_ERROR\",\n payload: error || null,\n });\n });\n }\n\n keycloak.onReady = (authenticated) => {\n logger.log(\"Keycloak is ready\", { authenticated });\n\n if (!authenticated) {\n dispatch({\n type: \"SET_LOADING\",\n payload: false,\n });\n }\n };\n\n keycloak.onAuthSuccess = () => {\n logger.log(\"Authentication successful\");\n\n dispatch({\n type: \"SET_TOKEN\",\n payload: {\n isAuthenticated: true,\n accessToken: keycloak?.token,\n idToken: keycloak?.idToken,\n },\n });\n\n logger.log(\"Loading user info\");\n keycloak\n ?.loadUserInfo()\n .then((userInfo) => {\n logger.log(\"User info loaded\", { userInfo });\n dispatch({\n type: \"SET_USER_INFO\",\n payload: userInfo as unknown as KeycloakUser,\n });\n })\n .finally(() => {\n dispatch({\n type: \"SET_LOADING\",\n payload: false,\n });\n });\n\n setInterval(\n () => {\n keycloak\n ?.updateToken(config.refreshSecondsBeforeTokenExpires ?? 120)\n .then((refreshed) => {\n if (!refreshed) {\n logger.log(\n \"Token is still valid, no need to refresh\",\n new Date(\n (keycloak?.tokenParsed?.exp ?? 0) * 1000,\n ).toLocaleTimeString(),\n );\n }\n });\n },\n (config.tokenRefreshIntervalInSeconds ?? 10) * 1000,\n );\n };\n\n keycloak.onAuthLogout = () => {\n logger.log(\"Session lost\");\n dispatch({\n type: \"SET_SESSION_LOST\",\n payload: true,\n });\n };\n\n keycloak.onAuthError = (error) => {\n logger.log(\"Authentication error\", { error });\n\n dispatch({\n type: \"SET_ERROR\",\n payload: error || null,\n });\n };\n\n keycloak.onAuthRefreshError = () => {\n logger.log(\"Token refresh error\");\n\n dispatch({\n type: \"SET_ERROR\",\n payload: new Error(\"Token refresh error\") || null,\n });\n };\n\n keycloak.onAuthRefreshSuccess = () => {\n logger.log(\"Token refresh successful\", keycloak?.token);\n\n dispatch({\n type: \"SET_TOKEN\",\n payload: {\n isAuthenticated: true,\n accessToken: keycloak?.token,\n idToken: keycloak?.idToken,\n },\n });\n };\n }, [\n config.clientId,\n config.realm,\n config.refreshSecondsBeforeTokenExpires,\n config.scope,\n config.tokenRefreshIntervalInSeconds,\n config.url,\n config.wellKnownUrlPrefix,\n ]);\n\n useLayoutEffect(() => {\n initiateKeycloak();\n }, [initiateKeycloak]);\n\n useLayoutEffect(() => {\n logger.log(\"Checando redirecionamento após autenticação\", {\n isAuthenticated: state.isAuthenticated,\n isLoading: state.isLoading,\n redirectUri: config.redirectUri,\n });\n\n if (\n !state.isLoading &&\n state.isAuthenticated &&\n config.redirectUri &&\n window.location.href.startsWith(config.redirectUri)\n ) {\n const returnUrl = sessionStorage.getItem(\"keycloak_return_url\") || \"/\";\n if (!window.location.href.endsWith(returnUrl)) {\n logger.log(\"Redirecionando para a URL original após autenticação\", {\n returnUrl,\n origin: window.location.origin,\n });\n\n // Redireciona para a URL original\n window.history.replaceState(\n { keycloak_redirected: true },\n \"\",\n window.location.origin + returnUrl,\n );\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n sessionStorage.removeItem(\"keycloak_return_url\");\n }\n }\n }, [config.redirectUri, state.isAuthenticated, state.isLoading]);\n\n const handleLogin = useCallback(\n (redirectUri?: string) => {\n dispatch({\n type: \"SET_LOADING\",\n payload: true,\n });\n\n return (\n keycloak?.login({\n redirectUri: redirectUri ?? config.redirectUri,\n }) ?? Promise.reject()\n );\n },\n [config.redirectUri],\n );\n\n const handleLogout = useCallback((redirectUriAfterLogout: string) => {\n dispatch({\n type: \"SET_LOADING\",\n payload: true,\n });\n\n return (\n keycloak?.logout({\n redirectUri: redirectUriAfterLogout,\n }) ?? Promise.reject()\n );\n }, []);\n\n const shouldRenderChildren =\n !state.isLoading && !state.error && !state.sessionLost;\n\n return (\n <KeycloakContext.Provider\n value={{\n ...state,\n login: handleLogin,\n logout: handleLogout,\n }}\n >\n {shouldRenderChildren && children}\n\n {LoadingComponent && <LoadingComponent opened={state?.isLoading} />}\n {AuthenticatingErrorComponent && state?.error && (\n <AuthenticatingErrorComponent error={state?.error} />\n )}\n {SessionLostComponent && state?.sessionLost && <SessionLostComponent />}\n </KeycloakContext.Provider>\n );\n};\n","export default class Logger {\n enabled: boolean = false;\n\n constructor(enabled: boolean = false) {\n this.enabled = enabled;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log(...data: any[]) {\n if (this.enabled) {\n console.log(\"[react-keycloak-wrapper]\", ...data);\n }\n }\n\n setEnabled(enabled: boolean) {\n this.enabled = enabled;\n }\n}\n","import { createContext } from \"react\";\nimport { KeycloakContextValue } from \"../types\";\nimport { initialKeycloakContextValue } from \"./keycloak-reducer\";\n\nexport const KeycloakContext = createContext<KeycloakContextValue>(\n initialKeycloakContextValue,\n);\n","import { KeycloakError } from \"keycloak-js\";\nimport { KeycloakContextValue, KeycloakUser } from \"../types\";\n\ntype GenericAction<T extends string, P = undefined> = { type: T; payload: P };\n\nexport type KeycloakAction =\n | GenericAction<\n \"SET_TOKEN\",\n { accessToken?: string; idToken?: string; isAuthenticated?: boolean }\n >\n | GenericAction<\"SET_LOADING\", boolean>\n | GenericAction<\"SET_ERROR\", Error | KeycloakError | null>\n | GenericAction<\"SET_SESSION_LOST\", boolean>\n | GenericAction<\"SET_USER_INFO\", KeycloakUser | null>;\n\nexport const initialKeycloakContextValue: KeycloakContextValue = {\n error: null,\n isAuthenticated: false,\n isLoading: true,\n sessionLost: false,\n login: () => Promise.reject(new Error(\"Not implemented\")),\n logout: () => Promise.reject(new Error(\"Not implemented\")),\n userInfo: null,\n};\n\nexport function keycloakReducer(\n state: KeycloakContextValue,\n action: KeycloakAction,\n): KeycloakContextValue {\n switch (action.type) {\n case \"SET_TOKEN\":\n return {\n ...state,\n accessToken: action.payload.accessToken,\n idToken: action.payload.idToken,\n isAuthenticated:\n action.payload.isAuthenticated ?? state.isAuthenticated,\n };\n case \"SET_LOADING\":\n return {\n ...state,\n isLoading: action.payload,\n };\n case \"SET_ERROR\":\n return {\n ...state,\n error:\n !action.payload || action.payload instanceof Error\n ? action.payload\n : new Error(\n String(\n action.payload.error || action.payload.error_description,\n ),\n ),\n };\n case \"SET_SESSION_LOST\":\n return {\n ...state,\n sessionLost: action.payload,\n };\n case \"SET_USER_INFO\":\n return {\n ...state,\n userInfo: action.payload,\n };\n\n default:\n return state;\n }\n}\n","import { useContext } from \"react\";\nimport { KeycloakContext } from \"../provider/keycloak-context\";\n\nexport function useKeycloak() {\n const ctx = useContext(KeycloakContext);\n\n return {\n login: ctx.login,\n logout: ctx.logout,\n isLoading: ctx.isLoading,\n isAuthenticated: ctx.isAuthenticated,\n };\n}\n","import React from \"react\";\nimport { useKeycloak } from \"../hooks/useKeycloak\";\n\nexport const KeycloakSecure: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n const { isAuthenticated, login, isLoading } = useKeycloak();\n\n if (isLoading) return null;\n\n if (!isAuthenticated) {\n // Salva a URL atual antes de redirecionar\n sessionStorage.setItem(\n \"keycloak_return_url\",\n window.location.pathname + window.location.search,\n );\n\n // Redireciona para o Keycloak com callback fixo\n login(); // Usa o redirectUri configurado (ex: /authorization)\n return null;\n }\n\n return <>{children}</>;\n};\n","import { useContext } from \"react\";\nimport { KeycloakContext } from \"../provider/keycloak-context\";\nimport { KeycloakUser } from \"../types\";\n\nexport function useKeycloakUser<UserInfo = KeycloakUser>() {\n const ctx = useContext(KeycloakContext);\n\n return {\n user: ctx?.userInfo as UserInfo | null,\n loading: ctx?.isLoading,\n };\n}\n","import { useContext } from \"react\";\nimport { KeycloakContext } from \"../provider/keycloak-context\";\n\nexport function useKeycloakToken() {\n const ctx = useContext(KeycloakContext);\n\n return {\n accessToken: ctx.accessToken,\n idToken: ctx.idToken,\n };\n}\n"],"mappings":"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","names":["import_react","Keycloak","import_react","import_jsx_runtime","import_react","import_react"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/provider/KeycloakProvider.tsx","../src/components/Logger.ts","../src/store/ConfigurationStore.ts","../src/provider/keycloak-context.ts","../src/provider/keycloak-reducer.ts","../src/hooks/useKeycloak.ts","../src/components/KeycloakSecure.tsx","../src/hooks/useKeycloakUser.ts","../src/hooks/useKeycloakToken.ts"],"sourcesContent":["export * from \"./provider/KeycloakProvider\";\nexport * from \"./components/KeycloakSecure\";\n\nexport * from \"./hooks/useKeycloak\";\nexport * from \"./hooks/useKeycloakUser\";\nexport * from \"./hooks/useKeycloakToken\";\n\nexport * from \"./types\";\n","import Keycloak from \"keycloak-js\";\nimport React, {\n FC,\n ReactNode,\n useCallback,\n useLayoutEffect,\n useReducer,\n} from \"react\";\nimport Logger from \"../components/Logger\";\nimport ConfigurationStore from \"../store/ConfigurationStore\";\nimport { KeycloakConfig, KeycloakUser } from \"../types\";\nimport { KeycloakContext } from \"./keycloak-context\";\nimport {\n initialKeycloakContextValue,\n keycloakReducer,\n} from \"./keycloak-reducer\";\n\ninterface Props {\n configurationName?: string;\n logging?: \"wrapper\" | \"keycloak\" | \"both\";\n children: ReactNode;\n config: KeycloakConfig;\n LoadingComponent?: FC<{ opened: boolean }>;\n AuthenticatingErrorComponent?: FC<{\n error: Error | null;\n }>;\n SessionLostComponent?: FC;\n}\n\nlet keycloak: Keycloak | undefined;\nconst logger = new Logger(false);\nexport const KeycloakProvider: React.FC<Props> = ({\n configurationName = \"default\",\n logging,\n children,\n config,\n LoadingComponent,\n AuthenticatingErrorComponent,\n SessionLostComponent,\n}) => {\n logger.setEnabled([\"wrapper\", \"both\"].includes(logging ?? \"\"));\n\n const [state, dispatch] = useReducer(\n keycloakReducer,\n initialKeycloakContextValue,\n );\n\n const initiateKeycloak = useCallback(() => {\n if (!keycloak) {\n keycloak = new Keycloak({\n url: config.url,\n realm: config.realm,\n clientId: config.clientId,\n oidcProvider: config.wellKnownUrlPrefix,\n });\n }\n\n if (keycloak && !keycloak.didInitialize) {\n keycloak\n .init({\n onLoad: \"check-sso\",\n checkLoginIframe: false,\n scope: config.scope,\n enableLogging: [\"keycloak\", \"both\"].includes(logging ?? \"\"),\n ...ConfigurationStore.getConfiguration(\n configurationName,\n config.realm,\n ),\n })\n .catch((error) => {\n logger.log(\"Failed to initialize Keycloak\", { error });\n dispatch({\n type: \"SET_ERROR\",\n payload: error || null,\n });\n });\n }\n\n keycloak.onReady = (authenticated) => {\n logger.log(\"Keycloak is ready\", { authenticated });\n\n if (!authenticated) {\n dispatch({\n type: \"SET_LOADING\",\n payload: false,\n });\n }\n };\n\n keycloak.onAuthSuccess = () => {\n logger.log(\"Authentication successful\");\n\n ConfigurationStore.setConfiguration(configurationName, config.realm, {\n token: keycloak?.token,\n refreshToken: keycloak?.refreshToken,\n idToken: keycloak?.idToken,\n });\n\n dispatch({\n type: \"SET_TOKEN\",\n payload: {\n isAuthenticated: true,\n accessToken: keycloak?.token,\n refreshToken: keycloak?.refreshToken,\n idToken: keycloak?.idToken,\n },\n });\n\n logger.log(\"Loading user info\");\n keycloak\n ?.loadUserInfo()\n .then((userInfo) => {\n logger.log(\"User info loaded\", { userInfo });\n dispatch({\n type: \"SET_USER_INFO\",\n payload: userInfo as unknown as KeycloakUser,\n });\n })\n .finally(() => {\n dispatch({\n type: \"SET_LOADING\",\n payload: false,\n });\n });\n\n setInterval(\n () => {\n keycloak\n ?.updateToken(config.refreshSecondsBeforeTokenExpires ?? 120)\n .then((refreshed) => {\n if (!refreshed) {\n logger.log(\n \"Token is still valid, no need to refresh\",\n new Date(\n (keycloak?.tokenParsed?.exp ?? 0) * 1000,\n ).toLocaleTimeString(),\n );\n }\n });\n },\n (config.tokenRefreshIntervalInSeconds ?? 10) * 1000,\n );\n };\n\n keycloak.onAuthLogout = () => {\n logger.log(\"Session lost\");\n dispatch({\n type: \"SET_SESSION_LOST\",\n payload: true,\n });\n };\n\n keycloak.onAuthError = (error) => {\n logger.log(\"Authentication error\", { error });\n\n dispatch({\n type: \"SET_ERROR\",\n payload: error || null,\n });\n };\n\n keycloak.onAuthRefreshError = () => {\n logger.log(\"Token refresh error\");\n\n dispatch({\n type: \"SET_ERROR\",\n payload: new Error(\"Token refresh error\") || null,\n });\n };\n\n keycloak.onAuthRefreshSuccess = () => {\n logger.log(\"Token refresh successful\", keycloak?.token);\n\n ConfigurationStore.setConfiguration(configurationName, config.realm, {\n token: keycloak?.token,\n refreshToken: keycloak?.refreshToken,\n idToken: keycloak?.idToken,\n });\n\n dispatch({\n type: \"SET_TOKEN\",\n payload: {\n isAuthenticated: true,\n accessToken: keycloak?.token,\n refreshToken: keycloak?.refreshToken,\n idToken: keycloak?.idToken,\n },\n });\n };\n }, [\n config.clientId,\n config.realm,\n config.refreshSecondsBeforeTokenExpires,\n config.scope,\n config.tokenRefreshIntervalInSeconds,\n config.url,\n config.wellKnownUrlPrefix,\n configurationName,\n logging,\n ]);\n\n useLayoutEffect(() => {\n initiateKeycloak();\n }, [initiateKeycloak]);\n\n useLayoutEffect(() => {\n if (\n !state.isLoading &&\n state.isAuthenticated &&\n config.redirectUri &&\n window.location.href.startsWith(config.redirectUri)\n ) {\n const returnUrl = sessionStorage.getItem(\"keycloak_return_url\") || \"/\";\n if (!window.location.href.endsWith(returnUrl)) {\n logger.log(\"Redirecionando para a URL original após autenticação\", {\n returnUrl,\n origin: window.location.origin,\n });\n\n // Redireciona para a URL original\n window.history.replaceState(\n { keycloak_redirected: true },\n \"\",\n window.location.origin + returnUrl,\n );\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n sessionStorage.removeItem(\"keycloak_return_url\");\n }\n }\n }, [config.redirectUri, state.isAuthenticated, state.isLoading]);\n\n const handleLogin = useCallback(\n (redirectUri?: string) => {\n dispatch({\n type: \"SET_LOADING\",\n payload: true,\n });\n\n return (\n keycloak?.login({\n redirectUri: redirectUri ?? config.redirectUri,\n }) ?? Promise.reject()\n );\n },\n [config.redirectUri],\n );\n\n const handleLogout = useCallback(\n (redirectUriAfterLogout: string) => {\n dispatch({\n type: \"SET_LOADING\",\n payload: true,\n });\n\n ConfigurationStore.clearConfiguration(configurationName, config.realm);\n\n return (\n keycloak?.logout({\n redirectUri: redirectUriAfterLogout,\n }) ?? Promise.reject()\n );\n },\n [config.realm, configurationName],\n );\n\n // carregando > erro > sessão perdida > children\n\n const shouldRenderError =\n state?.error && !state.isLoading && AuthenticatingErrorComponent;\n\n const shouldRenderSessionLost =\n state.sessionLost &&\n !state.isLoading &&\n !state?.error &&\n SessionLostComponent;\n\n const shouldRenderChildren =\n !state.isLoading && !state.error && !state.sessionLost;\n\n return (\n <KeycloakContext.Provider\n value={{\n ...state,\n login: handleLogin,\n logout: handleLogout,\n }}\n >\n {shouldRenderChildren && children}\n\n {shouldRenderSessionLost && <SessionLostComponent />}\n\n {shouldRenderError && (\n <AuthenticatingErrorComponent error={state?.error} />\n )}\n\n {LoadingComponent && <LoadingComponent opened={state?.isLoading} />}\n </KeycloakContext.Provider>\n );\n};\n","export default class Logger {\n enabled: boolean = false;\n\n constructor(enabled: boolean = false) {\n this.enabled = enabled;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log(...data: any[]) {\n if (this.enabled) {\n console.log(\"[react-keycloak-wrapper]\", ...data);\n }\n }\n\n setEnabled(enabled: boolean) {\n this.enabled = enabled;\n }\n}\n","type ConfigurationTokens = {\n idToken?: string;\n token?: string;\n refreshToken?: string;\n};\n\nfunction getConfigurationKey(name: string, realm: string) {\n return [\"keycloak\", realm, name].join(\".\");\n}\n\nexport default class ConfigurationStore {\n public static setConfiguration(\n name: string,\n realm: string,\n config: ConfigurationTokens,\n ): void {\n sessionStorage.setItem(\n getConfigurationKey(name, realm),\n JSON.stringify(config),\n );\n }\n\n public static getConfiguration(\n name: string,\n realm: string,\n ): ConfigurationTokens | object {\n const config = sessionStorage.getItem(getConfigurationKey(name, realm));\n return config ? (JSON.parse(config) as ConfigurationTokens) : {};\n }\n\n public static clearConfiguration(name: string, realm: string): void {\n sessionStorage.removeItem(getConfigurationKey(name, realm));\n }\n}\n","import { createContext } from \"react\";\nimport { KeycloakContextValue } from \"../types\";\nimport { initialKeycloakContextValue } from \"./keycloak-reducer\";\n\nexport const KeycloakContext = createContext<KeycloakContextValue>(\n initialKeycloakContextValue,\n);\n","import { KeycloakError } from \"keycloak-js\";\nimport { KeycloakContextValue, KeycloakUser } from \"../types\";\n\ntype GenericAction<T extends string, P = undefined> = { type: T; payload: P };\n\nexport type KeycloakAction =\n | GenericAction<\n \"SET_TOKEN\",\n {\n accessToken?: string;\n idToken?: string;\n refreshToken?: string;\n isAuthenticated?: boolean;\n }\n >\n | GenericAction<\"SET_LOADING\", boolean>\n | GenericAction<\"SET_ERROR\", Error | KeycloakError | null>\n | GenericAction<\"SET_SESSION_LOST\", boolean>\n | GenericAction<\"SET_USER_INFO\", KeycloakUser | null>;\n\nexport const initialKeycloakContextValue: KeycloakContextValue = {\n error: null,\n isAuthenticated: false,\n isLoading: true,\n sessionLost: false,\n login: () => Promise.reject(new Error(\"Not implemented\")),\n logout: () => Promise.reject(new Error(\"Not implemented\")),\n userInfo: null,\n};\n\nexport function keycloakReducer(\n state: KeycloakContextValue,\n action: KeycloakAction,\n): KeycloakContextValue {\n switch (action.type) {\n case \"SET_TOKEN\":\n return {\n ...state,\n accessToken: action.payload.accessToken,\n refreshToken: action.payload.refreshToken,\n idToken: action.payload.idToken,\n isAuthenticated:\n action.payload.isAuthenticated ?? state.isAuthenticated,\n };\n case \"SET_LOADING\":\n return {\n ...state,\n isLoading: action.payload,\n };\n case \"SET_ERROR\":\n return {\n ...state,\n error:\n !action.payload || action.payload instanceof Error\n ? action.payload\n : new Error(\n String(\n action.payload.error || action.payload.error_description,\n ),\n ),\n };\n case \"SET_SESSION_LOST\":\n return {\n ...state,\n sessionLost: action.payload,\n };\n case \"SET_USER_INFO\":\n return {\n ...state,\n userInfo: action.payload,\n };\n\n default:\n return state;\n }\n}\n","import { useContext } from \"react\";\nimport { KeycloakContext } from \"../provider/keycloak-context\";\n\nexport function useKeycloak() {\n const ctx = useContext(KeycloakContext);\n\n return {\n login: ctx.login,\n logout: ctx.logout,\n isLoading: ctx.isLoading,\n isAuthenticated: ctx.isAuthenticated,\n };\n}\n","import React from \"react\";\nimport { useKeycloak } from \"../hooks/useKeycloak\";\n\nexport const KeycloakSecure: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n const { isAuthenticated, login, isLoading } = useKeycloak();\n\n if (isLoading) return null;\n\n if (!isAuthenticated) {\n // Salva a URL atual antes de redirecionar\n sessionStorage.setItem(\n \"keycloak_return_url\",\n window.location.pathname + window.location.search,\n );\n\n // Redireciona para o Keycloak com callback fixo\n login(); // Usa o redirectUri configurado (ex: /authorization)\n return null;\n }\n\n return children;\n};\n","import { useContext } from \"react\";\nimport { KeycloakContext } from \"../provider/keycloak-context\";\nimport { KeycloakUser } from \"../types\";\n\nexport function useKeycloakUser<UserInfo = KeycloakUser>() {\n const ctx = useContext(KeycloakContext);\n\n return {\n user: ctx?.userInfo as UserInfo | null,\n loading: ctx?.isLoading,\n };\n}\n","import { useContext } from \"react\";\nimport { KeycloakContext } from \"../provider/keycloak-context\";\n\nexport function useKeycloakToken() {\n const ctx = useContext(KeycloakContext);\n\n return {\n accessToken: ctx.accessToken,\n idToken: ctx.idToken,\n };\n}\n"],"mappings":"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","names":["import_react","Keycloak","import_react","import_react","import_react"]}
|
package/dist/index.mjs
CHANGED
|
@@ -23,6 +23,26 @@ var Logger = class {
|
|
|
23
23
|
}
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
+
// src/store/ConfigurationStore.ts
|
|
27
|
+
function getConfigurationKey(name, realm) {
|
|
28
|
+
return ["keycloak", realm, name].join(".");
|
|
29
|
+
}
|
|
30
|
+
var ConfigurationStore = class {
|
|
31
|
+
static setConfiguration(name, realm, config) {
|
|
32
|
+
sessionStorage.setItem(
|
|
33
|
+
getConfigurationKey(name, realm),
|
|
34
|
+
JSON.stringify(config)
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
static getConfiguration(name, realm) {
|
|
38
|
+
const config = sessionStorage.getItem(getConfigurationKey(name, realm));
|
|
39
|
+
return config ? JSON.parse(config) : {};
|
|
40
|
+
}
|
|
41
|
+
static clearConfiguration(name, realm) {
|
|
42
|
+
sessionStorage.removeItem(getConfigurationKey(name, realm));
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
26
46
|
// src/provider/keycloak-context.ts
|
|
27
47
|
import { createContext } from "react";
|
|
28
48
|
|
|
@@ -42,6 +62,7 @@ function keycloakReducer(state, action) {
|
|
|
42
62
|
return {
|
|
43
63
|
...state,
|
|
44
64
|
accessToken: action.payload.accessToken,
|
|
65
|
+
refreshToken: action.payload.refreshToken,
|
|
45
66
|
idToken: action.payload.idToken,
|
|
46
67
|
isAuthenticated: action.payload.isAuthenticated ?? state.isAuthenticated
|
|
47
68
|
};
|
|
@@ -84,6 +105,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
84
105
|
var keycloak;
|
|
85
106
|
var logger = new Logger(false);
|
|
86
107
|
var KeycloakProvider = ({
|
|
108
|
+
configurationName = "default",
|
|
87
109
|
logging,
|
|
88
110
|
children,
|
|
89
111
|
config,
|
|
@@ -91,7 +113,7 @@ var KeycloakProvider = ({
|
|
|
91
113
|
AuthenticatingErrorComponent,
|
|
92
114
|
SessionLostComponent
|
|
93
115
|
}) => {
|
|
94
|
-
logger.setEnabled(logging ??
|
|
116
|
+
logger.setEnabled(["wrapper", "both"].includes(logging ?? ""));
|
|
95
117
|
const [state, dispatch] = useReducer(
|
|
96
118
|
keycloakReducer,
|
|
97
119
|
initialKeycloakContextValue
|
|
@@ -109,7 +131,12 @@ var KeycloakProvider = ({
|
|
|
109
131
|
keycloak.init({
|
|
110
132
|
onLoad: "check-sso",
|
|
111
133
|
checkLoginIframe: false,
|
|
112
|
-
scope: config.scope
|
|
134
|
+
scope: config.scope,
|
|
135
|
+
enableLogging: ["keycloak", "both"].includes(logging ?? ""),
|
|
136
|
+
...ConfigurationStore.getConfiguration(
|
|
137
|
+
configurationName,
|
|
138
|
+
config.realm
|
|
139
|
+
)
|
|
113
140
|
}).catch((error) => {
|
|
114
141
|
logger.log("Failed to initialize Keycloak", { error });
|
|
115
142
|
dispatch({
|
|
@@ -129,11 +156,17 @@ var KeycloakProvider = ({
|
|
|
129
156
|
};
|
|
130
157
|
keycloak.onAuthSuccess = () => {
|
|
131
158
|
logger.log("Authentication successful");
|
|
159
|
+
ConfigurationStore.setConfiguration(configurationName, config.realm, {
|
|
160
|
+
token: keycloak?.token,
|
|
161
|
+
refreshToken: keycloak?.refreshToken,
|
|
162
|
+
idToken: keycloak?.idToken
|
|
163
|
+
});
|
|
132
164
|
dispatch({
|
|
133
165
|
type: "SET_TOKEN",
|
|
134
166
|
payload: {
|
|
135
167
|
isAuthenticated: true,
|
|
136
168
|
accessToken: keycloak?.token,
|
|
169
|
+
refreshToken: keycloak?.refreshToken,
|
|
137
170
|
idToken: keycloak?.idToken
|
|
138
171
|
}
|
|
139
172
|
});
|
|
@@ -189,11 +222,17 @@ var KeycloakProvider = ({
|
|
|
189
222
|
};
|
|
190
223
|
keycloak.onAuthRefreshSuccess = () => {
|
|
191
224
|
logger.log("Token refresh successful", keycloak?.token);
|
|
225
|
+
ConfigurationStore.setConfiguration(configurationName, config.realm, {
|
|
226
|
+
token: keycloak?.token,
|
|
227
|
+
refreshToken: keycloak?.refreshToken,
|
|
228
|
+
idToken: keycloak?.idToken
|
|
229
|
+
});
|
|
192
230
|
dispatch({
|
|
193
231
|
type: "SET_TOKEN",
|
|
194
232
|
payload: {
|
|
195
233
|
isAuthenticated: true,
|
|
196
234
|
accessToken: keycloak?.token,
|
|
235
|
+
refreshToken: keycloak?.refreshToken,
|
|
197
236
|
idToken: keycloak?.idToken
|
|
198
237
|
}
|
|
199
238
|
});
|
|
@@ -205,17 +244,14 @@ var KeycloakProvider = ({
|
|
|
205
244
|
config.scope,
|
|
206
245
|
config.tokenRefreshIntervalInSeconds,
|
|
207
246
|
config.url,
|
|
208
|
-
config.wellKnownUrlPrefix
|
|
247
|
+
config.wellKnownUrlPrefix,
|
|
248
|
+
configurationName,
|
|
249
|
+
logging
|
|
209
250
|
]);
|
|
210
251
|
useLayoutEffect(() => {
|
|
211
252
|
initiateKeycloak();
|
|
212
253
|
}, [initiateKeycloak]);
|
|
213
254
|
useLayoutEffect(() => {
|
|
214
|
-
logger.log("Checando redirecionamento ap\xF3s autentica\xE7\xE3o", {
|
|
215
|
-
isAuthenticated: state.isAuthenticated,
|
|
216
|
-
isLoading: state.isLoading,
|
|
217
|
-
redirectUri: config.redirectUri
|
|
218
|
-
});
|
|
219
255
|
if (!state.isLoading && state.isAuthenticated && config.redirectUri && window.location.href.startsWith(config.redirectUri)) {
|
|
220
256
|
const returnUrl = sessionStorage.getItem("keycloak_return_url") || "/";
|
|
221
257
|
if (!window.location.href.endsWith(returnUrl)) {
|
|
@@ -245,15 +281,21 @@ var KeycloakProvider = ({
|
|
|
245
281
|
},
|
|
246
282
|
[config.redirectUri]
|
|
247
283
|
);
|
|
248
|
-
const handleLogout = useCallback(
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
284
|
+
const handleLogout = useCallback(
|
|
285
|
+
(redirectUriAfterLogout) => {
|
|
286
|
+
dispatch({
|
|
287
|
+
type: "SET_LOADING",
|
|
288
|
+
payload: true
|
|
289
|
+
});
|
|
290
|
+
ConfigurationStore.clearConfiguration(configurationName, config.realm);
|
|
291
|
+
return keycloak?.logout({
|
|
292
|
+
redirectUri: redirectUriAfterLogout
|
|
293
|
+
}) ?? Promise.reject();
|
|
294
|
+
},
|
|
295
|
+
[config.realm, configurationName]
|
|
296
|
+
);
|
|
297
|
+
const shouldRenderError = state?.error && !state.isLoading && AuthenticatingErrorComponent;
|
|
298
|
+
const shouldRenderSessionLost = state.sessionLost && !state.isLoading && !state?.error && SessionLostComponent;
|
|
257
299
|
const shouldRenderChildren = !state.isLoading && !state.error && !state.sessionLost;
|
|
258
300
|
return /* @__PURE__ */ jsxs(
|
|
259
301
|
KeycloakContext.Provider,
|
|
@@ -265,9 +307,9 @@ var KeycloakProvider = ({
|
|
|
265
307
|
},
|
|
266
308
|
children: [
|
|
267
309
|
shouldRenderChildren && children,
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
310
|
+
shouldRenderSessionLost && /* @__PURE__ */ jsx(SessionLostComponent, {}),
|
|
311
|
+
shouldRenderError && /* @__PURE__ */ jsx(AuthenticatingErrorComponent, { error: state?.error }),
|
|
312
|
+
LoadingComponent && /* @__PURE__ */ jsx(LoadingComponent, { opened: state?.isLoading })
|
|
271
313
|
]
|
|
272
314
|
}
|
|
273
315
|
);
|
|
@@ -286,7 +328,6 @@ function useKeycloak() {
|
|
|
286
328
|
}
|
|
287
329
|
|
|
288
330
|
// src/components/KeycloakSecure.tsx
|
|
289
|
-
import { Fragment, jsx as jsx2 } from "react/jsx-runtime";
|
|
290
331
|
var KeycloakSecure = ({
|
|
291
332
|
children
|
|
292
333
|
}) => {
|
|
@@ -300,7 +341,7 @@ var KeycloakSecure = ({
|
|
|
300
341
|
login();
|
|
301
342
|
return null;
|
|
302
343
|
}
|
|
303
|
-
return
|
|
344
|
+
return children;
|
|
304
345
|
};
|
|
305
346
|
|
|
306
347
|
// src/hooks/useKeycloakUser.ts
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/provider/KeycloakProvider.tsx","../src/components/Logger.ts","../src/provider/keycloak-context.ts","../src/provider/keycloak-reducer.ts","../src/hooks/useKeycloak.ts","../src/components/KeycloakSecure.tsx","../src/hooks/useKeycloakUser.ts","../src/hooks/useKeycloakToken.ts"],"sourcesContent":["import Keycloak from \"keycloak-js\";\nimport React, {\n FC,\n ReactNode,\n useCallback,\n useLayoutEffect,\n useReducer,\n} from \"react\";\nimport Logger from \"../components/Logger\";\nimport { KeycloakConfig, KeycloakUser } from \"../types\";\nimport { KeycloakContext } from \"./keycloak-context\";\nimport {\n initialKeycloakContextValue,\n keycloakReducer,\n} from \"./keycloak-reducer\";\n\ninterface Props {\n logging?: boolean;\n children: ReactNode;\n config: KeycloakConfig;\n LoadingComponent?: FC<{ opened: boolean }>;\n AuthenticatingErrorComponent?: FC<{\n error: Error | null;\n }>;\n SessionLostComponent?: FC;\n}\n\nlet keycloak: Keycloak | undefined;\nconst logger = new Logger(false);\nexport const KeycloakProvider: React.FC<Props> = ({\n logging,\n children,\n config,\n LoadingComponent,\n AuthenticatingErrorComponent,\n SessionLostComponent,\n}) => {\n logger.setEnabled(logging ?? false);\n\n const [state, dispatch] = useReducer(\n keycloakReducer,\n initialKeycloakContextValue,\n );\n\n const initiateKeycloak = useCallback(() => {\n if (!keycloak) {\n keycloak = new Keycloak({\n url: config.url,\n realm: config.realm,\n clientId: config.clientId,\n oidcProvider: config.wellKnownUrlPrefix,\n });\n }\n\n if (keycloak && !keycloak.didInitialize) {\n keycloak\n .init({\n onLoad: \"check-sso\",\n checkLoginIframe: false,\n scope: config.scope,\n })\n .catch((error) => {\n logger.log(\"Failed to initialize Keycloak\", { error });\n dispatch({\n type: \"SET_ERROR\",\n payload: error || null,\n });\n });\n }\n\n keycloak.onReady = (authenticated) => {\n logger.log(\"Keycloak is ready\", { authenticated });\n\n if (!authenticated) {\n dispatch({\n type: \"SET_LOADING\",\n payload: false,\n });\n }\n };\n\n keycloak.onAuthSuccess = () => {\n logger.log(\"Authentication successful\");\n\n dispatch({\n type: \"SET_TOKEN\",\n payload: {\n isAuthenticated: true,\n accessToken: keycloak?.token,\n idToken: keycloak?.idToken,\n },\n });\n\n logger.log(\"Loading user info\");\n keycloak\n ?.loadUserInfo()\n .then((userInfo) => {\n logger.log(\"User info loaded\", { userInfo });\n dispatch({\n type: \"SET_USER_INFO\",\n payload: userInfo as unknown as KeycloakUser,\n });\n })\n .finally(() => {\n dispatch({\n type: \"SET_LOADING\",\n payload: false,\n });\n });\n\n setInterval(\n () => {\n keycloak\n ?.updateToken(config.refreshSecondsBeforeTokenExpires ?? 120)\n .then((refreshed) => {\n if (!refreshed) {\n logger.log(\n \"Token is still valid, no need to refresh\",\n new Date(\n (keycloak?.tokenParsed?.exp ?? 0) * 1000,\n ).toLocaleTimeString(),\n );\n }\n });\n },\n (config.tokenRefreshIntervalInSeconds ?? 10) * 1000,\n );\n };\n\n keycloak.onAuthLogout = () => {\n logger.log(\"Session lost\");\n dispatch({\n type: \"SET_SESSION_LOST\",\n payload: true,\n });\n };\n\n keycloak.onAuthError = (error) => {\n logger.log(\"Authentication error\", { error });\n\n dispatch({\n type: \"SET_ERROR\",\n payload: error || null,\n });\n };\n\n keycloak.onAuthRefreshError = () => {\n logger.log(\"Token refresh error\");\n\n dispatch({\n type: \"SET_ERROR\",\n payload: new Error(\"Token refresh error\") || null,\n });\n };\n\n keycloak.onAuthRefreshSuccess = () => {\n logger.log(\"Token refresh successful\", keycloak?.token);\n\n dispatch({\n type: \"SET_TOKEN\",\n payload: {\n isAuthenticated: true,\n accessToken: keycloak?.token,\n idToken: keycloak?.idToken,\n },\n });\n };\n }, [\n config.clientId,\n config.realm,\n config.refreshSecondsBeforeTokenExpires,\n config.scope,\n config.tokenRefreshIntervalInSeconds,\n config.url,\n config.wellKnownUrlPrefix,\n ]);\n\n useLayoutEffect(() => {\n initiateKeycloak();\n }, [initiateKeycloak]);\n\n useLayoutEffect(() => {\n logger.log(\"Checando redirecionamento após autenticação\", {\n isAuthenticated: state.isAuthenticated,\n isLoading: state.isLoading,\n redirectUri: config.redirectUri,\n });\n\n if (\n !state.isLoading &&\n state.isAuthenticated &&\n config.redirectUri &&\n window.location.href.startsWith(config.redirectUri)\n ) {\n const returnUrl = sessionStorage.getItem(\"keycloak_return_url\") || \"/\";\n if (!window.location.href.endsWith(returnUrl)) {\n logger.log(\"Redirecionando para a URL original após autenticação\", {\n returnUrl,\n origin: window.location.origin,\n });\n\n // Redireciona para a URL original\n window.history.replaceState(\n { keycloak_redirected: true },\n \"\",\n window.location.origin + returnUrl,\n );\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n sessionStorage.removeItem(\"keycloak_return_url\");\n }\n }\n }, [config.redirectUri, state.isAuthenticated, state.isLoading]);\n\n const handleLogin = useCallback(\n (redirectUri?: string) => {\n dispatch({\n type: \"SET_LOADING\",\n payload: true,\n });\n\n return (\n keycloak?.login({\n redirectUri: redirectUri ?? config.redirectUri,\n }) ?? Promise.reject()\n );\n },\n [config.redirectUri],\n );\n\n const handleLogout = useCallback((redirectUriAfterLogout: string) => {\n dispatch({\n type: \"SET_LOADING\",\n payload: true,\n });\n\n return (\n keycloak?.logout({\n redirectUri: redirectUriAfterLogout,\n }) ?? Promise.reject()\n );\n }, []);\n\n const shouldRenderChildren =\n !state.isLoading && !state.error && !state.sessionLost;\n\n return (\n <KeycloakContext.Provider\n value={{\n ...state,\n login: handleLogin,\n logout: handleLogout,\n }}\n >\n {shouldRenderChildren && children}\n\n {LoadingComponent && <LoadingComponent opened={state?.isLoading} />}\n {AuthenticatingErrorComponent && state?.error && (\n <AuthenticatingErrorComponent error={state?.error} />\n )}\n {SessionLostComponent && state?.sessionLost && <SessionLostComponent />}\n </KeycloakContext.Provider>\n );\n};\n","export default class Logger {\n enabled: boolean = false;\n\n constructor(enabled: boolean = false) {\n this.enabled = enabled;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log(...data: any[]) {\n if (this.enabled) {\n console.log(\"[react-keycloak-wrapper]\", ...data);\n }\n }\n\n setEnabled(enabled: boolean) {\n this.enabled = enabled;\n }\n}\n","import { createContext } from \"react\";\nimport { KeycloakContextValue } from \"../types\";\nimport { initialKeycloakContextValue } from \"./keycloak-reducer\";\n\nexport const KeycloakContext = createContext<KeycloakContextValue>(\n initialKeycloakContextValue,\n);\n","import { KeycloakError } from \"keycloak-js\";\nimport { KeycloakContextValue, KeycloakUser } from \"../types\";\n\ntype GenericAction<T extends string, P = undefined> = { type: T; payload: P };\n\nexport type KeycloakAction =\n | GenericAction<\n \"SET_TOKEN\",\n { accessToken?: string; idToken?: string; isAuthenticated?: boolean }\n >\n | GenericAction<\"SET_LOADING\", boolean>\n | GenericAction<\"SET_ERROR\", Error | KeycloakError | null>\n | GenericAction<\"SET_SESSION_LOST\", boolean>\n | GenericAction<\"SET_USER_INFO\", KeycloakUser | null>;\n\nexport const initialKeycloakContextValue: KeycloakContextValue = {\n error: null,\n isAuthenticated: false,\n isLoading: true,\n sessionLost: false,\n login: () => Promise.reject(new Error(\"Not implemented\")),\n logout: () => Promise.reject(new Error(\"Not implemented\")),\n userInfo: null,\n};\n\nexport function keycloakReducer(\n state: KeycloakContextValue,\n action: KeycloakAction,\n): KeycloakContextValue {\n switch (action.type) {\n case \"SET_TOKEN\":\n return {\n ...state,\n accessToken: action.payload.accessToken,\n idToken: action.payload.idToken,\n isAuthenticated:\n action.payload.isAuthenticated ?? state.isAuthenticated,\n };\n case \"SET_LOADING\":\n return {\n ...state,\n isLoading: action.payload,\n };\n case \"SET_ERROR\":\n return {\n ...state,\n error:\n !action.payload || action.payload instanceof Error\n ? action.payload\n : new Error(\n String(\n action.payload.error || action.payload.error_description,\n ),\n ),\n };\n case \"SET_SESSION_LOST\":\n return {\n ...state,\n sessionLost: action.payload,\n };\n case \"SET_USER_INFO\":\n return {\n ...state,\n userInfo: action.payload,\n };\n\n default:\n return state;\n }\n}\n","import { useContext } from \"react\";\nimport { KeycloakContext } from \"../provider/keycloak-context\";\n\nexport function useKeycloak() {\n const ctx = useContext(KeycloakContext);\n\n return {\n login: ctx.login,\n logout: ctx.logout,\n isLoading: ctx.isLoading,\n isAuthenticated: ctx.isAuthenticated,\n };\n}\n","import React from \"react\";\nimport { useKeycloak } from \"../hooks/useKeycloak\";\n\nexport const KeycloakSecure: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n const { isAuthenticated, login, isLoading } = useKeycloak();\n\n if (isLoading) return null;\n\n if (!isAuthenticated) {\n // Salva a URL atual antes de redirecionar\n sessionStorage.setItem(\n \"keycloak_return_url\",\n window.location.pathname + window.location.search,\n );\n\n // Redireciona para o Keycloak com callback fixo\n login(); // Usa o redirectUri configurado (ex: /authorization)\n return null;\n }\n\n return <>{children}</>;\n};\n","import { useContext } from \"react\";\nimport { KeycloakContext } from \"../provider/keycloak-context\";\nimport { KeycloakUser } from \"../types\";\n\nexport function useKeycloakUser<UserInfo = KeycloakUser>() {\n const ctx = useContext(KeycloakContext);\n\n return {\n user: ctx?.userInfo as UserInfo | null,\n loading: ctx?.isLoading,\n };\n}\n","import { useContext } from \"react\";\nimport { KeycloakContext } from \"../provider/keycloak-context\";\n\nexport function useKeycloakToken() {\n const ctx = useContext(KeycloakContext);\n\n return {\n accessToken: ctx.accessToken,\n idToken: ctx.idToken,\n };\n}\n"],"mappings":"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","names":["jsx","useContext","useContext","useContext","useContext"]}
|
|
1
|
+
{"version":3,"sources":["../src/provider/KeycloakProvider.tsx","../src/components/Logger.ts","../src/store/ConfigurationStore.ts","../src/provider/keycloak-context.ts","../src/provider/keycloak-reducer.ts","../src/hooks/useKeycloak.ts","../src/components/KeycloakSecure.tsx","../src/hooks/useKeycloakUser.ts","../src/hooks/useKeycloakToken.ts"],"sourcesContent":["import Keycloak from \"keycloak-js\";\nimport React, {\n FC,\n ReactNode,\n useCallback,\n useLayoutEffect,\n useReducer,\n} from \"react\";\nimport Logger from \"../components/Logger\";\nimport ConfigurationStore from \"../store/ConfigurationStore\";\nimport { KeycloakConfig, KeycloakUser } from \"../types\";\nimport { KeycloakContext } from \"./keycloak-context\";\nimport {\n initialKeycloakContextValue,\n keycloakReducer,\n} from \"./keycloak-reducer\";\n\ninterface Props {\n configurationName?: string;\n logging?: \"wrapper\" | \"keycloak\" | \"both\";\n children: ReactNode;\n config: KeycloakConfig;\n LoadingComponent?: FC<{ opened: boolean }>;\n AuthenticatingErrorComponent?: FC<{\n error: Error | null;\n }>;\n SessionLostComponent?: FC;\n}\n\nlet keycloak: Keycloak | undefined;\nconst logger = new Logger(false);\nexport const KeycloakProvider: React.FC<Props> = ({\n configurationName = \"default\",\n logging,\n children,\n config,\n LoadingComponent,\n AuthenticatingErrorComponent,\n SessionLostComponent,\n}) => {\n logger.setEnabled([\"wrapper\", \"both\"].includes(logging ?? \"\"));\n\n const [state, dispatch] = useReducer(\n keycloakReducer,\n initialKeycloakContextValue,\n );\n\n const initiateKeycloak = useCallback(() => {\n if (!keycloak) {\n keycloak = new Keycloak({\n url: config.url,\n realm: config.realm,\n clientId: config.clientId,\n oidcProvider: config.wellKnownUrlPrefix,\n });\n }\n\n if (keycloak && !keycloak.didInitialize) {\n keycloak\n .init({\n onLoad: \"check-sso\",\n checkLoginIframe: false,\n scope: config.scope,\n enableLogging: [\"keycloak\", \"both\"].includes(logging ?? \"\"),\n ...ConfigurationStore.getConfiguration(\n configurationName,\n config.realm,\n ),\n })\n .catch((error) => {\n logger.log(\"Failed to initialize Keycloak\", { error });\n dispatch({\n type: \"SET_ERROR\",\n payload: error || null,\n });\n });\n }\n\n keycloak.onReady = (authenticated) => {\n logger.log(\"Keycloak is ready\", { authenticated });\n\n if (!authenticated) {\n dispatch({\n type: \"SET_LOADING\",\n payload: false,\n });\n }\n };\n\n keycloak.onAuthSuccess = () => {\n logger.log(\"Authentication successful\");\n\n ConfigurationStore.setConfiguration(configurationName, config.realm, {\n token: keycloak?.token,\n refreshToken: keycloak?.refreshToken,\n idToken: keycloak?.idToken,\n });\n\n dispatch({\n type: \"SET_TOKEN\",\n payload: {\n isAuthenticated: true,\n accessToken: keycloak?.token,\n refreshToken: keycloak?.refreshToken,\n idToken: keycloak?.idToken,\n },\n });\n\n logger.log(\"Loading user info\");\n keycloak\n ?.loadUserInfo()\n .then((userInfo) => {\n logger.log(\"User info loaded\", { userInfo });\n dispatch({\n type: \"SET_USER_INFO\",\n payload: userInfo as unknown as KeycloakUser,\n });\n })\n .finally(() => {\n dispatch({\n type: \"SET_LOADING\",\n payload: false,\n });\n });\n\n setInterval(\n () => {\n keycloak\n ?.updateToken(config.refreshSecondsBeforeTokenExpires ?? 120)\n .then((refreshed) => {\n if (!refreshed) {\n logger.log(\n \"Token is still valid, no need to refresh\",\n new Date(\n (keycloak?.tokenParsed?.exp ?? 0) * 1000,\n ).toLocaleTimeString(),\n );\n }\n });\n },\n (config.tokenRefreshIntervalInSeconds ?? 10) * 1000,\n );\n };\n\n keycloak.onAuthLogout = () => {\n logger.log(\"Session lost\");\n dispatch({\n type: \"SET_SESSION_LOST\",\n payload: true,\n });\n };\n\n keycloak.onAuthError = (error) => {\n logger.log(\"Authentication error\", { error });\n\n dispatch({\n type: \"SET_ERROR\",\n payload: error || null,\n });\n };\n\n keycloak.onAuthRefreshError = () => {\n logger.log(\"Token refresh error\");\n\n dispatch({\n type: \"SET_ERROR\",\n payload: new Error(\"Token refresh error\") || null,\n });\n };\n\n keycloak.onAuthRefreshSuccess = () => {\n logger.log(\"Token refresh successful\", keycloak?.token);\n\n ConfigurationStore.setConfiguration(configurationName, config.realm, {\n token: keycloak?.token,\n refreshToken: keycloak?.refreshToken,\n idToken: keycloak?.idToken,\n });\n\n dispatch({\n type: \"SET_TOKEN\",\n payload: {\n isAuthenticated: true,\n accessToken: keycloak?.token,\n refreshToken: keycloak?.refreshToken,\n idToken: keycloak?.idToken,\n },\n });\n };\n }, [\n config.clientId,\n config.realm,\n config.refreshSecondsBeforeTokenExpires,\n config.scope,\n config.tokenRefreshIntervalInSeconds,\n config.url,\n config.wellKnownUrlPrefix,\n configurationName,\n logging,\n ]);\n\n useLayoutEffect(() => {\n initiateKeycloak();\n }, [initiateKeycloak]);\n\n useLayoutEffect(() => {\n if (\n !state.isLoading &&\n state.isAuthenticated &&\n config.redirectUri &&\n window.location.href.startsWith(config.redirectUri)\n ) {\n const returnUrl = sessionStorage.getItem(\"keycloak_return_url\") || \"/\";\n if (!window.location.href.endsWith(returnUrl)) {\n logger.log(\"Redirecionando para a URL original após autenticação\", {\n returnUrl,\n origin: window.location.origin,\n });\n\n // Redireciona para a URL original\n window.history.replaceState(\n { keycloak_redirected: true },\n \"\",\n window.location.origin + returnUrl,\n );\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n sessionStorage.removeItem(\"keycloak_return_url\");\n }\n }\n }, [config.redirectUri, state.isAuthenticated, state.isLoading]);\n\n const handleLogin = useCallback(\n (redirectUri?: string) => {\n dispatch({\n type: \"SET_LOADING\",\n payload: true,\n });\n\n return (\n keycloak?.login({\n redirectUri: redirectUri ?? config.redirectUri,\n }) ?? Promise.reject()\n );\n },\n [config.redirectUri],\n );\n\n const handleLogout = useCallback(\n (redirectUriAfterLogout: string) => {\n dispatch({\n type: \"SET_LOADING\",\n payload: true,\n });\n\n ConfigurationStore.clearConfiguration(configurationName, config.realm);\n\n return (\n keycloak?.logout({\n redirectUri: redirectUriAfterLogout,\n }) ?? Promise.reject()\n );\n },\n [config.realm, configurationName],\n );\n\n // carregando > erro > sessão perdida > children\n\n const shouldRenderError =\n state?.error && !state.isLoading && AuthenticatingErrorComponent;\n\n const shouldRenderSessionLost =\n state.sessionLost &&\n !state.isLoading &&\n !state?.error &&\n SessionLostComponent;\n\n const shouldRenderChildren =\n !state.isLoading && !state.error && !state.sessionLost;\n\n return (\n <KeycloakContext.Provider\n value={{\n ...state,\n login: handleLogin,\n logout: handleLogout,\n }}\n >\n {shouldRenderChildren && children}\n\n {shouldRenderSessionLost && <SessionLostComponent />}\n\n {shouldRenderError && (\n <AuthenticatingErrorComponent error={state?.error} />\n )}\n\n {LoadingComponent && <LoadingComponent opened={state?.isLoading} />}\n </KeycloakContext.Provider>\n );\n};\n","export default class Logger {\n enabled: boolean = false;\n\n constructor(enabled: boolean = false) {\n this.enabled = enabled;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log(...data: any[]) {\n if (this.enabled) {\n console.log(\"[react-keycloak-wrapper]\", ...data);\n }\n }\n\n setEnabled(enabled: boolean) {\n this.enabled = enabled;\n }\n}\n","type ConfigurationTokens = {\n idToken?: string;\n token?: string;\n refreshToken?: string;\n};\n\nfunction getConfigurationKey(name: string, realm: string) {\n return [\"keycloak\", realm, name].join(\".\");\n}\n\nexport default class ConfigurationStore {\n public static setConfiguration(\n name: string,\n realm: string,\n config: ConfigurationTokens,\n ): void {\n sessionStorage.setItem(\n getConfigurationKey(name, realm),\n JSON.stringify(config),\n );\n }\n\n public static getConfiguration(\n name: string,\n realm: string,\n ): ConfigurationTokens | object {\n const config = sessionStorage.getItem(getConfigurationKey(name, realm));\n return config ? (JSON.parse(config) as ConfigurationTokens) : {};\n }\n\n public static clearConfiguration(name: string, realm: string): void {\n sessionStorage.removeItem(getConfigurationKey(name, realm));\n }\n}\n","import { createContext } from \"react\";\nimport { KeycloakContextValue } from \"../types\";\nimport { initialKeycloakContextValue } from \"./keycloak-reducer\";\n\nexport const KeycloakContext = createContext<KeycloakContextValue>(\n initialKeycloakContextValue,\n);\n","import { KeycloakError } from \"keycloak-js\";\nimport { KeycloakContextValue, KeycloakUser } from \"../types\";\n\ntype GenericAction<T extends string, P = undefined> = { type: T; payload: P };\n\nexport type KeycloakAction =\n | GenericAction<\n \"SET_TOKEN\",\n {\n accessToken?: string;\n idToken?: string;\n refreshToken?: string;\n isAuthenticated?: boolean;\n }\n >\n | GenericAction<\"SET_LOADING\", boolean>\n | GenericAction<\"SET_ERROR\", Error | KeycloakError | null>\n | GenericAction<\"SET_SESSION_LOST\", boolean>\n | GenericAction<\"SET_USER_INFO\", KeycloakUser | null>;\n\nexport const initialKeycloakContextValue: KeycloakContextValue = {\n error: null,\n isAuthenticated: false,\n isLoading: true,\n sessionLost: false,\n login: () => Promise.reject(new Error(\"Not implemented\")),\n logout: () => Promise.reject(new Error(\"Not implemented\")),\n userInfo: null,\n};\n\nexport function keycloakReducer(\n state: KeycloakContextValue,\n action: KeycloakAction,\n): KeycloakContextValue {\n switch (action.type) {\n case \"SET_TOKEN\":\n return {\n ...state,\n accessToken: action.payload.accessToken,\n refreshToken: action.payload.refreshToken,\n idToken: action.payload.idToken,\n isAuthenticated:\n action.payload.isAuthenticated ?? state.isAuthenticated,\n };\n case \"SET_LOADING\":\n return {\n ...state,\n isLoading: action.payload,\n };\n case \"SET_ERROR\":\n return {\n ...state,\n error:\n !action.payload || action.payload instanceof Error\n ? action.payload\n : new Error(\n String(\n action.payload.error || action.payload.error_description,\n ),\n ),\n };\n case \"SET_SESSION_LOST\":\n return {\n ...state,\n sessionLost: action.payload,\n };\n case \"SET_USER_INFO\":\n return {\n ...state,\n userInfo: action.payload,\n };\n\n default:\n return state;\n }\n}\n","import { useContext } from \"react\";\nimport { KeycloakContext } from \"../provider/keycloak-context\";\n\nexport function useKeycloak() {\n const ctx = useContext(KeycloakContext);\n\n return {\n login: ctx.login,\n logout: ctx.logout,\n isLoading: ctx.isLoading,\n isAuthenticated: ctx.isAuthenticated,\n };\n}\n","import React from \"react\";\nimport { useKeycloak } from \"../hooks/useKeycloak\";\n\nexport const KeycloakSecure: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n const { isAuthenticated, login, isLoading } = useKeycloak();\n\n if (isLoading) return null;\n\n if (!isAuthenticated) {\n // Salva a URL atual antes de redirecionar\n sessionStorage.setItem(\n \"keycloak_return_url\",\n window.location.pathname + window.location.search,\n );\n\n // Redireciona para o Keycloak com callback fixo\n login(); // Usa o redirectUri configurado (ex: /authorization)\n return null;\n }\n\n return children;\n};\n","import { useContext } from \"react\";\nimport { KeycloakContext } from \"../provider/keycloak-context\";\nimport { KeycloakUser } from \"../types\";\n\nexport function useKeycloakUser<UserInfo = KeycloakUser>() {\n const ctx = useContext(KeycloakContext);\n\n return {\n user: ctx?.userInfo as UserInfo | null,\n loading: ctx?.isLoading,\n };\n}\n","import { useContext } from \"react\";\nimport { KeycloakContext } from \"../provider/keycloak-context\";\n\nexport function useKeycloakToken() {\n const ctx = useContext(KeycloakContext);\n\n return {\n accessToken: ctx.accessToken,\n idToken: ctx.idToken,\n };\n}\n"],"mappings":"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","names":["useContext","useContext","useContext","useContext"]}
|