节点js express4和护照js冗长登录

时间:2014-06-08 12:05:49

标签: node.js authentication express passport-local express-4

我使用带有护照js的快递4来处理用户的身份验证。 前端是Angular JS。

我基本上面临两个问题: 1-登录很长,登录需要15秒。 2-登录后,如果我重新启动节点js服务器并刷新页面,即使在浏览器中设置了cookie,我也会回到登录页面。

这就是我在后端的内容

 passport.serializeUser(function (user, done) {
        done(null, user._id);
    });

    passport.deserializeUser(function (id, done) {
        User.findById(id, function (err, user) {
            user.password = undefined;
             done(err, user);
        });
    });

    passport.use(new LocalStrategy(function (username, password, done) {
        User.findOne({ username: username }, function (err, user) {
            if (err) {
                return done(err);
            }
            if (!user) {
                return done(null, false, { message: messages['116']});
            }
             user.comparePassword(password, function (err, isMatch) {
                if (err) {
                    return done(err);
                }
                 if (isMatch) {
                    return done(null, user);
                } else {
                    return done(null, false, { message: messages['116']});
                }
            });
        });
    }));

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser('a very hard to guess string'));
app.use(session({
        secret: 'a very hard to guess string'
    }
));
app.use(passport.initialize());
app.use(passport.session());

以下是登录路线:

router.post('/signin', function (req, res, next) {
    var result = _.cloneDeep(SwissArmyKnife.resultObjSkel);

    var username = req.body.username;
    var password = req.body.password;

    if (_.isEmpty(username)) {
        result.error.reasons.push(SwissArmyKnife.messages['118']);
    }

    if (_.isEmpty(password)) {
        result.error.reasons.push(SwissArmyKnife.messages['119']);
    }

    if (!_.isEmpty(result.error.reasons)) {
        return res.json(200, result);
    }

    passport.authenticate('local', function (err, user, info) {
        if (err) {
            return next(err);
        }
        if (user) {
            req.login(user, function (err) {
                if (err) {
                    return next(err);
                }
                 result.result = true;
                return res.json(200, result);
            })
        }
        if (info) {
            result.error.reasons.push(info.message);
            return res.json(200, result);
        }
    })(req, res, next);
});

调试上面的代码时,我发现代码到达

时有很大的延迟
passport.authenticate('local', function (err, user, info) {

可能是什么问题??? 我做错了什么?

提前致谢。

1 个答案:

答案 0 :(得分:0)

重新启动服务器后看到登录页面的原因是因为您正在为会话使用内存存储。正如您已经注意到这只有很多用处,您应该使用一些持久性存储(例如redis)。