-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathauth.js
More file actions
77 lines (68 loc) · 3.04 KB
/
auth.js
File metadata and controls
77 lines (68 loc) · 3.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
const jwt = require('jsonwebtoken');
const { StatusCodes } = require('http-status-codes');
const User = require('./models/user');
const dotenv = require('dotenv');
dotenv.config();
const generateAccessToken = (userId) => {
return jwt.sign({ id: userId }, process.env.JWT_SECRET, { expiresIn: process.env.JWT_ACCESS_EXPIRATION });
}
const ensureAuthorization = async (req, res, next) => {
try {
let receivedJwt = req.headers["authorization"];
if (!receivedJwt) {
return res.status(StatusCodes.UNAUTHORIZED).json({
message: "토큰이 제공되지 않았습니다."
});
}
let decodedJwt;
try {
decodedJwt = jwt.verify(receivedJwt, process.env.JWT_SECRET);
} catch (err) {
if (err instanceof jwt.TokenExpiredError) {
// Access Token이 만료된 경우
const refreshToken = req.cookies.refreshToken;
if (!refreshToken) {
return res.status(StatusCodes.UNAUTHORIZED).json({
message: "RefreshToken이 없습니다."
});
}
try {
const decodedRefreshToken = jwt.verify(refreshToken, process.env.JWT_SECRET);
const user = await User.findById(decodedRefreshToken.id);
if (!user || user.refreshToken !== refreshToken) {
return res.status(StatusCodes.UNAUTHORIZED).json({
message: "유효하지 않은 RefreshToken입니다."
});
}
// 새로운 Access Token 발급
const newAccessToken = generateAccessToken(user._id);
res.setHeader('Authorization', `${newAccessToken}`);
req.user = jwt.verify(newAccessToken, process.env.JWT_SECRET); // 새로운 토큰으로 검증
next();
return;
} catch (refreshError) {
console.log(refreshError);
return res.status(StatusCodes.UNAUTHORIZED).json({
message: "유효하지 않은 RefreshToken입니다."
});
}
} else if (err instanceof jwt.JsonWebTokenError) {
return res.status(StatusCodes.UNAUTHORIZED).json({
message: "유효하지 않은 AccessToken입니다."
});
} else {
return res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
message: "서버 오류"
});
}
}
req.user = decodedJwt; // 해독된 JWT 정보를 요청 객체에 추가
next(); // 다음 미들웨어로 제어를 넘김
} catch (authorizationError) {
console.log(authorizationError);
return res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
message: "서버 오류"
});
}
}
module.exports = ensureAuthorization;