/** * 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;