【问题标题】:NodeJS app using CSRF for web and JWT for API does async.parallel out of order使用 CSRF for Web 和 JWT for API 的 NodeJS 应用程序执行 async.parallel 乱序
【发布时间】:2018-05-07 12:43:06
【问题描述】:

当登录用户使用 EJS 通过浏览器访问页面时,我可以让函数完成它应该做的事情,但是当我使用带有 JWT 的登录用户使用 Ionic 的 API 时,@ 987654321@ 函数不会“等待”按顺序执行操作。

这是我的功能:

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,但是当我使用 JWT 通过 API 登录时,我得到 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;

这是我使用 CSRF 的 EJS 和使用 JWT 的 API 的登录功能:

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;

【问题讨论】:

    标签: node.js jwt csrf


    【解决方案1】:

    我发现了我的问题。我在回拨时错过了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');
    })
    

    【讨论】:

      猜你喜欢
      • 2013-04-28
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 2018-11-24
      • 2017-06-17
      • 2021-01-19
      相关资源
      最近更新 更多