/** * Adds the given scope to the array in req.auth if the user has sufficient * permissions. Otherwise rejects the request. */ function requireAuth(scope) { let checkScopes if (scope.includes(".")) { const parts = scope.split(".") checkScopes = scopes => parts.reduce((memo, part) => memo && memo[part], scopes) != null } else { checkScopes = scopes => scopes[scope] != null } return function(req, res, next) { if (req.auth && req.auth.includes(scope)) { return next() // Already auth'd } const user = req.user if (!user) { return res.status(403).send({ error: "Missing auth token" }) } if (!user.scopes || !checkScopes(user.scopes)) { return res.status(403).send({ error: "Insufficient scopes" }) } if (req.auth) { req.auth.push(scope) } else { req.auth = [scope] } next() } } module.exports = requireAuth