Приложение NodeJS, использующее CSRF для Интернета и JWT для API, выполняет async.parallel из строя - PullRequest
0 голосов
/ 06 мая 2018

Когда вошедший в систему пользователь попадает на страницу через браузер, используя EJS, я могу получить функцию, которая делает то, что он должен, но когда я использую API с Ionic, используя вошедшего в систему пользователя с JWT, async.parallel функция не «ждет», чтобы сделать все по порядку.

Вот моя функция:

console.log('1');
    async.parallel([
        function(callback){
            buildAlertButtonsArray.getRealTestAlerts(req,function(arrayAlerts) {
                console.log('2');
                callback(null, arrayAlerts);
            });
        },
        function(callback) {
            if(req.decoded)   //API
                callback('API');
            else    //EJS
                functions.aclSideMenu(req, res, function (acl) {callback(null, acl);}); //aclPermissions sideMenu
        }

],function(err, results){
    console.log('3');
})

когда я вхожу через просмотр на моем console.log(), это 1, 2, 3, но когда я вхожу через API с использованием JWT, я получаю 1, 3, 2.

Вот мой app.js:

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var app = express();
var bluebird = require('bluebird');
//me
var mongoose =  require('mongoose');
var db = mongoose.connection;
var cors = require('cors');
var session = require('client-sessions');
var flash = require('express-flash');

//.js file
var routesApi = require('./routes/api');
var routesEjs = require('./routes/ejs');
var routes = require('./routes/index');

//var login = require('./routes/authentication/login');
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(cookieParser());

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(express.static(path.join(__dirname, 'public')));

app.use(bodyParser.urlencoded({ extended: true })); //was FALSE by default. was TRUE for auth Template

// middleware
app.use(session({
    cookieName: 'session',
    secret: 'mysecret',
    duration: 30 * 60 * 1000,
    activeDuration: 30 * 60 * 1000,
    httpOnly: true, //doesn't let javascript access cookies ever
    secure: true, // only use cookies over https
    ephemeral: true // delete this cookie when the browser is closed (nice when people use public computers)
}));

app.use(flash());
app.use(function(req, res, next){
    res.locals.success_messages = req.flash('success_messages');
    res.locals.error_messages = req.flash('error_messages');
    next();
});

// use cors
app.use(cors());

app.use('/public', express.static(path.join(__dirname, 'public')));

app.use('/api', routesApi);
app.use('/', routes);
app.use('/', routesEjs);

//bluebird
mongoose.Promise = require('bluebird');

//connecting to database

mongoose.connect('mongodb://myip:2999/SMECS_database', { useMongoClient: true });

//if we connect successfully or if a connection error occurs
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function (callback) {
    // yay!
});

// error handlers

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});

module.exports = app;

Вот моя функция входа в систему для EJS, использующего CSRF, и API, использующего JWT:

module.exports.postLogin = function(req, res, next) {
    if (req.body.pushToken) { // run SMECS API
        models.Users.findOne({
            email: req.body.email.toLowerCase()
        }, function (err, user) {

            if (err) throw err;

            if (!user) {
                res.json({success: false, message: 'Authentication failed. User not found.'});
            } else if (user) {

                //check if password matches
                if (!bcrypt.compareSync(req.body.pin, user.pin)) {
                    res.json({success: false, message: 'Authentication failed. Wrong password.'});
                } else {
                    // if user is found and password is right
                    // create a token
                    var token = jwt.sign({user: user}, config.secret, {
                        //expiresIn: 1440 // expires in 24 hours
                    });
                    user.save(function (err) {
                        if (err) {
                            res.json({
                                success: false,
                                message: 'contact your system administrator. pushToken not saved'
                            });
                        } else {
                            // return the information including token as JSON
                            res.json({
                                success: true,
                                message: 'Welcome aboard!',
                                token: token,
                                userRoleID: user.userRoleID,
                                userRoleName: user.userRoleName,
                                userPrivilegeID: user.userPrivilegeID,
                                userPrivilegeName: user.userPrivilegeName,
                                firstName: user.firstName,
                                lastName: user.lastName,
                                email: user.email
                            });
                        }
                    });


                }
            }
        });
    }
    else { //run SMECS EJS

        models.Users.findOne({email: req.body.email.toLowerCase()}, function (err, user) {
            if (!user || user.softDeleted !== null) {
                //Parent Self Registration Login
                models.ParentSelfRegistration.findOne({email: req.body.email.toLowerCase()}, function (err, parentSelfRegistration) {
                    if (!parentSelfRegistration) {
                        res.render('login', {error: "ERROR: Incorrect email or pin.", csrfToken: req.csrfToken()});
                    } else {
                        if (req.body.pin == parentSelfRegistration.pin) {
                            req.session.user = parentSelfRegistration;
                            res.redirect('/parentsSelfRegistration/registerParentStep1');
                        } else {
                            res.render('login', {error: "ERROR: Incorrect email or pin.", csrfToken: req.csrfToken()});
                        }
                    }
                });
                //END OF checks for users in UtilityUsers database
            } else {
                if (bcrypt.compareSync(req.body.pin, user.pin)) { // if user is found and password is right
                    req.session.user = user;
                    res.redirect('/dashboard');
                    //}
                } else {
                    //res.status(400).send('Current password does not match');
                    res.render('login', {error: "ERROR: Incorrect email or pin.", csrfToken: req.csrfToken()});
                    //res.render('login', { error: "ERROR: Incorrect email or pin."});
                }
            }
        });
    }
};

Вот мой файл ejs.js:

//Dependencies
var express = require('express');
var routerEjs = express.Router();
var login = require('./authentication/login');
var auth = require('./authentication/auth');
var chooseAlert = require('./alerts/sendingReceiving/1.chooseAlert');


var login = require('./authentication/login');
var csrf = require('csurf');

routerEjs.use(csrf());


/* GET login page. */
routerEjs.get('/login', login.getLogin, function(req, res) {});
routerEjs.post('/login', login.postLogin, function(req, res) {});
routerEjs.get('/logout', login.getLogout, function(req, res) {});

module.exports = routerEjs;

и мой файл api.js:

//Dependencies
var express = require('express');
var routerApi = express.Router();
var login = require('./authentication/login');
var auth = require('./authentication/auth');
var chooseAlert = require('./alerts/sendingReceiving/1.chooseAlert');


routerApi.post('/login', login.postLogin, function(req, res) {});
routerApi.get('/chooseGroup', auth.auth, chooseAlert.showGroups, function(req, res) {});

routerApi.get('/alerts/sending/chooseAlert', auth.auth, chooseAlert.showAlerts, function(req, res) {});


/* Update pushToken ------------------------------------*/
routerApi.post('/updatePushToken', auth.auth, auth.pin, function(req, res) {});


module.exports = routerApi;

1 Ответ

0 голосов
/ 07 мая 2018

Я разобрался в своей проблеме. Мне не хватало NULL в моем обратном вызове ...

console.log('1');
    async.parallel([
        function(callback){
            buildAlertButtonsArray.getRealTestAlerts(req,function(arrayAlerts) {
                console.log('2');
                callback(null, arrayAlerts);
            });
        },
        function(callback) {
            if(req.decoded)   //API
                callback(NULL, 'API');
            else    //EJS
                functions.aclSideMenu(req, res, function (acl) {callback(null, acl);}); //aclPermissions sideMenu
        }

],function(err, results){
    console.log('3');
})
...