Skip to content

Commit d779f5c

Browse files
Merge pull request #22 from CS3219-AY2425S1/login-frontend
Fix access without token issue
2 parents d55228d + bd9d61b commit d779f5c

File tree

4 files changed

+63
-5
lines changed

4 files changed

+63
-5
lines changed

Frontend/src/App.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import './App.css';
22
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
33
import 'bootstrap/dist/css/bootstrap.min.css';
4-
import CreateQn from './components/question/CreateQn';
5-
import EditQn from './components/question/EditQn';
64
import Home from './components/Home';
75
import Login from './components/auth/Login';
86
import SignUp from './components/auth/SignUp';
7+
import ProtectedRoute from './components/routes/ProtectedRoute';
98

109
function App() {
1110
return (
@@ -22,7 +21,7 @@ function App() {
2221
<Route path='/signup' element={<SignUp />} />
2322

2423
{/* Home page route */}
25-
<Route path='/home' element={<Home />} />
24+
<Route path='/home' element={<ProtectedRoute><Home /></ProtectedRoute>} />
2625
</Routes>
2726
</BrowserRouter>
2827
</div>

Frontend/src/components/auth/Login.jsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,15 @@ const Login = () => {
2323
.then(result => {
2424
// navigate to home page if successful
2525
console.log(result);
26-
navigate('/home')
26+
const jwt_token = result.data.data.accessToken;
27+
28+
if (jwt_token) {
29+
sessionStorage.setItem('jwt_token', jwt_token);
30+
navigate('/home');
31+
} else {
32+
setError('Token not found, authentication failed.');
33+
}
34+
2735
})
2836
.catch(e => {
2937
// handle errors here
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import React, { useEffect, useState } from 'react';
2+
import {Navigate} from 'react-router-dom';
3+
import userService from '../../services/users';
4+
5+
const Loading = () => {
6+
return (
7+
<div className="d-flex flex-column justify-content-center align-items-center" style={{ minHeight: '100vh' }}>
8+
<div className="spinner-border text-primary" role="status" style={{ width: '3rem', height: '3rem' }}>
9+
</div>
10+
<p className="mt-3">Loading, please wait...</p>
11+
</div>
12+
)
13+
}
14+
15+
const ProtectedRoute = ({ children }) => {
16+
const [isAuthenticated, setIsAuthenticated] = useState(null);
17+
18+
useEffect(() => {
19+
const token = sessionStorage.getItem('jwt_token');
20+
const authHeader = {
21+
headers: {
22+
'Authorization': `Bearer ${token}`,
23+
},
24+
};
25+
26+
// verify token asynchronously, set auth status only after request completes
27+
userService.verifyToken(authHeader)
28+
.then(response => {
29+
console.log(response);
30+
setIsAuthenticated(true);
31+
})
32+
.catch(e => {
33+
console.log('Error:', e);
34+
setIsAuthenticated(false);
35+
});
36+
}, []);
37+
38+
// To wait for isAuth to generate, render loading spinner
39+
if (isAuthenticated == null) {
40+
return <Loading/>;
41+
}
42+
43+
return isAuthenticated ? children : <Navigate to="/login"/>
44+
}
45+
46+
export default ProtectedRoute;

Frontend/src/services/users.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,9 @@ const loginUser = async (userCredentials) => {
1919
return response;
2020
}
2121

22-
export default { createUser, getUser, loginUser };
22+
const verifyToken = async (authHeader) => {
23+
const response = await axios.get(`${baseUrl}/${auth}/verify-token`, authHeader);
24+
return response;
25+
}
26+
27+
export default { createUser, getUser, loginUser, verifyToken };

0 commit comments

Comments
 (0)