fix: loggin out keeps refresh token in browser

fix: https://github.com/canove/whaticket/issues/106
This commit is contained in:
canove
2021-01-15 11:56:28 -03:00
parent e6e9ac213f
commit 74e17a9f04
8 changed files with 59 additions and 29 deletions

View File

@@ -31,9 +31,21 @@ export const update = async (
throw new AppError("ERR_SESSION_EXPIRED", 401); throw new AppError("ERR_SESSION_EXPIRED", 401);
} }
const { user, newToken, refreshToken } = await RefreshTokenService(token); const { user, newToken, refreshToken } = await RefreshTokenService(
res,
token
);
SendRefreshToken(res, refreshToken); SendRefreshToken(res, refreshToken);
return res.json({ token: newToken, user }); return res.json({ token: newToken, user });
}; };
export const remove = async (
req: Request,
res: Response
): Promise<Response> => {
res.clearCookie("jrt");
return res.send();
};

View File

@@ -1,6 +1,7 @@
import { Router } from "express"; import { Router } from "express";
import * as SessionController from "../controllers/SessionController"; import * as SessionController from "../controllers/SessionController";
import * as UserController from "../controllers/UserController"; import * as UserController from "../controllers/UserController";
import isAuth from "../middleware/isAuth";
const authRoutes = Router(); const authRoutes = Router();
@@ -10,4 +11,6 @@ authRoutes.post("/login", SessionController.store);
authRoutes.post("/refresh_token", SessionController.update); authRoutes.post("/refresh_token", SessionController.update);
authRoutes.delete("/logout", isAuth, SessionController.remove);
export default authRoutes; export default authRoutes;

View File

@@ -1,4 +1,5 @@
import { verify } from "jsonwebtoken"; import { verify } from "jsonwebtoken";
import { Response as Res } from "express";
import User from "../../models/User"; import User from "../../models/User";
import AppError from "../../errors/AppError"; import AppError from "../../errors/AppError";
@@ -20,20 +21,18 @@ interface Response {
refreshToken: string; refreshToken: string;
} }
export const RefreshTokenService = async (token: string): Promise<Response> => { export const RefreshTokenService = async (
let decoded; res: Res,
token: string
): Promise<Response> => {
try { try {
decoded = verify(token, authConfig.refreshSecret); const decoded = verify(token, authConfig.refreshSecret);
} catch (err) {
throw new AppError("ERR_SESSION_EXPIRED", 401);
}
const { id, tokenVersion } = decoded as RefreshTokenPayload; const { id, tokenVersion } = decoded as RefreshTokenPayload;
const user = await ShowUserService(id); const user = await ShowUserService(id);
if (user.tokenVersion !== tokenVersion) { if (user.tokenVersion !== tokenVersion) {
res.clearCookie("jrt");
throw new AppError("ERR_SESSION_EXPIRED", 401); throw new AppError("ERR_SESSION_EXPIRED", 401);
} }
@@ -41,4 +40,8 @@ export const RefreshTokenService = async (token: string): Promise<Response> => {
const refreshToken = createRefreshToken(user); const refreshToken = createRefreshToken(user);
return { user, newToken, refreshToken }; return { user, newToken, refreshToken };
} catch (err) {
res.clearCookie("jrt");
throw new AppError("ERR_SESSION_EXPIRED", 401);
}
}; };

View File

@@ -1,6 +1,6 @@
import React, { createContext } from "react"; import React, { createContext } from "react";
import useAuth from "./useAuth"; import useAuth from "../../hooks/useAuth.js";
const AuthContext = createContext(); const AuthContext = createContext();

View File

@@ -1,6 +1,6 @@
import React, { createContext } from "react"; import React, { createContext } from "react";
import useWhatsApps from "./useWhatsApps"; import useWhatsApps from "../../hooks/useWhatsApps";
const WhatsAppsContext = createContext(); const WhatsAppsContext = createContext();

View File

@@ -102,14 +102,21 @@ const useAuth = () => {
} }
}; };
const handleLogout = () => { const handleLogout = async () => {
setLoading(true); setLoading(true);
try {
await api.delete("/auth/logout");
setIsAuth(false); setIsAuth(false);
setUser({}); setUser({});
localStorage.removeItem("token"); localStorage.removeItem("token");
api.defaults.headers.Authorization = undefined; api.defaults.headers.Authorization = undefined;
setLoading(false); setLoading(false);
history.push("/login"); history.push("/login");
} catch (err) {
toastError(err);
setLoading(false);
}
}; };
return { isAuth, user, loading, handleLogin, handleLogout }; return { isAuth, user, loading, handleLogin, handleLogout };

View File

@@ -131,6 +131,11 @@ const LoggedInLayout = ({ children }) => {
handleCloseMenu(); handleCloseMenu();
}; };
const handleClickLogout = () => {
handleCloseMenu();
handleLogout();
};
if (loading) { if (loading) {
return <BackdropLoading />; return <BackdropLoading />;
} }
@@ -190,7 +195,7 @@ const LoggedInLayout = ({ children }) => {
> >
WhaTicket WhaTicket
</Typography> </Typography>
<NotificationsPopOver /> {user.id && <NotificationsPopOver />}
<div> <div>
<IconButton <IconButton
@@ -220,7 +225,7 @@ const LoggedInLayout = ({ children }) => {
<MenuItem onClick={handleOpenUserModal}> <MenuItem onClick={handleOpenUserModal}>
{i18n.t("mainDrawer.appBar.user.profile")} {i18n.t("mainDrawer.appBar.user.profile")}
</MenuItem> </MenuItem>
<MenuItem onClick={handleLogout}> <MenuItem onClick={handleClickLogout}>
{i18n.t("mainDrawer.appBar.user.logout")} {i18n.t("mainDrawer.appBar.user.logout")}
</MenuItem> </MenuItem>
</Menu> </Menu>