92 lines
3.5 KiB
JavaScript
92 lines
3.5 KiB
JavaScript
const jwt = require('jsonwebtoken')
|
|
const User = require('./models/User')
|
|
|
|
const authentication = {
|
|
// secret for generating jwt token
|
|
secretKey: '6fe26a8a97c5815f00c14acca4137ec6c466dd75985168b3627ebf08b2dfd7f42ee69a322af6e3fd6dfe48ce747f3ca65a8765db425e602e08178a104e725ff9',
|
|
// check if just logged in (admin-or-user) (middleware)
|
|
isLoggedIn: function (req, res, next) {
|
|
const token = req.headers.authorization
|
|
if (token) {
|
|
// check if token is not destroyed
|
|
User.findOne({token: token}, (err, user) => {
|
|
if (err) throw err
|
|
if (user) {
|
|
// verifies secret and checks if the token is expired
|
|
jwt.verify(user.token.replace(/^Bearer\s/, ''), authentication.secretKey, (err, decoded) => {
|
|
if (err) return res.status(401).json({message: 'unauthorized'})
|
|
else return next()
|
|
})
|
|
} else return res.status(401).json({message: 'unauthorized'})
|
|
})
|
|
} else {
|
|
return res.status(401).json({message: 'unauthorized'})
|
|
}
|
|
},
|
|
// check if admin logged in (middleware)
|
|
isAdmin: function (req, res, next) {
|
|
const token = req?.headers?.authorization?.replace(/^Bearer\s/, '')
|
|
if (token) {
|
|
// check if token is not destroyed
|
|
User.findOne({token: token}, (err, user) => {
|
|
if (err) throw err
|
|
if (user) {
|
|
// verifies secret and checks if the token is expired
|
|
jwt.verify(user.token.replace(/^Bearer\s/, ''), authentication.secretKey, (err, decoded) => {
|
|
if (err || !user.scope.includes('admin')) return res.status(401).json({message: 'unauthorized'})
|
|
else return next()
|
|
})
|
|
} else return res.status(401).json({message: 'unauthorized'})
|
|
})
|
|
} else {
|
|
return res.status(401).json({message: 'unauthorized'})
|
|
}
|
|
},
|
|
// check if admin logged in (middleware)
|
|
isUser: function (req, res, next) {
|
|
const token = req.headers.authorization
|
|
if (token) {
|
|
// check if token is not destroyed
|
|
User.findOne({token: token}, (err, user) => {
|
|
if (err) throw err
|
|
if (user) {
|
|
// verifies secret and checks if the token is expired
|
|
jwt.verify(user.token.replace(/^Bearer\s/, ''), authentication.secretKey, (err, decoded) => {
|
|
if (err || !user.scope.includes('user')) return res.status(401).json({message: 'unauthorized'})
|
|
else return next()
|
|
})
|
|
} else return res.status(401).json({message: 'unauthorized'})
|
|
})
|
|
} else {
|
|
return res.status(401).json({message: 'unauthorized'})
|
|
}
|
|
},
|
|
// get user id from token
|
|
getID: (req) => {
|
|
const token = req.headers.authorization
|
|
return jwt.verify(token.replace(/^Bearer\s/, ''), authentication.secretKey, (err, decoded) => {
|
|
if (err) return 'unauthorized'
|
|
else return decoded._id
|
|
})
|
|
},
|
|
// check if user has permission (middleware)
|
|
hasPermission: (permission) => {
|
|
return (req, res, next) => {
|
|
const token = req.headers.authorization
|
|
if (token) {
|
|
// check if token is not destroyed
|
|
User.findOne({token: token}, (err, user) => {
|
|
if (err || !user) return res.status(401).json({message: 'unauthorized'})
|
|
if (user.permissions.includes('super-admin')) return next()
|
|
if (!user.permissions.includes(permission)) return res.status(401).json({message: 'unauthorized'})
|
|
else return next()
|
|
})
|
|
} else {
|
|
return res.status(401).json({message: 'unauthorized'})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = authentication
|