Fix signout refresh (#20)
* Merge to main (#17) * Fix sign up form bug * Add run.sh to run setup and run web app * Output node version * Update readme with run.sh * Fix file upload form to handle ota_update service * Enable file upload form Enable error boundary to catch React errors (#7) Fix warning for link noreferrer Include authorization header with file upload * Remove default localhost settings (#8) * Remove default localhost settings Replace with deployment settings * Fix for upload data format * Fix test data for last commit * Fix json link format and remove localhost default settings (#10) * Remove default localhost settings Replace with deployment settings * Fix for upload data format * Fix test data for last commit * Fix link data format * Fix link json again (#12) Use id token instead of access token * nginx things * Web Worker Sign Out and Use Go API (#13) * Calculate checksum and send with file upload * Limit file upload and display rejected file error * Add sign in timeout * Check auth token structure before setting Clean up * Use web worker timer to sign out Remove checksum Point to Go ota update * Remove checksum dependency * Use compute auth service and fix static code analyzer warnings (#15) * Clean up formatting * Use new compute_auth service Implment SSO Implement token refresh Clean up unit tests * Fix unit tests * Fix auth test Fix warnings * Update default settings for compute_auth * Change main UI layout and add VINs to add and upload forms (#16) * Add new upload update package form Add new add vehicle form Add new side menu layout Add new toolbar layout Update and add unit tests * Enable add get and add vehicles * Integration issues with ota_update service * Update get vehicle JSON format * Fix related unit test Add release notes field * Add StatusContext to display error and status messages * Handle api error json (#18) * Handle api error json * Fix get vehicles error handling Update .env.template Co-authored-by: Rafi Greenberg <rgreenberg@fiskerinc.com> * Fix sign out and refresh * Check for bad json Co-authored-by: Rafi Greenberg <rgreenberg@fiskerinc.com>
This commit is contained in:
@@ -11,11 +11,22 @@ export const UserProvider = ({ children }) => {
|
|||||||
let timer;
|
let timer;
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
try {
|
||||||
if (!localStorage) return;
|
if (!localStorage) return;
|
||||||
const t = JSON.parse(localStorage.getItem("token"));
|
const t = JSON.parse(localStorage.getItem("token"));
|
||||||
if (!t || !t.idToken || !t.idToken.jwtToken) return;
|
if (!t) return;
|
||||||
if (!t.idToken.payload || !t.idToken.payload.exp) return;
|
if (
|
||||||
|
!t.idToken ||
|
||||||
|
!t.idToken.jwtToken ||
|
||||||
|
!t.idToken.payload ||
|
||||||
|
!t.idToken.payload.exp
|
||||||
|
)
|
||||||
|
throw new Error("Invalid token");
|
||||||
setToken(t);
|
setToken(t);
|
||||||
|
} catch (e) {
|
||||||
|
document.location = signOut();
|
||||||
|
}
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -33,12 +44,6 @@ export const UserProvider = ({ children }) => {
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
const isError = (resp) => {
|
|
||||||
if (resp === null) return true;
|
|
||||||
if (resp && resp.error) return true;
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
const startSessionTimer = () => {
|
const startSessionTimer = () => {
|
||||||
const duration = 1000 * token.idToken.payload.exp - new Date().getTime();
|
const duration = 1000 * token.idToken.payload.exp - new Date().getTime();
|
||||||
if (!timer) {
|
if (!timer) {
|
||||||
@@ -46,8 +51,8 @@ export const UserProvider = ({ children }) => {
|
|||||||
timer.onMessage(async (e) => {
|
timer.onMessage(async (e) => {
|
||||||
if (e.data === "timeout") {
|
if (e.data === "timeout") {
|
||||||
const t = await refreshTokens();
|
const t = await refreshTokens();
|
||||||
if (!isError(t)) return;
|
if (t && !t.error) return;
|
||||||
signOut();
|
document.location = signOut();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -61,17 +66,15 @@ export const UserProvider = ({ children }) => {
|
|||||||
} = token;
|
} = token;
|
||||||
const result = await auth.verify(idToken);
|
const result = await auth.verify(idToken);
|
||||||
|
|
||||||
if (!result && !result.valid) {
|
if (!result || !result.valid) {
|
||||||
const t = await refreshTokens();
|
const t = await refreshTokens();
|
||||||
if (!isError(t)) return;
|
if (!t || t.error) throw new Error("Unable to refresh token");
|
||||||
signOut();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
startSessionTimer();
|
startSessionTimer();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
signOut();
|
|
||||||
setError(`Verify error. ${e.message}`);
|
setError(`Verify error. ${e.message}`);
|
||||||
|
document.location = signOut();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,10 @@ export default function MenuDrawer({ children }) {
|
|||||||
setOpen(false);
|
setOpen(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const onSignOut = () => {
|
||||||
|
document.location = signOut();
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classes.root}>
|
<div className={classes.root}>
|
||||||
<AppBar
|
<AppBar
|
||||||
@@ -59,7 +63,7 @@ export default function MenuDrawer({ children }) {
|
|||||||
{token !== null && (
|
{token !== null && (
|
||||||
<Button
|
<Button
|
||||||
color="inherit"
|
color="inherit"
|
||||||
onClick={signOut}
|
onClick={onSignOut}
|
||||||
className={classes.rightToolbar}
|
className={classes.rightToolbar}
|
||||||
>
|
>
|
||||||
Sign Out
|
Sign Out
|
||||||
|
|||||||
Reference in New Issue
Block a user