58 lines
1.6 KiB
JavaScript
58 lines
1.6 KiB
JavaScript
const jwt = require('jsonwebtoken');
|
|
const { DataTypes } = require('sequelize');
|
|
const { roles, defaultDangerKey } = require('../routes/users/authSettings');
|
|
const defineUser = require('../models/users');
|
|
|
|
function authMiddleware(sequelize) {
|
|
/**
|
|
* Verify user sined in
|
|
*
|
|
* If verification is successful, set userId in req.userId.
|
|
*/
|
|
function verifySignedIn(req, res, next) {
|
|
const authHeader = req.header('Authorization');
|
|
const secretKey = process.env.SECRET_KEY || defaultDangerKey;
|
|
|
|
const token = authHeader.split(' ')[1]; // delete 'Bearer '
|
|
if (!token) {
|
|
return res.status(401).json({ error: 'Access denied' });
|
|
}
|
|
|
|
try {
|
|
const decoded = jwt.verify(token, secretKey);
|
|
req.userId = decoded.userId;
|
|
next();
|
|
} catch (error) {
|
|
console.error('Token verification failed:', error);
|
|
res.status(401).json({ error: 'Invalid token' });
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Verify user is admin
|
|
* (have to be called after verifySignedIn() middleware)
|
|
*/
|
|
async function verifyAdmin(req, res, next) {
|
|
const User = defineUser(sequelize, DataTypes);
|
|
const user = await User.findByPk(req.userId);
|
|
if (!user) {
|
|
return res.status(404).send('User not found');
|
|
}
|
|
|
|
// if project is private, only project owner can access
|
|
const adminRoleIndex = roles.findIndex((entry) => entry.uid === 'administrator');
|
|
if (user.role !== adminRoleIndex) {
|
|
return res.status(403).json({ error: 'Forbidden' });
|
|
}
|
|
|
|
next();
|
|
}
|
|
|
|
return {
|
|
verifySignedIn,
|
|
verifyAdmin,
|
|
};
|
|
}
|
|
|
|
module.exports = authMiddleware;
|