mirror of
https://github.com/cheveguerra/whaticket-community.git
synced 2026-04-20 20:59:16 +00:00
fix: loggin out keeps refresh token in browser
fix: https://github.com/canove/whaticket/issues/106
This commit is contained in:
@@ -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();
|
||||||
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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 };
|
||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user