125 lines
3.8 KiB
JavaScript
125 lines
3.8 KiB
JavaScript
const jwt = require('jsonwebtoken')
|
|
const User = require('./models/User')
|
|
const UserGPS = require('./models/GPS.User')
|
|
|
|
function res401(res, message) {
|
|
return res.status(401).json({ message })
|
|
}
|
|
|
|
const authentication = {
|
|
// secret for generating jwt token
|
|
secretKey:
|
|
'6fdd08afdb7ec5b7b83ba5d7635a4ad78a5c9545a9ccd90b0b74299b5ab3a69f640cdd1e0c47655daebe099c96e3172da9be76892f14ef2aec34937757c75f27',
|
|
// check if just logged in (admin-or-user) (middleware)
|
|
isLoggedIn(req, res, next) {
|
|
try {
|
|
const token = req.headers?.authorization
|
|
if (!token) throw new Error('err')
|
|
const decoded = jwt.verify(token.replace(/^Bearer\s/, ''), authentication.secretKey)
|
|
if (!decoded) throw new Error('err')
|
|
else return next()
|
|
} catch (err) {
|
|
return res401(res, 'unauthenticated')
|
|
}
|
|
},
|
|
// check if admin logged in (middleware)
|
|
async isAdmin(req, res, next) {
|
|
try {
|
|
const token = req.headers?.authorization
|
|
if (!token) throw new Error('err1')
|
|
|
|
const decoded = jwt.verify(token.replace(/^Bearer\s/, ''), authentication.secretKey)
|
|
if (!decoded) throw new Error('err2')
|
|
|
|
const user = await User.findById(decoded._id)
|
|
if (!user || !user.scope.includes('admin')) throw new Error('err3')
|
|
|
|
req.user_id = decoded._id
|
|
return next()
|
|
} catch (err) {
|
|
return res401(res, 'unauthorized')
|
|
}
|
|
},
|
|
// check if admin logged in (middleware)
|
|
async isGPS(req, res, next) {
|
|
try {
|
|
const token = req.headers?.authorization
|
|
if (!token) throw new Error('err1')
|
|
|
|
const decoded = jwt.verify(token.replace(/^Bearer\s/, ''), authentication.secretKey)
|
|
if (!decoded) throw new Error('err2')
|
|
|
|
const user = await UserGPS.findById(decoded._id)
|
|
if (!user || !user.active) throw new Error('err3')
|
|
|
|
req.user_id = decoded._id
|
|
return next()
|
|
} catch (err) {
|
|
return res401(res, 'unauthorized'+ err.message)
|
|
}
|
|
},
|
|
// check if user logged in (middleware)
|
|
async isUser(req, res, next) {
|
|
try {
|
|
const token = req.headers?.authorization
|
|
if (!token) throw new Error('err')
|
|
|
|
const decoded = jwt.verify(token.replace(/^Bearer\s/, ''), authentication.secretKey)
|
|
if (!decoded) throw new Error('err')
|
|
|
|
const user = await User.findById(decoded._id)
|
|
if (!user || !user.scope.includes('user')) throw new Error('err')
|
|
|
|
req.user_id = decoded._id
|
|
return next()
|
|
} catch (err) {
|
|
|
|
return res401(res, 'unauthorized')
|
|
}
|
|
},
|
|
// check if user is agent and add agent id to body(middleware)
|
|
async isAgent(req, res, next) {
|
|
try {
|
|
const token = req.headers?.authorization
|
|
if (!token) throw new Error('err')
|
|
|
|
const decoded = jwt.verify(token.replace(/^Bearer\s/, ''), authentication.secretKey)
|
|
if (!decoded) throw new Error('err')
|
|
|
|
const user = await User.findById(decoded._id)
|
|
if (!user || !user.isAgent || !user.scope.includes('user')) throw new Error('err')
|
|
|
|
req.user_id = decoded._id
|
|
req.agent_id = user.representation_id
|
|
return next()
|
|
} catch (err) {
|
|
return res401(res, '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 null
|
|
else return decoded._id
|
|
})
|
|
},
|
|
// check if admin has permission (middleware - web only)
|
|
hasPermission: permission => {
|
|
return async (req, res, next) => {
|
|
try {
|
|
const token = req.headers?.authorization
|
|
if (!token) throw new Error('err')
|
|
|
|
const user = await User.findOne({ token })
|
|
if (!user || !user.permissions.includes(permission)) throw new Error('err')
|
|
else return next()
|
|
} catch (err) {
|
|
return res401(res, 'unauthorized')
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = authentication
|