@multiplatform.one/keycloak 0.2.1 → 0.2.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.
- 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.map +1 -1
- package/dist/esm/provider/afterAuth.mjs +21 -7
- package/dist/esm/provider/afterAuth.mjs.map +2 -2
- package/dist/esm/provider/keycloakProvider.mjs +45 -7
- package/dist/esm/provider/keycloakProvider.mjs.map +2 -2
- package/dist/esm/state/index.mjs +3 -2
- package/dist/esm/state/index.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.map +1 -1
- package/dist/jsx/provider/afterAuth.mjs +21 -7
- package/dist/jsx/provider/afterAuth.mjs.map +2 -2
- package/dist/jsx/provider/keycloakProvider.mjs +45 -5
- package/dist/jsx/provider/keycloakProvider.mjs.map +2 -2
- package/dist/jsx/state/index.mjs +3 -2
- package/dist/jsx/state/index.mjs.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 -1
- 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.map +1 -1
- package/dist/lib/provider/afterAuth.js +21 -7
- package/dist/lib/provider/afterAuth.js.map +2 -2
- package/dist/lib/provider/keycloakProvider.js +49 -9
- package/dist/lib/provider/keycloakProvider.js.map +3 -3
- package/dist/lib/state/index.d.ts +5 -3
- package/dist/lib/state/index.js +3 -2
- package/dist/lib/state/index.js.map +2 -2
- package/dist/lib/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/authConfig.ts +3 -1
- package/src/hooks/useKeycloak/index.ts +2 -1
- package/src/hooks/useKeycloak/useKeycloak.ts +1 -1
- package/src/provider/afterAuth.tsx +20 -7
- package/src/provider/keycloakProvider.tsx +42 -5
- package/src/state/index.ts +3 -2
package/package.json
CHANGED
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: 17-04-2023 22:55:41
|
|
8
8
|
* Modified By: Clay Risser
|
|
9
9
|
* -----
|
|
10
10
|
* Risser Labs LLC (c) Copyright 2021 - 2022
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
import { createContext } from 'react';
|
|
26
26
|
|
|
27
27
|
export const defaultAuthConfig: AuthConfig = {
|
|
28
|
+
ensureFreshness: true,
|
|
28
29
|
ssr: true,
|
|
29
30
|
};
|
|
30
31
|
|
|
@@ -32,6 +33,7 @@ export const AuthConfigContext = createContext<AuthConfig>(defaultAuthConfig);
|
|
|
32
33
|
|
|
33
34
|
export interface AuthConfig {
|
|
34
35
|
debug?: boolean;
|
|
36
|
+
ensureFreshness?: boolean;
|
|
35
37
|
loginRoute?: string;
|
|
36
38
|
messageHandlerKeys?: string[];
|
|
37
39
|
ssr?: boolean;
|
|
@@ -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: 18-04-2023 00:28:11
|
|
8
8
|
* Modified By: Clay Risser
|
|
9
9
|
* -----
|
|
10
10
|
* Risser Labs LLC (c) Copyright 2021 - 2022
|
|
@@ -27,6 +27,7 @@ export * from './useKeycloak';
|
|
|
27
27
|
|
|
28
28
|
export interface IKeycloak {
|
|
29
29
|
authenticated?: boolean;
|
|
30
|
+
idToken?: string;
|
|
30
31
|
realmAccess?: KeycloakRoles;
|
|
31
32
|
refreshToken?: string;
|
|
32
33
|
refreshTokenParsed?: KeycloakTokenParsed;
|
|
@@ -36,20 +36,33 @@ const logger = console;
|
|
|
36
36
|
|
|
37
37
|
export const AfterAuth: FC<AfterAuthProps> = ({ children }: AfterAuthProps) => {
|
|
38
38
|
const authConfig = useAuthConfig();
|
|
39
|
-
const { token, refreshToken, authenticated } = useKeycloak();
|
|
39
|
+
const { token, refreshToken, authenticated, idToken } = useKeycloak();
|
|
40
40
|
const authState = useAuthState();
|
|
41
41
|
|
|
42
42
|
useEffect(() => {
|
|
43
43
|
if (!authenticated) return;
|
|
44
44
|
if (token) {
|
|
45
45
|
authState.setToken(token);
|
|
46
|
-
if (
|
|
46
|
+
if (idToken) authState.setIdToken(idToken);
|
|
47
|
+
if (authConfig.ensureFreshness && refreshToken) authState.setRefreshToken(refreshToken);
|
|
47
48
|
}
|
|
48
|
-
}, [token, refreshToken]);
|
|
49
|
+
}, [token, refreshToken, idToken]);
|
|
50
|
+
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
if (authConfig.debug && authState.token) logger.debug('token', authState.token);
|
|
53
|
+
}, [authState.token]);
|
|
54
|
+
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
if (authConfig.debug && authState.idToken) logger.debug('idToken', authState.idToken);
|
|
57
|
+
}, [authState.idToken]);
|
|
58
|
+
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
if (authConfig.debug && authState.refreshToken) logger.debug(authState.refreshToken);
|
|
61
|
+
}, [authState.refreshToken]);
|
|
62
|
+
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
if (authConfig.debug) logger.debug('authenticated', authenticated);
|
|
65
|
+
}, [authenticated]);
|
|
49
66
|
|
|
50
|
-
if (authConfig.debug) {
|
|
51
|
-
logger.debug('authenticated', authenticated);
|
|
52
|
-
logger.debug('token', token);
|
|
53
|
-
}
|
|
54
67
|
return <>{children}</>;
|
|
55
68
|
};
|
|
@@ -58,15 +58,20 @@ export const KeycloakProvider: FC<KeycloakProviderProps> = ({
|
|
|
58
58
|
const LoadingComponent = loadingComponent || (() => <>{debug ? 'authenticating' : null}</>);
|
|
59
59
|
const { query } = MultiPlatform.isNext ? useRouter() : { query: {} };
|
|
60
60
|
const authConfig = useAuthConfig();
|
|
61
|
+
const [idToken, setIdToken] = useState<string | boolean>(
|
|
62
|
+
('idToken' in query && (query.idToken?.toString() || true)) || authState.idToken || false,
|
|
63
|
+
);
|
|
61
64
|
const [token, setToken] = useState<string | boolean>(
|
|
62
65
|
('token' in query && (query.token?.toString() || true)) || authState.token || false,
|
|
63
66
|
);
|
|
64
67
|
const [refreshToken, setRefreshToken] = useState<string | boolean>(
|
|
65
|
-
(
|
|
68
|
+
(authConfig.ensureFreshness &&
|
|
69
|
+
(('refreshToken' in query && (query.refreshToken?.toString() || true)) || authState.refreshToken)) ||
|
|
70
|
+
false,
|
|
66
71
|
);
|
|
67
72
|
|
|
68
73
|
useEffect(() => {
|
|
69
|
-
if (token !== true && refreshToken !== true) return;
|
|
74
|
+
if (token !== true && refreshToken !== true && idToken !== true) return;
|
|
70
75
|
if (debug) logger.debug('post message', { type: 'LOADED' });
|
|
71
76
|
(authConfig.messageHandlerKeys || []).forEach((key: string) => {
|
|
72
77
|
window?.webkit?.messageHandlers?.[key]?.postMessage(JSON.stringify({ type: 'LOADED' }));
|
|
@@ -92,11 +97,41 @@ export const KeycloakProvider: FC<KeycloakProviderProps> = ({
|
|
|
92
97
|
setToken(message.payload);
|
|
93
98
|
}
|
|
94
99
|
};
|
|
95
|
-
if (debug)
|
|
100
|
+
if (debug) {
|
|
96
101
|
logger.debug('listening for message', {
|
|
97
102
|
type: 'TOKEN',
|
|
98
103
|
payload: '<some_token>',
|
|
99
104
|
});
|
|
105
|
+
}
|
|
106
|
+
window.addEventListener('message', messageCallback);
|
|
107
|
+
return () => {
|
|
108
|
+
window.removeEventListener('message', messageCallback);
|
|
109
|
+
};
|
|
110
|
+
}, []);
|
|
111
|
+
|
|
112
|
+
useEffect(() => {
|
|
113
|
+
if (idToken !== true) return;
|
|
114
|
+
const messageCallback = (e: MessageEvent<any>) => {
|
|
115
|
+
let data = e?.data;
|
|
116
|
+
if (typeof data === 'string') {
|
|
117
|
+
try {
|
|
118
|
+
data = JSON.parse(data);
|
|
119
|
+
} catch (err) {}
|
|
120
|
+
}
|
|
121
|
+
if (debug) logger.debug('received message', data);
|
|
122
|
+
const message: MessageSchema = data;
|
|
123
|
+
if (!message.type) return;
|
|
124
|
+
if (message.type.toUpperCase() === 'ID_TOKEN' && message.payload) {
|
|
125
|
+
if (debug) logger.debug('setting id token', message.payload);
|
|
126
|
+
setIdToken(message.payload);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
if (debug) {
|
|
130
|
+
logger.debug('listening for message', {
|
|
131
|
+
type: 'ID_TOKEN',
|
|
132
|
+
payload: '<some_id_token>',
|
|
133
|
+
});
|
|
134
|
+
}
|
|
100
135
|
window.addEventListener('message', messageCallback);
|
|
101
136
|
return () => {
|
|
102
137
|
window.removeEventListener('message', messageCallback);
|
|
@@ -120,11 +155,12 @@ export const KeycloakProvider: FC<KeycloakProviderProps> = ({
|
|
|
120
155
|
setRefreshToken(message.payload);
|
|
121
156
|
}
|
|
122
157
|
};
|
|
123
|
-
if (debug)
|
|
158
|
+
if (debug) {
|
|
124
159
|
logger.debug('listening for message', {
|
|
125
160
|
type: 'REFRESH_TOKEN',
|
|
126
161
|
payload: '<some_refresh_token>',
|
|
127
162
|
});
|
|
163
|
+
}
|
|
128
164
|
window.addEventListener('message', messageCallback);
|
|
129
165
|
return () => {
|
|
130
166
|
window.removeEventListener('message', messageCallback);
|
|
@@ -147,6 +183,7 @@ export const KeycloakProvider: FC<KeycloakProviderProps> = ({
|
|
|
147
183
|
...defaultKeycloakInitOptions,
|
|
148
184
|
...keycloakInitOptions,
|
|
149
185
|
};
|
|
186
|
+
if (idToken && typeof idToken === 'string') initOptions.idToken = idToken;
|
|
150
187
|
if (token && typeof token === 'string') {
|
|
151
188
|
initOptions.token = token;
|
|
152
189
|
if (refreshToken && typeof refreshToken === 'string') initOptions.refreshToken = refreshToken;
|
|
@@ -154,7 +191,7 @@ export const KeycloakProvider: FC<KeycloakProviderProps> = ({
|
|
|
154
191
|
initOptions.onLoad = undefined;
|
|
155
192
|
}
|
|
156
193
|
return initOptions;
|
|
157
|
-
}, [keycloakInitOptions, token, refreshToken]);
|
|
194
|
+
}, [keycloakInitOptions, token, refreshToken, idToken]);
|
|
158
195
|
|
|
159
196
|
if (token === true || refreshToken === true) return <LoadingComponent />;
|
|
160
197
|
if (cookies && authConfig.ssr) {
|
package/src/state/index.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* File Created: 22-11-2022 17:40:53
|
|
5
5
|
* Author: Clay Risser
|
|
6
6
|
* -----
|
|
7
|
-
* Last Modified:
|
|
7
|
+
* Last Modified: 18-04-2023 00:27:22
|
|
8
8
|
* Modified By: Clay Risser
|
|
9
9
|
* -----
|
|
10
10
|
* Risser Labs LLC (c) Copyright 2021 - 2022
|
|
@@ -27,8 +27,9 @@ import { createStateStore } from 'multiplatform.one/zustand';
|
|
|
27
27
|
const { useStore } = createStateStore(
|
|
28
28
|
'auth',
|
|
29
29
|
{
|
|
30
|
-
|
|
30
|
+
idToken: '',
|
|
31
31
|
refreshToken: '',
|
|
32
|
+
token: '',
|
|
32
33
|
},
|
|
33
34
|
undefined,
|
|
34
35
|
{ persist: true },
|