TwoToc code
[YouAndWeb_TwoToc] / server / auth / auth.service.js
1 'use strict';
2
3 var passport = require('passport');
4 var config = require('../config/environment');
5 var jwt = require('jsonwebtoken');
6 var expressJwt = require('express-jwt');
7 var compose = require('composable-middleware');
8 var User = require('../api/user/user.model');
9 var validateJwt = expressJwt({
10   secret: config.secrets.session
11 });
12
13 /**
14  * Attaches the user object to the request if authenticated
15  * Otherwise returns 403
16  */
17 function isAuthenticated() {
18   return compose()
19     // Validate jwt
20     .use(function(req, res, next) {
21       // allow access_token to be passed through query parameter as well
22       if (req.query && req.query.hasOwnProperty('access_token')) {
23         req.headers.authorization = 'Bearer ' + req.query.access_token;
24       }
25       validateJwt(req, res, next);
26     })
27     // Attach user to request
28     .use(function(req, res, next) {
29       User.findByIdAsync(req.user._id)
30         .then(function(user) {
31           if (!user) {
32             return res.status(401).end();
33           }
34           req.user = user;
35           next();
36         })
37         .catch(function(err) {
38           return next(err);
39         });
40     });
41 }
42
43 /**
44  * Checks if the user role meets the minimum requirements of the route
45  */
46 function hasRole(roleRequired) {
47   if (!roleRequired) {
48     throw new Error('Required role needs to be set');
49   }
50
51   return compose()
52     .use(isAuthenticated())
53     .use(function meetsRequirements(req, res, next) {
54       if (config.userRoles.indexOf(req.user.role) >=
55           config.userRoles.indexOf(roleRequired)) {
56         next();
57       }
58       else {
59         res.status(403).send('Forbidden');
60       }
61     });
62 }
63
64 /**
65  * Returns a jwt token signed by the app secret
66  */
67 function signToken(id, role) {
68   return jwt.sign({ _id: id, role: role }, config.secrets.session, {
69     expiresInMinutes: 60 * 5
70   });
71 }
72
73 /**
74  * Set token cookie directly for oAuth strategies
75  */
76 function setTokenCookie(req, res) {
77   if (!req.user) {
78     return res.status(404).send('Something went wrong, please try again.');
79   }
80   var token = signToken(req.user._id, req.user.role);
81   res.cookie('token', JSON.stringify(token));
82   res.redirect('/');
83 }
84
85 exports.isAuthenticated = isAuthenticated;
86 exports.hasRole = hasRole;
87 exports.signToken = signToken;
88 exports.setTokenCookie = setTokenCookie;