-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathauth.js
74 lines (66 loc) · 1.88 KB
/
auth.js
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
import jwt from 'jsonwebtoken';
import asyncHandler from './async.js';
import ErrorResponse from '../utils/errorResponse.js';
import User from '../models/User.js';
// Protect routes
const protect = asyncHandler(async (req, res, next) => {
let token;
// Check if the token is present in the request headers
if (
req.headers.authorization &&
req.headers.authorization.startsWith('Bearer')
) {
token = req.headers.authorization.split(' ')[1];
} else if (req.cookies.token) {
token = req.cookies.token;
}
// Make sure token exists
if (!token) {
return next(new ErrorResponse('Unable to access this route', 401));
}
try {
// Verify Token
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = await User.findById(decoded.id);
next();
} catch (error) {
return next(new ErrorResponse('Unable to access this route', 401));
}
});
// Grant access to the specific roles
const authorize = asyncHandler(async (req, res, next) => {
const userRole = req.user.role;
if (!(userRole == 'publisher' || userRole == 'admin')) {
return next(
new ErrorResponse(
`Access Denied: Only publisher or admin can perform this operation`,
403
)
);
}
next();
});
// Grant access to the specific roles
const isAdmin = asyncHandler(async (req, res, next) => {
const userRole = req.user.role;
if (!(userRole == 'admin')) {
return next(
new ErrorResponse(`Access Denied: Only admin can access this route`, 401)
);
}
next();
});
// Grant access to the specific roles
const isUser = asyncHandler(async (req, res, next) => {
const userRole = req.user.role;
if (!(userRole == 'user' || userRole == 'admin')) {
return next(
new ErrorResponse(
`Access Denied: Only user or admin can access this route`,
401
)
);
}
next();
});
export { protect, authorize, isAdmin, isUser };