@multiplatform.one/keycloak 0.3.1 → 0.3.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multiplatform.one/keycloak",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "keycloak client for multiplatform.one ecosystem",
5
5
  "main": "dist/lib",
6
6
  "module": "dist/esm",
@@ -74,7 +74,7 @@ export const AuthProvider: FC<AuthProviderProps> = ({
74
74
  ensureFreshness,
75
75
  loginRoute,
76
76
  messageHandlerKeys,
77
- persist,
77
+ persist: ssr ? false : persist,
78
78
  ssr,
79
79
  }),
80
80
  [debug, ensureFreshness, loginRoute, messageHandlerKeys, persist, ssr],
@@ -60,16 +60,25 @@ export function KeycloakProvider({
60
60
  const authState = useAuthState();
61
61
  const LoadingComponent = loadingComponent || (() => <>{debug ? 'authenticating' : null}</>);
62
62
  const { query } = MultiPlatform.isNext ? useRouter() : { query: {} };
63
+ const [refreshToken, setRefreshToken] = useState<string | boolean>(
64
+ validToken(
65
+ (ensureFreshness &&
66
+ (('refreshToken' in query && (query.refreshToken?.toString() || true)) ||
67
+ (persist && authState.refreshToken))) ||
68
+ false,
69
+ ),
70
+ );
63
71
  const [idToken, setIdToken] = useState<string | boolean>(
64
- ('idToken' in query && (query.idToken?.toString() || true)) || (persist && authState.idToken) || false,
72
+ validToken(
73
+ ('idToken' in query && (query.idToken?.toString() || true)) || (persist && authState.idToken) || false,
74
+ refreshToken,
75
+ ),
65
76
  );
66
77
  const [token, setToken] = useState<string | boolean>(
67
- ('token' in query && (query.token?.toString() || true)) || (persist && authState.token) || false,
68
- );
69
- const [refreshToken, setRefreshToken] = useState<string | boolean>(
70
- (ensureFreshness &&
71
- (('refreshToken' in query && (query.refreshToken?.toString() || true)) || (persist && authState.refreshToken))) ||
72
- false,
78
+ validToken(
79
+ ('token' in query && (query.token?.toString() || true)) || (persist && authState.token) || false,
80
+ refreshToken,
81
+ ),
73
82
  );
74
83
  const explicitToken = 'idToken' in query || 'token' in query || 'refreshToken' in query;
75
84
 
@@ -84,15 +93,9 @@ export function KeycloakProvider({
84
93
  }, []);
85
94
 
86
95
  useEffect(() => {
87
- if (typeof idToken === 'string' && !isTokenValid(idToken)) setIdToken(false);
88
- if (typeof refreshToken === 'string' && !isTokenValid(refreshToken)) setRefreshToken(false);
89
- if (typeof token === 'string' && !isTokenValid(token)) setToken(false);
90
- }, [idToken, token, refreshToken]);
91
-
92
- useEffect(() => {
93
- if (token !== true) return;
96
+ if (refreshToken !== true) return;
94
97
  const messageCallback = (e: MessageEvent<any>) => {
95
- let data = e?.data;
98
+ let data = e?.data || null;
96
99
  if (typeof data === 'string') {
97
100
  try {
98
101
  data = JSON.parse(data);
@@ -101,15 +104,15 @@ export function KeycloakProvider({
101
104
  if (debug) logger.debug('received message', data);
102
105
  const message: MessageSchema = data;
103
106
  if (!message.type) return;
104
- if (message.type.toUpperCase() === 'TOKEN' && message.payload) {
105
- if (debug) logger.debug('setting token', message.payload);
106
- setToken(message.payload);
107
+ if (message.type.toUpperCase() === 'REFRESH_TOKEN' && message.payload) {
108
+ if (debug) logger.debug('setting refresh token', message.payload);
109
+ setRefreshToken(validToken(message.payload));
107
110
  }
108
111
  };
109
112
  if (debug) {
110
113
  logger.debug('listening for message', {
111
- type: 'TOKEN',
112
- payload: '<some_token>',
114
+ type: 'REFRESH_TOKEN',
115
+ payload: '<some_refresh_token>',
113
116
  });
114
117
  }
115
118
  window.addEventListener('message', messageCallback);
@@ -119,9 +122,9 @@ export function KeycloakProvider({
119
122
  }, []);
120
123
 
121
124
  useEffect(() => {
122
- if (idToken !== true) return;
125
+ if (token !== true) return;
123
126
  const messageCallback = (e: MessageEvent<any>) => {
124
- let data = e?.data;
127
+ let data = e?.data || null;
125
128
  if (typeof data === 'string') {
126
129
  try {
127
130
  data = JSON.parse(data);
@@ -130,15 +133,15 @@ export function KeycloakProvider({
130
133
  if (debug) logger.debug('received message', data);
131
134
  const message: MessageSchema = data;
132
135
  if (!message.type) return;
133
- if (message.type.toUpperCase() === 'ID_TOKEN' && message.payload) {
134
- if (debug) logger.debug('setting id token', message.payload);
135
- setIdToken(message.payload);
136
+ if (message.type.toUpperCase() === 'TOKEN' && message.payload) {
137
+ if (debug) logger.debug('setting token', message.payload);
138
+ setToken(validToken(message.payload, refreshToken));
136
139
  }
137
140
  };
138
141
  if (debug) {
139
142
  logger.debug('listening for message', {
140
- type: 'ID_TOKEN',
141
- payload: '<some_id_token>',
143
+ type: 'TOKEN',
144
+ payload: '<some_token>',
142
145
  });
143
146
  }
144
147
  window.addEventListener('message', messageCallback);
@@ -148,9 +151,9 @@ export function KeycloakProvider({
148
151
  }, []);
149
152
 
150
153
  useEffect(() => {
151
- if (refreshToken !== true) return;
154
+ if (idToken !== true) return;
152
155
  const messageCallback = (e: MessageEvent<any>) => {
153
- let data = e?.data;
156
+ let data = e?.data || null;
154
157
  if (typeof data === 'string') {
155
158
  try {
156
159
  data = JSON.parse(data);
@@ -159,15 +162,15 @@ export function KeycloakProvider({
159
162
  if (debug) logger.debug('received message', data);
160
163
  const message: MessageSchema = data;
161
164
  if (!message.type) return;
162
- if (message.type.toUpperCase() === 'REFRESH_TOKEN' && message.payload) {
163
- if (debug) logger.debug('setting refresh token', message.payload);
164
- setRefreshToken(message.payload);
165
+ if (message.type.toUpperCase() === 'ID_TOKEN' && message.payload) {
166
+ if (debug) logger.debug('setting id token', message.payload);
167
+ setIdToken(validToken(message.payload, refreshToken));
165
168
  }
166
169
  };
167
170
  if (debug) {
168
171
  logger.debug('listening for message', {
169
- type: 'REFRESH_TOKEN',
170
- payload: '<some_refresh_token>',
172
+ type: 'ID_TOKEN',
173
+ payload: '<some_id_token>',
171
174
  });
172
175
  }
173
176
  window.addEventListener('message', messageCallback);
@@ -253,7 +256,16 @@ export function KeycloakProvider({
253
256
  );
254
257
  }
255
258
 
256
- export function isTokenValid(token: string) {
259
+ function validToken(token: string | boolean, refreshToken?: string | boolean) {
260
+ if (typeof token !== 'string') return token;
261
+ if (refreshToken) {
262
+ if (refreshToken === true || isTokenValid(refreshToken)) return token;
263
+ return false;
264
+ }
265
+ return isTokenValid(token) ? token : false;
266
+ }
267
+
268
+ function isTokenValid(token: string) {
257
269
  try {
258
270
  const { exp } = JSON.parse(Buffer.from(token.split('.')?.[1] || '', 'base64').toString() || '{}');
259
271
  return Math.floor(Date.now() / 1000) <= exp;