Skip to content

Commit e4dd8be

Browse files
committed
create socket authentication middleware
1 parent aa06038 commit e4dd8be

File tree

18 files changed

+87
-74
lines changed

18 files changed

+87
-74
lines changed

client/src/components/CreateRoomDrawer.jsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ export default function CreateRoomDrawer(props) {
5858
let newRoom = {
5959
name: roomName,
6060
nicknames: checkedUsers,
61-
token: localStorage.getItem("token"),
6261
};
6362
socket.emit("create-room", newRoom);
6463
setOpenCreateRoom(false);

client/src/components/MenuButton.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,15 @@ import "../styles/MenuButton.css";
1212

1313
export default function MenuButton() {
1414
const { setOpenSetting, setOpenCreateRoom } = useContext(MenuContext);
15-
const { socket } = useContext(SocketContext);
15+
const { socket, setToken } = useContext(SocketContext);
1616
const navigate = useNavigate();
1717
const dispatch = useDispatch();
1818

1919
const handleLogout = () => {
2020
localStorage.removeItem("token");
2121
dispatch(resetChatState());
2222
dispatch(resetSidebarState());
23+
setToken("");
2324
socket.close();
2425
navigate("/login");
2526
};

client/src/components/MoreButton.jsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ export default function MoreButton() {
2222
const handleLeaveRoom = () => {
2323
let roomContent = {
2424
room: selectedChat,
25-
token: localStorage.getItem("token"),
2625
};
2726
socket.emit("leave-room", roomContent);
2827
dispatch(changeSelectedChat("Public"));

client/src/contexts/messageContext.jsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ function MessageProvider(props) {
2828
socket.emit("chat-message", {
2929
to: chat,
3030
message: message,
31-
token: localStorage.getItem("token"),
3231
});
3332

3433
setMessage("");

client/src/contexts/socketContext.jsx

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,32 @@
11
import { io } from "socket.io-client";
2-
import { createContext } from "react";
2+
import { useState, createContext, useEffect } from "react";
33

44
export const SocketContext = createContext();
55

6-
const socket =
7-
process.env.NODE_ENV === "production"
8-
? io({
9-
autoConnect: false,
10-
})
11-
: io(process.env.REACT_APP_API_BASE, {
12-
autoConnect: false,
13-
});
14-
156
function SocketProvider(props) {
7+
const [token, setToken] = useState("");
8+
9+
const socketOptions = {
10+
autoConnect: false,
11+
auth: {
12+
token: token,
13+
},
14+
};
15+
16+
const handleNewSocket = () =>
17+
process.env.NODE_ENV === "production"
18+
? io(socketOptions)
19+
: io(process.env.REACT_APP_API_BASE, socketOptions);
20+
21+
const [socket, setSocket] = useState(handleNewSocket);
22+
23+
useEffect(() => {
24+
socketOptions.auth.token = token;
25+
setSocket(handleNewSocket);
26+
}, [token]);
27+
1628
return (
17-
<SocketContext.Provider value={{ socket }}>
29+
<SocketContext.Provider value={{ socket, setToken }}>
1830
{props.children}
1931
</SocketContext.Provider>
2032
);

client/src/pages/Home.jsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import "../styles/Home.css";
2121
function Home() {
2222
const dispatch = useDispatch();
2323
const navigate = useNavigate();
24-
const { socket } = useContext(SocketContext);
24+
const { socket, setToken } = useContext(SocketContext);
2525
const [loader, setLoader] = useState(false);
2626
const [settingDrawerWidth, setSettingDrawerWidth] = useState("0");
2727
const sidebarRef = useRef();
@@ -56,8 +56,9 @@ function Home() {
5656
dispatch(changeNickname(result.nickname));
5757
dispatch(changeAvatar(result.avatar));
5858
dispatch(changeAboutMe(result.aboutMe));
59+
setToken(token);
5960
socket.connect();
60-
socket.emit("new-user", token);
61+
socket.emit("new-user");
6162
setLoader(false);
6263
})
6364
.catch((error) => {

controllers/userController.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const updateAvatar = async (req,res) => {
2727
let nickname = req.userClaims.nickname;
2828

2929
let url = await userService.updateAvatar(image, nickname);
30-
await userService.updateUserAvatarUrl(url, nickname);
30+
await userService.updateUserAvatar(url, nickname);
3131

3232
res.json({success: true, message: "You updated your profile photo successfully!", url: url});
3333
}

helpers/color.js

Lines changed: 0 additions & 12 deletions
This file was deleted.

middleware/authMiddleware.js

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
const userService = require('../services/userService');
33

4-
module.exports = async (req, res, next) => {
4+
const apiAuth = async (req, res, next) => {
55
let token = req.headers.authorization;
66
if(!token)
77
return res.status(401).send({ success: false, code: "token-required", message: "Token is required!" });
@@ -13,9 +13,36 @@ module.exports = async (req, res, next) => {
1313
var userDetails = await userService.getUserByNickname(verifiedNickname);
1414
req.userClaims = {
1515
nickname: verifiedNickname,
16-
avatar: userDetails.avatarURL,
16+
avatar: userDetails.avatar,
1717
aboutMe: userDetails.aboutMe
1818
}
1919

2020
next();
21+
}
22+
23+
const socketAuth = async (socket, next) => {
24+
let token = socket.handshake.auth.token;
25+
if(!token){
26+
socket.emit("new-user-error", "unauthorized-token");
27+
return;
28+
}
29+
30+
let verifiedNickname = await userService.getNicknameByToken(token);
31+
if(!verifiedNickname) {
32+
socket.emit("new-user-error", "unauthorized-token");
33+
return;
34+
}
35+
36+
var userInformation = await userService.getUserByNickname(verifiedNickname);
37+
38+
socket.userClaims = {
39+
nickname: verifiedNickname,
40+
avatar: userInformation.avatar
41+
};
42+
next();
43+
}
44+
45+
module.exports = {
46+
apiAuth,
47+
socketAuth
2148
}

routes/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ const express = require('express');
22
const authRoutes = require('./authRoutes');
33
const userRoutes = require('./userRoutes');
44
const chatRoutes = require('./chatRoutes');
5-
const authMiddleware = require('../middleware/authMiddleware')
5+
const authMiddleware = require('../middleware/authMiddleware');
66

77
const router = express.Router();
88

99
router.use('/auth', authRoutes);
10-
router.use('/user', authMiddleware, userRoutes);
11-
router.use('/chat', authMiddleware, chatRoutes);
10+
router.use('/user', authMiddleware.apiAuth, userRoutes);
11+
router.use('/chat', authMiddleware.apiAuth, chatRoutes);
1212

1313
module.exports = router;

0 commit comments

Comments
 (0)