@multiplatform.one/keycloak 0.2.4 → 0.2.7
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/esm/Authenticated.mjs +25 -13
- package/dist/esm/Authenticated.mjs.map +3 -3
- package/dist/esm/authConfig.mjs +1 -0
- package/dist/esm/authConfig.mjs.map +2 -2
- package/dist/esm/hooks/useKeycloak/index.mjs.map +1 -1
- package/dist/esm/hooks/useKeycloak/useKeycloak.mjs +4 -59
- package/dist/esm/hooks/useKeycloak/useKeycloak.mjs.map +3 -3
- package/dist/esm/hooks/useKeycloak/useKeycloak.native.mjs.map +1 -1
- package/dist/esm/hooks/useLogin.mjs.map +1 -1
- package/dist/esm/provider/afterAuth.mjs +1 -1
- package/dist/esm/provider/afterAuth.mjs.map +2 -2
- package/dist/esm/provider/keycloakProvider.mjs +11 -9
- package/dist/esm/provider/keycloakProvider.mjs.map +3 -3
- package/dist/jsx/Authenticated.mjs +22 -10
- package/dist/jsx/Authenticated.mjs.map +2 -2
- package/dist/jsx/authConfig.mjs +1 -0
- package/dist/jsx/authConfig.mjs.map +2 -2
- package/dist/jsx/hooks/useKeycloak/index.mjs.map +1 -1
- package/dist/jsx/hooks/useKeycloak/useKeycloak.mjs +4 -5
- package/dist/jsx/hooks/useKeycloak/useKeycloak.mjs.map +2 -2
- package/dist/jsx/hooks/useKeycloak/useKeycloak.native.mjs.map +1 -1
- package/dist/jsx/hooks/useLogin.mjs.map +1 -1
- package/dist/jsx/provider/afterAuth.mjs +1 -1
- package/dist/jsx/provider/afterAuth.mjs.map +2 -2
- package/dist/jsx/provider/keycloakProvider.mjs +12 -10
- package/dist/jsx/provider/keycloakProvider.mjs.map +2 -2
- package/dist/jsx/provider/keycloakProvider.native.mjs.map +1 -1
- package/dist/lib/Authenticated.d.ts +2 -2
- package/dist/lib/Authenticated.js +22 -10
- package/dist/lib/Authenticated.js.map +2 -2
- package/dist/lib/authConfig.d.ts +2 -1
- package/dist/lib/authConfig.js +1 -0
- package/dist/lib/authConfig.js.map +2 -2
- package/dist/lib/hooks/useKeycloak/index.d.ts +2 -2
- package/dist/lib/hooks/useKeycloak/index.js.map +1 -1
- package/dist/lib/hooks/useKeycloak/useKeycloak.d.ts +1 -1
- package/dist/lib/hooks/useKeycloak/useKeycloak.js +5 -20
- package/dist/lib/hooks/useKeycloak/useKeycloak.js.map +2 -2
- package/dist/lib/hooks/useKeycloak/useKeycloak.native.d.ts +2 -2
- package/dist/lib/hooks/useKeycloak/useKeycloak.native.js.map +1 -1
- package/dist/lib/hooks/useLogin.d.ts +1 -1
- package/dist/lib/hooks/useLogin.js.map +1 -1
- package/dist/lib/provider/afterAuth.js +1 -1
- package/dist/lib/provider/afterAuth.js.map +2 -2
- package/dist/lib/provider/keycloakProvider.d.ts +3 -3
- package/dist/lib/provider/keycloakProvider.js +15 -13
- package/dist/lib/provider/keycloakProvider.js.map +2 -2
- package/dist/lib/provider/keycloakProvider.native.js.map +1 -1
- package/dist/lib/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +17 -20
- package/src/Authenticated.tsx +23 -11
- package/src/authConfig.ts +3 -1
- package/src/hooks/useKeycloak/index.ts +2 -2
- package/src/hooks/useKeycloak/useKeycloak.native.ts +2 -2
- package/src/hooks/useKeycloak/useKeycloak.ts +6 -7
- package/src/hooks/useLogin.ts +1 -1
- package/src/provider/afterAuth.tsx +1 -1
- package/src/provider/keycloakProvider.native.tsx +1 -1
- package/src/provider/keycloakProvider.tsx +14 -12
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@multiplatform.one/keycloak",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"description": "keycloak client for multiplatform.one ecosystem",
|
|
5
5
|
"main": "dist/lib",
|
|
6
6
|
"module": "dist/esm",
|
|
@@ -50,7 +50,6 @@
|
|
|
50
50
|
"@react-native-async-storage/async-storage": "^1.17.11",
|
|
51
51
|
"@react-navigation/native": "^6.0.14",
|
|
52
52
|
"expo-keycloak-auth": "1.0.14",
|
|
53
|
-
"keycloak-js": "^20.0.3",
|
|
54
53
|
"multiplatform.one": "^0.4.3",
|
|
55
54
|
"next": "^13.0.5",
|
|
56
55
|
"react": "^18.2.0",
|
|
@@ -64,31 +63,30 @@
|
|
|
64
63
|
"@react-native-async-storage/async-storage": "^1.18.1",
|
|
65
64
|
"@react-navigation/native": "^6.1.6",
|
|
66
65
|
"@types/eslint": "^8.37.0",
|
|
67
|
-
"@types/jest": "^29.5.
|
|
66
|
+
"@types/jest": "^29.5.1",
|
|
68
67
|
"@types/lodash.camelcase": "^4.3.7",
|
|
69
68
|
"@types/lodash.startcase": "^4.4.7",
|
|
70
|
-
"@types/react": "18.0
|
|
69
|
+
"@types/react": "18.2.0",
|
|
71
70
|
"@types/react-native": "0.71.6",
|
|
72
|
-
"@typescript-eslint/eslint-plugin": "^5.59.
|
|
73
|
-
"@typescript-eslint/parser": "^5.59.
|
|
71
|
+
"@typescript-eslint/eslint-plugin": "^5.59.1",
|
|
72
|
+
"@typescript-eslint/parser": "^5.59.1",
|
|
74
73
|
"babel-plugin-fully-specified": "^1.3.0",
|
|
75
74
|
"cspell": "^6.31.1",
|
|
76
|
-
"esbuild": "^0.17.
|
|
75
|
+
"esbuild": "^0.17.18",
|
|
77
76
|
"esbuild-plugin-babel": "^0.2.3",
|
|
78
|
-
"eslint": "^8.
|
|
79
|
-
"eslint-config-alloy": "^
|
|
77
|
+
"eslint": "^8.39.0",
|
|
78
|
+
"eslint-config-alloy": "^5.0.0",
|
|
80
79
|
"eslint-plugin-react": "^7.32.2",
|
|
81
80
|
"eslint-plugin-spellcheck": "^0.0.20",
|
|
82
81
|
"expo-keycloak-auth": "1.0.14",
|
|
83
82
|
"jest": "^29.5.0",
|
|
84
83
|
"jest-sonar-reporter": "^2.0.0",
|
|
85
|
-
"keycloak-js": "21.0.2",
|
|
86
84
|
"lockfile-lint": "^4.10.1",
|
|
87
|
-
"multiplatform.one": "^0.5.
|
|
88
|
-
"next": "^13.3.
|
|
89
|
-
"prettier": "^2.8.
|
|
85
|
+
"multiplatform.one": "^0.5.28",
|
|
86
|
+
"next": "^13.3.1",
|
|
87
|
+
"prettier": "^2.8.8",
|
|
90
88
|
"react": "^18.2.0",
|
|
91
|
-
"react-native": "~0.71.
|
|
89
|
+
"react-native": "~0.71.7",
|
|
92
90
|
"ts-node": "^10.9.1",
|
|
93
91
|
"typescript": "^5.0.4"
|
|
94
92
|
},
|
|
@@ -116,16 +114,15 @@
|
|
|
116
114
|
"indent": 4
|
|
117
115
|
},
|
|
118
116
|
"dependencies": {
|
|
119
|
-
"@
|
|
120
|
-
"@react-keycloak
|
|
117
|
+
"@bitspur/keycloak-js": "21.1.0-3",
|
|
118
|
+
"@bitspur/react-keycloak-ssr": "4.0.0",
|
|
119
|
+
"@bitspur/react-keycloak-web": "4.0.0",
|
|
121
120
|
"core-js-pure": "^3.30.1",
|
|
122
121
|
"expo-auth-session": "^4.0.3",
|
|
123
|
-
"solito": "^3.2.
|
|
122
|
+
"solito": "^3.2.5"
|
|
124
123
|
},
|
|
125
124
|
"resolutions": {
|
|
126
|
-
"expo-keycloak-auth@1.0.14": "patch:expo-keycloak-auth@npm%3A1.0.14#./.yarn/patches/expo-keycloak-auth-npm-1.0.14-78201597ce.patch"
|
|
127
|
-
"keycloak-js@21.0.0": "patch:keycloak-js@npm%3A21.0.0#./.yarn/patches/keycloak-js-npm-21.0.0-1387a3b112.patch",
|
|
128
|
-
"keycloak-js@21.0.2": "patch:keycloak-js@npm%3A21.0.2#./.yarn/patches/keycloak-js-npm-21.0.2-0f4fb90576.patch"
|
|
125
|
+
"expo-keycloak-auth@1.0.14": "patch:expo-keycloak-auth@npm%3A1.0.14#./.yarn/patches/expo-keycloak-auth-npm-1.0.14-78201597ce.patch"
|
|
129
126
|
},
|
|
130
127
|
"prettier": "eslint-config-alloy/.prettierrc.js"
|
|
131
128
|
}
|
package/src/Authenticated.tsx
CHANGED
|
@@ -22,9 +22,11 @@
|
|
|
22
22
|
* limitations under the License.
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
-
import React from 'react';
|
|
26
|
-
import type { ComponentType,
|
|
25
|
+
import React, { useEffect } from 'react';
|
|
26
|
+
import type { ComponentType, ReactNode } from 'react';
|
|
27
27
|
import { useLogin, useKeycloak } from './hooks';
|
|
28
|
+
import { useAuthState } from './state';
|
|
29
|
+
import { useAuthConfig } from './hooks/useAuthConfig';
|
|
28
30
|
|
|
29
31
|
export interface AuthenticatedProps {
|
|
30
32
|
children: ReactNode;
|
|
@@ -33,16 +35,26 @@ export interface AuthenticatedProps {
|
|
|
33
35
|
loginRoute?: string;
|
|
34
36
|
}
|
|
35
37
|
|
|
36
|
-
export
|
|
38
|
+
export function Authenticated({ children, disabled, loginRoute, loggedOutComponent }: AuthenticatedProps) {
|
|
39
|
+
const authConfig = useAuthConfig();
|
|
40
|
+
const authState = useAuthState();
|
|
41
|
+
const login = useLogin(loginRoute);
|
|
37
42
|
const { authenticated } = useKeycloak();
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
if (authenticated
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
43
|
+
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
if (authenticated !== false) return;
|
|
46
|
+
if (authConfig.persist) {
|
|
47
|
+
authState.setIdToken('');
|
|
48
|
+
authState.setRefreshToken('');
|
|
49
|
+
authState.setToken('');
|
|
50
|
+
}
|
|
51
|
+
login();
|
|
52
|
+
}, [authenticated]);
|
|
53
|
+
|
|
54
|
+
if (disabled || authenticated) return <>{children}</>;
|
|
55
|
+
const LoggedOutComponent = loggedOutComponent || (() => null);
|
|
56
|
+
return <LoggedOutComponent />;
|
|
57
|
+
}
|
|
46
58
|
|
|
47
59
|
export function withAuthenticated<P extends object>(Component: ComponentType<P>) {
|
|
48
60
|
return (props: P) => (
|
package/src/authConfig.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* File Created: 08-11-2022 09:21:15
|
|
5
5
|
* Author: Clay Risser
|
|
6
6
|
* -----
|
|
7
|
-
* Last Modified:
|
|
7
|
+
* Last Modified: 25-04-2023 23:08:17
|
|
8
8
|
* Modified By: Clay Risser
|
|
9
9
|
* -----
|
|
10
10
|
* Risser Labs LLC (c) Copyright 2021 - 2022
|
|
@@ -26,6 +26,7 @@ import { createContext } from 'react';
|
|
|
26
26
|
|
|
27
27
|
export const defaultAuthConfig: AuthConfig = {
|
|
28
28
|
ensureFreshness: true,
|
|
29
|
+
persist: true,
|
|
29
30
|
ssr: true,
|
|
30
31
|
};
|
|
31
32
|
|
|
@@ -36,5 +37,6 @@ export interface AuthConfig {
|
|
|
36
37
|
ensureFreshness?: boolean;
|
|
37
38
|
loginRoute?: string;
|
|
38
39
|
messageHandlerKeys?: string[];
|
|
40
|
+
persist?: boolean;
|
|
39
41
|
ssr?: boolean;
|
|
40
42
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* File Created: 08-11-2022 14:10:44
|
|
5
5
|
* Author: Clay Risser
|
|
6
6
|
* -----
|
|
7
|
-
* Last Modified:
|
|
7
|
+
* Last Modified: 24-04-2023 17:50:36
|
|
8
8
|
* Modified By: Clay Risser
|
|
9
9
|
* -----
|
|
10
10
|
* Risser Labs LLC (c) Copyright 2021 - 2022
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
* limitations under the License.
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
-
import type { KeycloakResourceAccess, KeycloakRoles, KeycloakTokenParsed } from 'keycloak-js';
|
|
25
|
+
import type { KeycloakResourceAccess, KeycloakRoles, KeycloakTokenParsed } from '@bitspur/keycloak-js';
|
|
26
26
|
export * from './useKeycloak';
|
|
27
27
|
|
|
28
28
|
export interface IKeycloak {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* File Created: 08-11-2022 14:10:25
|
|
5
5
|
* Author: Clay Risser
|
|
6
6
|
* -----
|
|
7
|
-
* Last Modified: 24-
|
|
7
|
+
* Last Modified: 24-04-2023 17:50:55
|
|
8
8
|
* Modified By: Clay Risser
|
|
9
9
|
* -----
|
|
10
10
|
* Risser Labs LLC (c) Copyright 2021 - 2022
|
|
@@ -26,7 +26,7 @@ import atob from 'core-js-pure/stable/atob';
|
|
|
26
26
|
import escape from 'core-js-pure/stable/escape';
|
|
27
27
|
import type { AuthRequestPromptOptions, AuthSessionResult } from 'expo-auth-session';
|
|
28
28
|
import type { IKeycloak } from './index';
|
|
29
|
-
import type { KeycloakResourceAccess, KeycloakRoles, KeycloakTokenParsed } from 'keycloak-js';
|
|
29
|
+
import type { KeycloakResourceAccess, KeycloakRoles, KeycloakTokenParsed } from '@bitspur/keycloak-js';
|
|
30
30
|
import { MultiPlatform } from 'multiplatform.one';
|
|
31
31
|
import { useKeycloak as useExpoKeycloak } from 'expo-keycloak-auth';
|
|
32
32
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* File Created: 08-11-2022 06:04:59
|
|
5
5
|
* Author: Clay Risser
|
|
6
6
|
* -----
|
|
7
|
-
* Last Modified:
|
|
7
|
+
* Last Modified: 25-04-2023 23:18:16
|
|
8
8
|
* Modified By: Clay Risser
|
|
9
9
|
* -----
|
|
10
10
|
* Risser Labs LLC (c) Copyright 2021 - 2022
|
|
@@ -22,24 +22,23 @@
|
|
|
22
22
|
* limitations under the License.
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
-
import type Keycloak from 'keycloak-js';
|
|
25
|
+
import type Keycloak from '@bitspur/keycloak-js';
|
|
26
26
|
import type { IKeycloak } from './index';
|
|
27
27
|
import { MultiPlatform } from 'multiplatform.one';
|
|
28
28
|
import { useAuthConfig } from '../useAuthConfig';
|
|
29
|
-
import { useKeycloak as useReactKeycloak } from '@react-keycloak
|
|
30
|
-
import { useKeycloak as useSsrKeycloak } from '@react-keycloak
|
|
29
|
+
import { useKeycloak as useReactKeycloak } from '@bitspur/react-keycloak-web';
|
|
30
|
+
import { useKeycloak as useSsrKeycloak } from '@bitspur/react-keycloak-ssr';
|
|
31
31
|
|
|
32
32
|
export function useKeycloak() {
|
|
33
33
|
const authConfig = useAuthConfig();
|
|
34
34
|
if (MultiPlatform.isStorybook) return { authenticated: true } as IKeycloak;
|
|
35
35
|
if (MultiPlatform.isNext && authConfig.ssr) {
|
|
36
36
|
const { keycloak: ssrKeycloak, initialized } = useSsrKeycloak();
|
|
37
|
-
const keycloak =
|
|
37
|
+
const keycloak = (ssrKeycloak || {}) as Keycloak;
|
|
38
38
|
if (!initialized) keycloak.authenticated = undefined;
|
|
39
39
|
return keycloak as IKeycloak;
|
|
40
40
|
}
|
|
41
|
-
const { keycloak
|
|
42
|
-
const keycloak = { ...reactKeycloak } as Keycloak;
|
|
41
|
+
const { keycloak, initialized } = useReactKeycloak();
|
|
43
42
|
if (!initialized) keycloak.authenticated = undefined;
|
|
44
43
|
return keycloak as IKeycloak;
|
|
45
44
|
}
|
package/src/hooks/useLogin.ts
CHANGED
|
@@ -41,7 +41,7 @@ export const AfterAuth: FC<AfterAuthProps> = ({ children }: AfterAuthProps) => {
|
|
|
41
41
|
|
|
42
42
|
useEffect(() => {
|
|
43
43
|
if (!authenticated) return;
|
|
44
|
-
if (token) {
|
|
44
|
+
if (authConfig.persist && token) {
|
|
45
45
|
authState.setToken(token);
|
|
46
46
|
if (idToken) authState.setIdToken(idToken);
|
|
47
47
|
if (authConfig.ensureFreshness && refreshToken) authState.setRefreshToken(refreshToken);
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
|
|
25
25
|
import React from 'react';
|
|
26
26
|
import type { FC } from 'react';
|
|
27
|
-
import type { KeycloakConfig } from 'keycloak-js';
|
|
27
|
+
import type { KeycloakConfig } from '@bitspur/keycloak-js';
|
|
28
28
|
import type { KeycloakProviderProps } from './keycloakProvider';
|
|
29
29
|
import { AfterAuth } from './afterAuth';
|
|
30
30
|
import { KeycloakProvider as ExpoKeycloakProvider } from 'expo-keycloak-auth';
|
|
@@ -22,14 +22,14 @@
|
|
|
22
22
|
* limitations under the License.
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
-
import Keycloak from 'keycloak-js';
|
|
25
|
+
import Keycloak from '@bitspur/keycloak-js';
|
|
26
26
|
import React, { useMemo, useEffect, useState } from 'react';
|
|
27
|
-
import type {
|
|
28
|
-
import type {
|
|
27
|
+
import type { KeycloakInitOptions } from '@bitspur/keycloak-js';
|
|
28
|
+
import type { ReactNode, ComponentType } from 'react';
|
|
29
29
|
import { AfterAuth } from './afterAuth';
|
|
30
30
|
import { MultiPlatform } from 'multiplatform.one';
|
|
31
|
-
import { ReactKeycloakProvider } from '@react-keycloak
|
|
32
|
-
import { SSRKeycloakProvider, SSRCookies } from '@react-keycloak
|
|
31
|
+
import { ReactKeycloakProvider } from '@bitspur/react-keycloak-web';
|
|
32
|
+
import { SSRKeycloakProvider, SSRCookies } from '@bitspur/react-keycloak-ssr';
|
|
33
33
|
import { useAuthConfig } from '../hooks/useAuthConfig';
|
|
34
34
|
import { useAuthState } from '../state';
|
|
35
35
|
import { useRouter } from 'next/router';
|
|
@@ -46,27 +46,28 @@ export interface KeycloakProviderProps {
|
|
|
46
46
|
|
|
47
47
|
const logger = console;
|
|
48
48
|
|
|
49
|
-
export
|
|
49
|
+
export function KeycloakProvider({
|
|
50
50
|
children,
|
|
51
51
|
cookies,
|
|
52
52
|
debug,
|
|
53
53
|
keycloakConfig,
|
|
54
54
|
keycloakInitOptions,
|
|
55
55
|
loadingComponent,
|
|
56
|
-
}: KeycloakProviderProps)
|
|
56
|
+
}: KeycloakProviderProps) {
|
|
57
57
|
const authState = useAuthState();
|
|
58
58
|
const LoadingComponent = loadingComponent || (() => <>{debug ? 'authenticating' : null}</>);
|
|
59
59
|
const { query } = MultiPlatform.isNext ? useRouter() : { query: {} };
|
|
60
60
|
const authConfig = useAuthConfig();
|
|
61
61
|
const [idToken, setIdToken] = useState<string | boolean>(
|
|
62
|
-
('idToken' in query && (query.idToken?.toString() || true)) || authState.idToken || false,
|
|
62
|
+
('idToken' in query && (query.idToken?.toString() || true)) || (authConfig.persist && authState.idToken) || false,
|
|
63
63
|
);
|
|
64
64
|
const [token, setToken] = useState<string | boolean>(
|
|
65
|
-
('token' in query && (query.token?.toString() || true)) || authState.token || false,
|
|
65
|
+
('token' in query && (query.token?.toString() || true)) || (authConfig.persist && authState.token) || false,
|
|
66
66
|
);
|
|
67
67
|
const [refreshToken, setRefreshToken] = useState<string | boolean>(
|
|
68
68
|
(authConfig.ensureFreshness &&
|
|
69
|
-
(('refreshToken' in query && (query.refreshToken?.toString() || true)) ||
|
|
69
|
+
(('refreshToken' in query && (query.refreshToken?.toString() || true)) ||
|
|
70
|
+
(authConfig.persist && authState.refreshToken))) ||
|
|
70
71
|
false,
|
|
71
72
|
);
|
|
72
73
|
const explicitToken = 'idToken' in query || 'token' in query || 'refreshToken' in query;
|
|
@@ -184,6 +185,7 @@ export const KeycloakProvider: FC<KeycloakProviderProps> = ({
|
|
|
184
185
|
...defaultKeycloakInitOptions,
|
|
185
186
|
...keycloakInitOptions,
|
|
186
187
|
};
|
|
188
|
+
if (debug) initOptions.enableLogging = true;
|
|
187
189
|
if (token && typeof token === 'string') {
|
|
188
190
|
initOptions.token = token;
|
|
189
191
|
if (idToken && typeof idToken === 'string') initOptions.idToken = idToken;
|
|
@@ -196,7 +198,7 @@ export const KeycloakProvider: FC<KeycloakProviderProps> = ({
|
|
|
196
198
|
return initOptions;
|
|
197
199
|
}, [keycloakInitOptions, token, refreshToken, idToken]);
|
|
198
200
|
|
|
199
|
-
if (token === true || refreshToken === true) return <LoadingComponent />;
|
|
201
|
+
if (token === true || idToken === true || refreshToken === true) return <LoadingComponent />;
|
|
200
202
|
if (cookies && authConfig.ssr) {
|
|
201
203
|
return (
|
|
202
204
|
// @ts-ignore
|
|
@@ -220,7 +222,7 @@ export const KeycloakProvider: FC<KeycloakProviderProps> = ({
|
|
|
220
222
|
<AfterAuth>{children}</AfterAuth>
|
|
221
223
|
</ReactKeycloakProvider>
|
|
222
224
|
);
|
|
223
|
-
}
|
|
225
|
+
}
|
|
224
226
|
|
|
225
227
|
export interface KeycloakConfig {
|
|
226
228
|
clientId: string;
|