Skip to content

Commit 0d48101

Browse files
committed
Revert ":bug: Fix session expiry when refresh tokens are disabled (#1614)"
This reverts commit eea7835. Signed-off-by: Fabian von Feilitzsch <[email protected]>
1 parent eea7835 commit 0d48101

File tree

3 files changed

+91
-51
lines changed

3 files changed

+91
-51
lines changed
+5-34
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,14 @@
11
import axios from "axios";
2-
import keycloak from "@app/keycloak";
32

4-
export const initInterceptors = () => {
3+
export const initInterceptors = (getToken: () => Promise<string>) => {
54
axios.interceptors.request.use(
6-
(config) => {
7-
const token = keycloak.token;
8-
if (token) {
9-
config.headers.Authorization = `Bearer ${token}`;
10-
}
5+
async (config) => {
6+
const token = await getToken();
7+
if (token) config.headers["Authorization"] = "Bearer " + token;
118
return config;
129
},
1310
(error) => {
14-
return Promise.reject(error);
15-
}
16-
);
17-
18-
axios.interceptors.response.use(
19-
(response) => {
20-
return response;
21-
},
22-
async (error) => {
23-
if (error.response && error.response.status === 401) {
24-
try {
25-
const refreshed = await keycloak.updateToken(5);
26-
if (refreshed) {
27-
const retryConfig = {
28-
...error.config,
29-
headers: {
30-
...error.config.headers,
31-
Authorization: `Bearer ${keycloak.token}`,
32-
},
33-
};
34-
return axios(retryConfig);
35-
}
36-
} catch (refreshError) {
37-
keycloak.login();
38-
}
39-
}
40-
return Promise.reject(error);
11+
Promise.reject(error);
4112
}
4213
);
4314
};
+83-15
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
import React, { Suspense } from "react";
2-
import { ReactKeycloakProvider } from "@react-keycloak/web";
1+
import { initInterceptors } from "@app/axios-config";
2+
import { isAuthRequired } from "@app/Constants";
3+
import i18n from "@app/i18n";
34
import keycloak from "@app/keycloak";
5+
import { deleteCookie, getCookie, setCookie } from "@app/queries/cookies";
46
import { AppPlaceholder } from "./AppPlaceholder";
5-
import { initInterceptors } from "@app/axios-config";
7+
import { Flex, FlexItem, Spinner } from "@patternfly/react-core";
8+
import { ReactKeycloakProvider } from "@react-keycloak/web";
9+
import React, { Suspense } from "react";
610

711
interface IKeycloakProviderProps {
812
children: React.ReactNode;
@@ -11,17 +15,81 @@ interface IKeycloakProviderProps {
1115
export const KeycloakProvider: React.FC<IKeycloakProviderProps> = ({
1216
children,
1317
}) => {
14-
React.useEffect(() => {
15-
initInterceptors();
16-
}, []);
18+
const checkAuthCookie = () => {
19+
if (!getCookie("keycloak_cookie") && keycloak?.token) {
20+
setCookie("keycloak_cookie", keycloak.token, 365);
21+
}
22+
};
23+
if (isAuthRequired) {
24+
return (
25+
<>
26+
<ReactKeycloakProvider
27+
authClient={keycloak}
28+
initOptions={{ onLoad: "login-required" }}
29+
LoadingComponent={
30+
<Flex
31+
spaceItems={{ default: "spaceItemsSm" }}
32+
alignItems={{ default: "alignItemsCenter" }}
33+
flexWrap={{ default: "nowrap" }}
34+
style={{
35+
width: "100%",
36+
height: "100%",
37+
}}
38+
>
39+
<FlexItem
40+
style={{
41+
margin: "auto auto",
42+
textAlign: "center",
43+
}}
44+
>
45+
<Spinner>Loading...</Spinner>
46+
</FlexItem>
47+
</Flex>
48+
}
49+
isLoadingCheck={(keycloak) => {
50+
if (keycloak.authenticated) {
51+
initInterceptors(
52+
() =>
53+
new Promise<string>((resolve, reject) => {
54+
if (keycloak.token) {
55+
if (keycloak.refreshToken) {
56+
keycloak
57+
.updateToken(60)
58+
.then(() => {
59+
deleteCookie("keycloak_cookie");
60+
checkAuthCookie();
61+
return resolve(keycloak.token!);
62+
})
63+
.catch((err) => {
64+
console.log("err", err);
65+
return reject("Failed to refresh token");
66+
});
67+
} else return resolve(keycloak.token!);
68+
} else {
69+
keycloak.login();
70+
reject("Not logged in");
71+
}
72+
})
73+
);
74+
75+
const kcLocale = (keycloak.tokenParsed as any)["locale"];
76+
if (kcLocale) {
77+
i18n.changeLanguage(kcLocale);
78+
}
79+
}
1780

18-
return (
19-
<ReactKeycloakProvider
20-
authClient={keycloak}
21-
initOptions={{ onLoad: "login-required" }}
22-
LoadingComponent={<AppPlaceholder />}
23-
>
24-
<Suspense fallback={<AppPlaceholder />}>{children}</Suspense>
25-
</ReactKeycloakProvider>
26-
);
81+
return !keycloak.authenticated;
82+
}}
83+
>
84+
{children}
85+
</ReactKeycloakProvider>
86+
</>
87+
);
88+
} else {
89+
return (
90+
<>
91+
<Suspense fallback={<AppPlaceholder />}>{children}</Suspense>
92+
</>
93+
);
94+
}
2795
};

client/src/app/layout/HeaderApp/SSOMenu.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@ export const SSOMenu: React.FC = () => {
4545
id="sso-actions-toggle"
4646
onClick={() => onDropdownToggle(!isDropdownOpen)}
4747
>
48-
{(keycloak?.idTokenParsed as any)?.["preferred_username"] ??
49-
"DefaultUsername"}
48+
{(keycloak?.idTokenParsed as any)["preferred_username"]}
5049
</MenuToggle>
5150
)}
5251
>
@@ -64,6 +63,8 @@ export const SSOMenu: React.FC = () => {
6463
id="logout"
6564
key="sso_logout"
6665
onClick={() => {
66+
// Clears selected persona from storage without updating it in React state so we don't re-render the persona selector while logging out.
67+
// We have to clear it before logout because the redirect can happen before the logout promise resolves.
6768
window.localStorage.removeItem(
6869
LocalStorageKey.selectedPersona
6970
);

0 commit comments

Comments
 (0)