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