Skip to content

Commit d911f2d

Browse files
committed
faulty - sync commit
1 parent fa53bcb commit d911f2d

File tree

11 files changed

+83
-17
lines changed

11 files changed

+83
-17
lines changed

client/src/App.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,17 @@ import HomePage from "./pages/HomePage/HomePage";
1212
import AuthPage from "./pages/AuthPage/AuthPage";
1313
import { useEffect } from "react";
1414
import { getTokenFromLocalStorage } from "./utils";
15-
import api, { setJwt } from "./api";
15+
import api, { clearJwt, setJwt } from "./api";
16+
import ProtectedRoute from "./common/ProtectedRoute";
17+
import DatabasesPage from "./pages/DatabasesPage/DatabasesPage";
1618

1719
export default function App() {
1820
const router = createBrowserRouter(
1921
createRoutesFromElements(
2022
<Route path="/" element={<Root />}>
2123
<Route index element={<HomePage />} />
2224
<Route path="/auth" element={<AuthPage />} />
25+
<ProtectedRoute path="/dashboard" element={<DatabasesPage />} />
2326
</Route>
2427
)
2528
);
@@ -45,7 +48,8 @@ async function checkAndValidateLocalToken() {
4548
const token = getTokenFromLocalStorage();
4649
if (token) {
4750
if (await api.validateToken(token)) {
48-
setJwt(token);
51+
return setJwt(token);
4952
}
53+
clearJwt();
5054
}
5155
}

client/src/api.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ export function clearJwt() {
2828
}
2929

3030
const api = {
31+
client: client,
32+
3133
async login(username: string, password: string) {
3234
const userData = (
3335
await client.post(
@@ -71,10 +73,10 @@ const api = {
7173
}
7274
},
7375

74-
logout() {
76+
async logout() {
7577
clearTokenFromLocalStorage();
7678
clearJwt();
77-
client.delete("/auth/logout");
79+
await client.delete("/auth/logout");
7880
window.location.reload();
7981
},
8082

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { ReactNode, useEffect } from "react";
2+
import { Route, useNavigate } from "react-router-dom";
3+
import api from "../api";
4+
5+
interface ProtectedRouteProps {
6+
element: ReactNode;
7+
path: string;
8+
}
9+
10+
export default function ProtectedRoute(props: ProtectedRouteProps) {
11+
const authTokenPresent = api.client.defaults.headers["Authorization"] != null;
12+
13+
return (
14+
<Route
15+
element={authTokenPresent ? props.element : <RedirectToAuth />}
16+
path={props.path}
17+
/>
18+
);
19+
}
20+
21+
function RedirectToAuth() {
22+
const navigate = useNavigate();
23+
24+
useEffect(() => {
25+
navigate("/auth");
26+
});
27+
28+
return <></>;
29+
}
Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Link } from "react-router-dom";
22
import Login from "./components/Login";
33
import Register from "./components/Register";
4+
import api from "../../api";
45

56
export default function AuthPage() {
67
return (
@@ -9,9 +10,19 @@ export default function AuthPage() {
910
<Register />
1011
<Login />
1112
</div>
12-
<Link to="/" className="bg-black px-4 py-1 rounded-md text-white">
13-
back
14-
</Link>
13+
<div className="flex justify-center gap-x-8">
14+
<Link to="/" className="bg-black px-4 py-1 rounded-md text-white">
15+
back
16+
</Link>
17+
<button
18+
onClick={async () => {
19+
await api.logout();
20+
}}
21+
className="bg-black px-4 py-1 rounded-md text-white"
22+
>
23+
Logout
24+
</button>
25+
</div>
1526
</>
1627
);
1728
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default function DatabasesPage() {
2+
return <div>DatabasesPage</div>;
3+
}

run.bat

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
@echo off
12
cd client
23
start cmd /c yarn dev
34
cd ../server
45
start cmd /c yarn dev
56
cd ..
7+
@echo on

server/src/middleware/auth.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Express, Request, Response, NextFunction } from "express";
22
import { getAuthToken } from "../../utils";
33
import jwt from "jsonwebtoken";
4+
import { User } from "../types/custom";
45

56
export function authorisedOnly(
67
req: Request,
@@ -13,7 +14,9 @@ export function authorisedOnly(
1314

1415
jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, user) => {
1516
if (err) return res.sendStatus(403);
16-
req.user = user as string;
17+
if (typeof user === "object") {
18+
if (req.user?.id && req.user.username) req.user = user as User;
19+
}
1720
next();
1821
});
1922
}

server/src/routes/auth.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,18 @@ router.post("/login", unauthorisedOnly, async (req, res) => {
4343
return res.sendStatus(401);
4444
}
4545

46-
const accessToken = generateAccessToken(userData);
46+
const user = { id: userData.id, username: userData.username };
47+
48+
const accessToken = jwt.sign(user, process.env.ACCESS_TOKEN_SECRET, {
49+
expiresIn: "20h",
50+
});
51+
4752
// const refreshToken = jwt.sign(user, process.env.REFRESH_TOKEN_SECRET);
4853
// refreshTokens.push(refreshToken);
4954

5055
res.status(200).json({ accessToken: accessToken });
5156
});
5257

53-
function generateAccessToken(user: { username: string }) {
54-
return jwt.sign(user, process.env.ACCESS_TOKEN_SECRET, { expiresIn: "20h" });
55-
}
56-
5758
router.post("/register", unauthorisedOnly, async (req, res) => {
5859
const { username, email, password } = req.body;
5960
try {

server/src/routes/user.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import express from "express";
2+
import { authorisedOnly } from "../middleware/auth";
3+
4+
const router = express.Router();
5+
6+
router.get("/name", authorisedOnly, (req, res) => {
7+
if (!req.user) return res.sendStatus(401);
8+
res.json({ name: req.user.username });
9+
});
10+
11+
export default router;

server/src/types/custom.d.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,5 @@ export type Language = (typeof SUPPORTED_LANGUAGES)[number];
44

55
export type User = {
66
id: number;
7-
name: string;
8-
surname: string;
9-
authenticationToken?: string | null;
7+
username: string;
108
};

0 commit comments

Comments
 (0)